Ruby Gem OAuth 1.0 が Ruby スクリプトでの認証に失敗する
概要
認可が必要な Flickr サードパーティ API を呼び出すスクリプト (非レール) で Ruby Oauth 1.0 ライブラリを使用しています。リクエスト トークンの承認を取得できませんでした。 401 Unauthorized が繰り返し返されます。私の混乱は、Ruby スクリプトで使用されているコールバック、セッション、リダイレクトの使用に起因しています。これは、それ自体が Web サーバー/Rails アプリではない通常の Ruby スクリプトではどのように機能するのでしょうか? Postman で手動で認証を機能させることができましたが、認証ベリファイアを取得するには、ブラウザを開いてコールバックを URL として貼り付け、URL に表示されるベリファイアをコピーする必要があります。
Web サイトで認証を行っていないため、コールバック、redirect_to、セッションは必要ないと思われます。
コールバックやリダイレクトを使用せずにスクリプトでこれを機能させる方法はありますか?
結果を含めて次のことを試しました。
私がやろうとしていることの抜粋を以下に示します。
require 'oauth'
require 'byebug'
callback_url = "localhost URL"
# Create a new OAuth::Consumer instance by passing it a configuration hash:
consumer_key = "a2e299ac1d635a7c9f2d7c7b70588679"
consumer_secret = "235de478b9a078ae"
@oauth_consumer = OAuth::Consumer.new(consumer_key, consumer_secret,
{ :site => "https://flickr.com",
# { :site => "https://flickr.com/services",
:scheme => :header,
:http_method => :get,
:request_token_path => "request_token URL",
:access_token_path => "access_token URL",
:authorize_path => "authorize URL",
:body_hash_enabled => false,
:debug_output => true
})
@request_token = @oauth_consumer.get_request_token(oauth_callback: callback_url)
session = {}
session[:token] = @request_token
session[:token_secret] = @request_token
# redirect_to @request_token.authorize_url(oauth_callback: callback_url) # redirect_to not available in ruby script
puts "request token: #{session[:token]}"
puts "request token secret: #{session[:token_secret]}"
auth_str = @request_token.authorize_url(oauth_callback: callback_url)
# When user returns create an access_token
hash = { oauth_token: session[:token], oauth_token_secret: session[:token_secret] }
@request_token = OAuth::RequestToken.from_hash(@oauth_consumer, hash)
@access_token = @request_token.get_access_token
@recognitions = @access_token.get("login URL")
type here
次の結果が表示されます。
reading 28 bytes...
-> "oauth_problem=token_rejected"
read 28 bytes
Conn close
Traceback (most recent call last):
2: from flickr_client.rb:38:in `<main>'
1: from /Users/bhunsake/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/oauth-1.1.0/lib/oauth/tokens/request_token.rb:28:in `get_access_token'
/Users/bhunsake/.rbenv/versions/2.7.7/lib/ruby/gems/2.7.0/gems/oauth-1.1.0/lib/oauth/consumer.rb:268:in `token_request': 401 Unauthorized (OAuth::Unauthorized)
解決策
私自身の質問に対する簡単な答えを見つけました。どうやら、ログイン検証が必要ない場合、Ruby Auth Consumer オブジェクトがあらゆる承認/認証を処理します。この Flickr の場合、以下に示すように Consumer (API) Key を追加するだけで済みました。