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



我正试图在Ruby on Rails应用程序中从Google API获取访问令牌,这是建立rakeftask的总体目标的一部分。我可以获得一个Auth Code罚款,但当我发出获取访问令牌的post请求时,我得到了一个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代码的页面。接下来,我获取验证代码,并尝试向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

当我遇到问题的时候。谷歌API返回302,并包含一条类似于"我们移动到"的消息https://accounts.google.com/o/oauth2/token'".

到目前为止,我是如何解决这个问题的:

  1. 我认为问题在于http.post方法调用的是http,而不是https

我试过包括

http.use_ssl = true
http.ssl_version = :SSLv3

这将返回错误"SSL_connect returned=1 errno=0 state=SSLv3 read server hello A:error version number"。

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

  1. 同样,我尝试使用gems为我进行https调用,特别是HTTParty和Typheous,尽管我无法在它们方面取得任何进展(甚至还不确定这是否是http/https问题)。

  2. 我尝试过使用SignetRails宝石。这是迄今为止最有效的方法,成功地调用了API并返回了信息。然而,它要么没有保存刷新令牌,要么我找不到它保存的位置。由于我需要访问该令牌来运行rake任务,我放弃了使用SignetRails。

  3. 我试着使用Legato,但总是遇到各种各样的问题。总的来说,Legato给我的印象是,它没有将获得授权代码、同意和令牌集成到应用程序中,而是要求开发人员在应用程序范围之外提前设置这些内容。我希望能够将身份验证代码设置为应用程序的一部分。如果我正确理解Legato,那么它就不是我所需要的宝石。

我也尝试过其他各种各样的方法,但都无济于事。上面的解决方案是我一直在使用的策略。首先,我正在寻找我的代码中出现问题的答案,以及解决问题的最佳途径是什么(如果我在上面尝试的任何解决方案中都走上了正确的道路,那是哪一个?)

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

(顺便说一句,最后三个列表项应该是2、3、4,但stackoverflow文本编辑器认为它比我更清楚…)

指定端口:

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

来源:HTTP POST(未知协议)上的SSL错误

最新更新