我正试图在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'".
到目前为止,我是如何解决这个问题的:
- 我认为问题在于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"。
我可以猜测这意味着什么,但我仍然不确定实际问题是什么以及如何解决。在谷歌上搜索错误消息并没有帮助。
同样,我尝试使用gems为我进行https调用,特别是HTTParty和Typheous,尽管我无法在它们方面取得任何进展(甚至还不确定这是否是http/https问题)。
我尝试过使用SignetRails宝石。这是迄今为止最有效的方法,成功地调用了API并返回了信息。然而,它要么没有保存刷新令牌,要么我找不到它保存的位置。由于我需要访问该令牌来运行rake任务,我放弃了使用SignetRails。
我试着使用Legato,但总是遇到各种各样的问题。总的来说,Legato给我的印象是,它没有将获得授权代码、同意和令牌集成到应用程序中,而是要求开发人员在应用程序范围之外提前设置这些内容。我希望能够将身份验证代码设置为应用程序的一部分。如果我正确理解Legato,那么它就不是我所需要的宝石。
我也尝试过其他各种各样的方法,但都无济于事。上面的解决方案是我一直在使用的策略。首先,我正在寻找我的代码中出现问题的答案,以及解决问题的最佳途径是什么(如果我在上面尝试的任何解决方案中都走上了正确的道路,那是哪一个?)
感谢您花时间阅读并回答!
(顺便说一句,最后三个列表项应该是2、3、4,但stackoverflow文本编辑器认为它比我更清楚…)
指定端口:
http = Net::HTTP.new('accounts.google.com', 443)
来源:HTTP POST(未知协议)上的SSL错误