公式の aweber gemを使用して、OAuth 経由で Rails アプリを Aweber と統合しようとしています。
Rails コンソールでフローに従えば、問題なくアクセス トークンを取得できます。
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
puts oauth.request_token.authorize_url
# => https://auth.aweber.com/1.0/oauth/authorize?oauth_token=xxxxxxxxxxxxxx
次に、その URL にアクセスして資格情報を入力し、確認コードを取得して、Rails コンソールに戻ります。
oauth.authorize_with_verifier 'xxxxxx'
# => #<OAuth::AccessToken>
成功!
問題は、これをコンソールだけでなく現実の世界で実行したいということです。つまり、Ruby コードを 2 つの別個のアクションに分割する必要があります。まず、Aweber の Oauth ページにリダイレクトするコントローラー アクションがあります。
def aweber
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
redirect_to oauth.request_token(oauth_callback: "http://127.0.0.1:3000/auth/aweber/callback").authorize_url
end
次に、ユーザーが資格情報を入力してリダイレクトされた後にアクセス トークンを取得するアクションがあります。
def aweber_callback
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
oauth.authorize_with_verifier(params[:oauth_verifier])
end
このようにすると、最終行 ( authorize_with_verifier
) で常に が発生し#<OAuth::Unauthorized: 401 Unauthorized>
ます。
oauth
問題は、変数を 2 回初期化していることです。つまり、2 つの無関係なAWeber::Oauth
...のインスタンスがあり、authorize_url を生成した AWeber::Oauth のインスタンスのみがアクセス トークンを取得できます。しかし、コントローラーの 2 つの完全に異なるスレッドとインスタンスを扱っているため、両方で同じインスタンスを取得することはできません。aweber_callback
aweber
を調べるoauth
と、内部変数oauth.request_token.params["oauth_token"]
とoauth.request_token.params["oauth_token_secret"]
がそれぞれ で異なることがわかりoauth
ます。これが問題の原因であると推測しています。oauth_token
params ( ) から「正しい」値を取得できますparams[:oauth_token]
が、正しい oauth_token_secret を取得する方法がわかりません (このようにインスタンス変数を手動で設定するのは非常にハックに感じられ、おそらく最善の方法ではないことは言うまでもありません)。
アクセス トークンを生成するにはどうすればよいですか?