我正在尝试使用official aweber gem通过OAuth将我的Rails应用程序与Aweber集成。

如果我在Rails控制台中遵循它们的流程,那么我可以获得访问 token ,没有问题:

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代码需要分解为两个单独的 Action 。首先,有一个 Controller 操作可重定向到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

然后,有一个操作在用户输入凭据并被重定向后获取访问 token :
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变量,这意味着我有两个不相关的AWeber::Oauth ...和实例,只有AWeber::Oauth实例(生成authorize_url的实例)才能获取访问 token 。但是我在aweber_callbackaweber中都无法获得相同的实例,因为我正在处理两个完全不同的线程和 Controller 实例。

当我检查oauth时,我可以看到每个oauth.request_token.params["oauth_token"]中的内部变量oauth.request_token.params["oauth_token_secret"]oauth不同,我猜这是问题的原因。我可以从参数(oauth_token)中获取“正确的” params[:oauth_token],但是我不知道如何获取正确的oauth_token_secret(更不用说像这样手动设置实例变量感觉非常 hacky,可能不是最好的方法。)

如何生成访问 token ?

最佳答案

我最终通过将oauth_token_secret存储在 session 中来完成此工作。 (我不得不说,我对Aweber的文档和API设置没有任何印象。这花了原本应该花的十倍。)

Gemfile
gem 'aweber', '~> 1.6.1', require: "aweber"
路线

get "auth/aweber", to: "integrations#aweber", as: :aweber
get "auth/aweber/callback", to: "integrations#aweber_callback", as: :aweber_callback

集成 Controller
def aweber
  oauth = get_aweber_oauth

  request_token = oauth.request_token(oauth_callback: aweber_redirect_uri)
  session[:aweber_oauth_token_secret] = request_token.secret

  redirect_to request_token.authorize_url
end


def aweber_callback
  oauth = get_aweber_oauth

  oauth.request_token = OAuth::RequestToken.from_hash(
    oauth.consumer,
    oauth_token: params[:oauth_token],
    oauth_token_secret: session[:aweber_oauth_token_secret],
  )

  access_token = oauth.authorize_with_verifier(params[:oauth_verifier])

  # TODO save access_token.token and access_token.secret
end

private

def get_aweber_oauth
  AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
end

def aweber_redirect_uri
  @_aweber_callback_uri ||= begin
    if Rails.env.production?
      redirect_host = "http://myproductionurl.com"
    else
      redirect_host = "http://127.0.0.1:3000"
    end
    "#{redirect_host}#{Rails.application.routes.url_helpers.aweber_callback_path}"
  end
end

下一步是将access_token.token.secret存储在我的数据库中,
那么我就可以在以后的请求中授权用户,如下所示:
oauth = AWeber::OAuth.new(ENV["AWEBER_CONSUMER_KEY"], ENV["AWEBER_CONSUMER_SECRET"])
oauth.authorize_with_access(current_user.aweber_token, current_user.aweber_secret)
aweber = AWeber::Base.new(oauth)
# Make calls using "aweber"...

我尝试将gem omniauth-aweber gem 与 omniauth gem 结合使用,但无法正常工作(这很可惜,因为我在此应用中使用了其他omniauth-xxx gem ,因此保留它会很不错基本上是一致的。)基本上,该gem会自动处理过程中的/auth/aweber部分,但是在将我重定向回/auth/aweber/callback/之后,我看不到任何获取oauth_token_secret的方法-它不在请求参数, session 或cookie中。

我现在已经回答了自己的问题,但是如果有任何可以对上述内容做出显着改进的人,或者想出一种使所有内容都可以与omniauth-aweber结合使用的方法,我将予以奖励。

关于ruby-on-rails - 如何使用OAuth将Aweber连接到我的Rails应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30070101/

10-10 22:18