从Google API返回请求访问令牌302

时间:2014-04-25 16:31:38

标签: ruby oauth-2.0 google-api http-status-code-302

我正在尝试从我的Ruby on Rails应用程序中获取Google API的访问令牌,这是设置raketask的总体目标的一部分。我能够获得Auth Code,但是当我发出获取访问令牌的帖子请求时,我收到302错误。我将首先描述我当前的代码,然后列出我到目前为止试图解决问题的方法。

当前代码:

#users_controller
def auth_access
client = Signet::OAuth2::Client.new(
      :authorization_uri => 'https://accounts.google.com/o/oauth2/auth',
      :token_endpoint_uri => 'https://accounts.google.com/o/oauth2/token',
      :client_id => ENV['OAUTH_CLIENT_ID'],
      :client_secret => ENV['OAUTH_CLIENT_SECRET'],
      :scope => 'https://www.googleapis.com/auth/analytics.readonly',
      :redirect_uri => 'http://localhost:3000/google/auth_callback'
    )

    redirect_to client.authorization_uri.to_s
end

到目前为止,这部分工作正常。它重定向到同意页面,当用户同意时,然后将它们重定向到url参数中带有auth代码的页面。接下来,我使用该auth代码并尝试向API发出POST请求以获取访问令牌:

#users_controller
def auth_callback
http = Net::HTTP.new('accounts.google.com')

    path = '/o/oauth2/token'
    data = "code=#{params['code']}&client_id=#{ENV['OAUTH_CLIENT_ID']}&client_secret=#{ENV['OAUTH_CLIENT_SECRET']}&redirect_uri=http://localhost:3000/auth_final&grant_type=authorization_code"
    response = http.post(path, data)
end

当我遇到问题时。 Google API返回302,其中包含一条消息,上面写着“我们已移至'https://accounts.google.com/o/oauth2/token'”的内容。

以下是我到目前为止尝试解决问题的方法:

  1. 我认为问题是http.post方法正在调用http而不是https。
  2. 我试过包括

    http.use_ssl = true
    http.ssl_version = :SSLv3
    

    这将返回错误“SSL_connect returned = 1 errno = 0 state = SSLv3 read server hello A:错误的版本号”。

    我可以猜测这意味着什么,但我仍然不确定实际问题是什么以及如何解决它。谷歌搜索错误消息并没有帮助。

    1. 以类似的方式,我尝试使用gem来为我调用https,特别是HTTParty和Typheous,虽然我无法对它们取得任何进展(我仍然不确定它是否为http / https问题)。

    2. 我尝试过使用Signet-Rails gem。到目前为止,这是最有效的方法,可以成功调用API并返回信息。但是,它要么没有保存刷新令牌,要么找不到保存位置。由于我需要访问该令牌来运行rake任务,所以我放弃了Signet-Rails。

    3. 我尝试使用Legato,并且经常遇到各种问题。总的来说,Legato给我的印象是它没有将auth代码,同意和令牌集成到应用程序中,而是要求开发人员在应用程序范围之外提前设置它们。我希望能够将auth代码设置为应用程序的一部分。如果我正确理解Legato,那么它不是我需要的宝石。

    4. 我也尝试了其他各种各样的几率,但无济于事。上述解决方案是我不断回归的策略。主要是我正在寻找我的代码中出现问题的答案,以及修复它的最佳途径(如果我使用上述任何一种尝试的解决方案走向正确的轨道,哪一个?)

      感谢您花时间阅读并回答!

      (在完整的旁注中,最后三个列表项应该是2,3,4,但stackoverflow文本编辑器认为它比我更了解...)

1 个答案:

答案 0 :(得分:0)

指定端口:

http = Net::HTTP.new('accounts.google.com', 443)

来源:SSL Error on HTTP POST (Unknown Protocol)

相关问题