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)を再起動させましたが、エラーは解決されませんでした。
問題点が分かる方がいらっしゃいましたら、是非お力を貸していただければと思います。