質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

解決済

sorceryでのTwitter認証 OAuth::Unauthorized - 401 Unauthorized:

okada_3030
okada_3030

総合スコア9

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

1回答

0リアクション

0クリップ

154閲覧

投稿2022/08/15 09:12

前提

sorceryでtwitter認証をしようとして、 401 Unauthorizedというエラーが発生しました.
process_callback(params, session)メソッド内のget_access_token(args)エラーが発生してることが分かり、sessionが取得できてないことがエラーの原因かと考えました。どのようにすれば取得できるか教えて頂きたいです。よろしくお願いします。

実現したいこと

  • Twitterアカウントでのログイン

発生している問題・エラーメッセージ

OAuth::Unauthorized - 401 Unauthorized: app/controllers/oauths_controller.rb:14:in `callback'

該当のソースコード

ruby

class OauthsController < ApplicationController skip_before_action :require_login, raise: false # sends the user on a trip to the provider, # and after authorizing there back to the callback url. def oauth login_at(params[:provider]) end def callback provider = params[:provider] debugger if @user = login_from(provider) redirect_to root_path, notice: "#{provider.titleize}でログインしました" else begin @user = create_from(provider) # NOTE: this is the place to add '@user.activate!' if you are using user_activation submodule reset_session # protect from session fixation attack auto_login(@user) redirect_to root_path, notice: "#{provider.titleize}でログインしました" rescue redirect_to root_path, alert: "#{provider.titleize}でのログインに失敗しました" end end end #example for Rails 4: add private method below and use "auth_params[:provider]" in place of #"params[:provider] above. private def auth_params params.permit(:code, :provider) end end

ruby

class Authentication < ApplicationRecord belongs_to :user end

ruby

class User < ApplicationRecord authenticates_with_sorcery has_many :authentications, dependent: :destroy accepts_nested_attributes_for :authentications

ログイン画面

ruby

= link_to 'Login with Twitter', auth_at_provider_path(provider: :twitter)

config/initializers/sorcery.rb

ruby

Rails.application.config.sorcery.submodules = [:external] # Here you can configure each submodule's features. Rails.application.config.sorcery.configure do |config| config.external_providers = [:twitter] config.twitter.key = Rails.application.credentials.twitter[:key] config.twitter.secret = Rails.application.credentials.twitter[:secret] config.twitter.callback_url = "http://127.0.0.1:3000/oauth/callback?provider=twitter" config.twitter.user_info_mapping = { name: 'name' } config.user_config do |user| user.stretches = 1 if Rails.env.test? user.authentications_class = Authentication end config.user_class = 'User' end

routes.rb

post "oauth/callback", to: "oauths#callback" get "oauth/callback", to: "oauths#callback" get "oauth/:provider", to: "oauths#oauth", as: :auth_at_provider

マイグレーションファイル

class SorceryExternal < ActiveRecord::Migration[6.1] def change create_table :authentications do |t| t.integer :user_id, null: false t.string :provider, :uid, null: false t.timestamps null: false end add_index :authentications, [:provider, :uid] end end

試したこと

callbackアクション内の処理を一つずつ追ってみたところlogin_fromメソッド内sorcery_fetch_user_hash(provider_name)メソッドの@access_token ||= @provider.process_callback(params, session)process_callback(params, session)メソッド内のget_access_token(args)でエラーが出ていることが分かりました。

(ruby) get_access_token(args) eval error: 401 Unauthorized /Users/apple/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/consumer.rb:257:in `token_request' /Users/apple/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/oauth-0.5.10/lib/oauth/tokens/request_token.rb:26:in `get_access_token' /Users/apple/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/sorcery-0.16.3/lib/sorcery/protocols/oauth.rb:27:in `get_access_token' (rdbg)//Users/apple/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/sorcery-0.16.3/lib/sorcery/providers/twitter.rb:1:in `process_callback' nil

process_callback(params, session)メソッドは下記のようになっており、sessionが取得できてないことがエラーの原因かと考えました。

def process_callback(params, session) args = { oauth_verifier: params[:oauth_verifier], request_token: session[:request_token], request_token_secret: session[:request_token_secret] } args[:code] = params[:code] if params[:code] get_access_token(args) end (rdbg) params #<ActionController::Parameters {"provider"=>"twitter", "oauth_token"=>"jMbf4QAAAAABf4hhAAABgqCFNmY", "oauth_verifier"=>"C12AVt3OEYL0sIz3VHot6TNVU5gnb7L8", "controller"=>"oauths", "action"=>"callback"} permitted: false> (rdbg) session #<ActionDispatch::Request::Session:0x133648 not yet loaded> (ruby) session[:request_token] nil

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。