我正在尝试从我的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'”的内容。
以下是我到目前为止尝试解决问题的方法:
我试过包括
http.use_ssl = true
http.ssl_version = :SSLv3
这将返回错误“SSL_connect returned = 1 errno = 0 state = SSLv3 read server hello A:错误的版本号”。
我可以猜测这意味着什么,但我仍然不确定实际问题是什么以及如何解决它。谷歌搜索错误消息并没有帮助。
以类似的方式,我尝试使用gem来为我调用https,特别是HTTParty和Typheous,虽然我无法对它们取得任何进展(我仍然不确定它是否为http / https问题)。
我尝试过使用Signet-Rails gem。到目前为止,这是最有效的方法,可以成功调用API并返回信息。但是,它要么没有保存刷新令牌,要么找不到保存位置。由于我需要访问该令牌来运行rake任务,所以我放弃了Signet-Rails。
我尝试使用Legato,并且经常遇到各种问题。总的来说,Legato给我的印象是它没有将auth代码,同意和令牌集成到应用程序中,而是要求开发人员在应用程序范围之外提前设置它们。我希望能够将auth代码设置为应用程序的一部分。如果我正确理解Legato,那么它不是我需要的宝石。
我也尝试了其他各种各样的几率,但无济于事。上述解决方案是我不断回归的策略。主要是我正在寻找我的代码中出现问题的答案,以及修复它的最佳途径(如果我使用上述任何一种尝试的解决方案走向正确的轨道,哪一个?)
感谢您花时间阅读并回答!
(在完整的旁注中,最后三个列表项应该是2,3,4,但stackoverflow文本编辑器认为它比我更了解...)
答案 0 :(得分:0)