Techioz Blog

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 を使用して問題を解決する ここで見ることができます