twitter oauth を試行するときに承認を取得する
概要
Twitter ouath 経由のログインを使用できるように Rails 7 アプリを設定しようとしています。ログインボタンをクリックすると、このエラーが発生します。 v1 と v2 の認証情報を使用してみました。
COULD NOT AUTHENTICATE YOU FROM TWITTER BECAUSE "401 UNAUTHORIZED".
# AUTHENTICATION
gem 'activerecord-session_store'
gem 'devise'
gem 'devise-jwt'
gem 'devise_zxcvbn'
gem 'omniauth'
gem 'omniauth-rails_csrf_protection'
gem 'omniauth-twitter'
= link_to 'Sign in with Twitter', user_twitter_omniauth_authorize_path, class: 'btn btn-info default w-100', id: 'twitter-login', method: :post
module Users
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def twitter
# You need to implement the method below in your model (e.g. app/models/user.rb)
@user = User.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
sign_in_and_redirect @user, event: :authentication # this will throw if @user is not activated
set_flash_message(:notice, :success, kind: 'Twitter') if is_navigational_format?
else
session['devise.twitter_data'] = request.env['omniauth.auth'].except('extra')
redirect_to we_vote_root_url
end
end
def failure
set_flash_message(:alert, :failure, kind: 'Twitter', reason: failure_message) if is_navigational_format?
redirect_to new_user_session_path
end
end
end
config.omniauth :twitter, Rails.application.credentials.dig(:twitter, :api_key), Rails.application.credentials.dig(:twitter, :api_key_secret)
def self.from_omniauth(auth)
password = Devise.friendly_token[0, 20]
identity = Identity.find_for_oauth(auth)
user = identity.user
user ||= User.find_or_initialize_by(email: auth.info.email)
user.first_name = auth.info.name.split[0] unless auth.info.name.split.empty?
user.last_name = auth.info.name.split[1] if auth.info.name.split.length > 1
user.phone_number ||= auth.info.phone_number
file = URI.open(auth.info.image)
user.avatar.attach(io: file, filename: 'avatar.png', content_type: 'image/png')
user.skip_confirmation!
if user.encrypted_password.blank?
user.password = password
user.password_confirmation = password
end
user.save!
identity.update(user: user) if identity.user.nil?
user
end
http://localhost:3000/auth/twitter
http://localhost:3000/users/auth/twitter/callback
http://localhost:3000/auth/twitter/callback
http://localhost:3000/users/auth/twitter
解決策
ngrok を使用して問題を解決する ここで見ることができます