我正在尝试使用官方 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 代码需要分解为两个单独的操作。首先,控制器操作重定向到 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
) 总是 raise #<OAuth::Unauthorized: 401 Unauthorized>
。
似乎问题在于我将oauth
变量初始化了两次,这意味着我有两个不相关的AWeber::Oauth
... 实例,并且只有生成 authorize_url 的 AWeber::Oauth 实例才能获取访问令牌。但是我无法在两者中获得相同的实例,aweber_callback
因为aweber
我正在处理两个完全不同的线程和控制器实例。
当我检查时oauth
,我可以看到每个内部变量oauth.request_token.params["oauth_token"]
和oauth.request_token.params["oauth_token_secret"]
不同oauth
,我猜这是问题的原因。我可以从oauth_token
参数(params[:oauth_token]
如何生成访问令牌?