wa-yu_snj
@wa-yu_snj (わーゆ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Twitterログイン 機能で、OAuth::Unauthorized 400 Bad Requestに遭遇しています

解決したいこと

Ruby on Railsでイベントを作成、閲覧出来るアプリを作っています。
Twitterアカウントを使ったログイン機能があるのですが、本番環境(AWS)で上手く動作しない為、お力添えをいただければと思います。

発生している問題・エラー

I, [2020-10-19T11:40:10.745255 #396]  INFO -- : [68b8c303-a577-4553-8fb0-6b777ca2a458] Started POST "/users/auth/twitter" for 133.200.208.192 at 2020-10-19 11:40:10 +0000
F, [2020-10-19T11:40:10.883272 #396] FATAL -- : [68b8c303-a577-4553-8fb0-6b777ca2a458]   
[68b8c303-a577-4553-8fb0-6b777ca2a458] OAuth::Unauthorized (400 Bad Request):
[68b8c303-a577-4553-8fb0-6b777ca2a458]   
[68b8c303-a577-4553-8fb0-6b777ca2a458] oauth (0.5.4) lib/oauth/consumer.rb:236:in `token_request'
[68b8c303-a577-4553-8fb0-6b777ca2a458] oauth (0.5.4) lib/oauth/consumer.rb:155:in `get_request_token'
[68b8c303-a577-4553-8fb0-6b777ca2a458] omniauth-oauth (1.1.0) lib/omniauth/strategies/oauth.rb:28:in `request_phase'
[68b8c303-a577-4553-8fb0-6b777ca2a458] omniauth-twitter (1.4.0) lib/omniauth/strategies/twitter.rb:61:in `request_phase'
[68b8c303-a577-4553-8fb0-6b777ca2a458] omniauth (1.9.1) lib/omniauth/strategy.rb:226:in `request_call'
[68b8c303-a577-4553-8fb0-6b777ca2a458] omniauth (1.9.1) lib/omniauth/strategy.rb:188:in `call!'
[68b8c303-a577-4553-8fb0-6b777ca2a458] omniauth (1.9.1) lib/omniauth/strategy.rb:169:in `call'
[68b8c303-a577-4553-8fb0-6b777ca2a458] warden (1.2.8) lib/warden/manager.rb:36:in `block in call'
[68b8c303-a577-4553-8fb0-6b777ca2a458] warden (1.2.8) lib/warden/manager.rb:34:in `catch'
[68b8c303-a577-4553-8fb0-6b777ca2a458] warden (1.2.8) lib/warden/manager.rb:34:in `call'
[68b8c303-a577-4553-8fb0-6b777ca2a458] rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
:

該当するソースコード

config/initializers/devise.rb

Devise.setup do |config|
  config.omniauth :twitter,ENV['TWITTER_API_KEY'],ENV['TWITTER_API_SECRET']
end

Gemfile

gem 'omniauth-twitter'
gem 'dotenv-rails'

.env

TWITTER_API_KEY='<キーが入力されています>'
TWITTER_API_SECRET='<キーが入力されています>'

app/models/user.rb

def self.from_omniauth(auth)
    sns = SnsCredential.where(provider: auth.provider, uid: auth.uid).first_or_create

    user = User.where(email: auth.info.email).first_or_initialize(
      name: auth.info.name,
      nickname: auth.info.nickname,
      email: auth.info.email,
      image: auth.info.image.gsub(/_normal/, ''),

    )

    if user.persisted?
      sns.user = user
      sns.save
    end
    { user: user, sns: sns }
 end

app/controllers/users/omniauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def twitter 
    authorization
  end

  private

  def authorization
    sns_info = User.from_omniauth(request.env['omniauth.auth'])
    @user = sns_info[:user]

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
    else
      @sns_id = sns_info[:sns].id
      render template: 'devise/registrations/new'
    end
  end
end

app/controllers/users/registrations_controller.rb

 def create
   if params[:sns_auth] == 'true'
     pass = Devise.friendly_token
     params[:user][:password] = pass
     params[:user][:password_confirmation] = pass
   end
   super
 end

前提条件

・本番環境はAWS
・開発環境では問題なくサインアップ・ログインが出来ている
・Developer PortalのCallback URLsには、以下二つが記載されている
  http://<本番環境のIPアドレス>/users/auth/twitter/callback
  http://<本番環境のIPアドレス>/users/omniauth_callbacks
・ものすごく助けて欲しい

自分で試したこと

開発環境で動作している事から、アプリケーション内の問題ではないと考え、環境変数が読み取れていないと仮説を立てました。
.envはgithubにプッシュされない事から、ec2サーバー内で環境変数を設定すれば良いと思い、実際に環境変数を設定し、env | grep コマンドで、設定できている事は確認。その後サーバー(unicorn)を再起動させましたが、エラーは解決されませんでした。

問題点が分かる方がいらっしゃいましたら、是非お力を貸していただければと思います。

0

1Answer

Callback URLsはTwitterからアクセスできる状態なんでしょうか。(EC2のセキュリティグループで弾かれてるとか…)

1Like

Comments

  1. @wa-yu_snj

    Questioner

    回答ありがとうございます。
    ビューの手直し等、今回の件と関係のないコードを変更して反映させていたら、動作するようになっていました。原因がわからず気持ち悪いですが…、お時間いただきありがとうございました!

Your answer might help someone💌