Ruby on rails 为什么在尝试从google OAuth 2.0获取访问令牌时会出现404错误?

Ruby on rails 为什么在尝试从google OAuth 2.0获取访问令牌时会出现404错误?,ruby-on-rails,ruby,oauth-2.0,Ruby On Rails,Ruby,Oauth 2.0,我目前正在构建OAuth授权,以仅获取电子邮件和个人资料信息 我可以通过以下方法轻松获得代码: def authorize base = "https://accounts.google.com/o/oauth2/auth?" params = { :scope => "https://www.googleapis.com/auth/userinfo.profile", :redirect_uri => "http://localhost:3000/oauth

我目前正在构建OAuth授权,以仅获取电子邮件和个人资料信息

我可以通过以下方法轻松获得代码:

def authorize
  base = "https://accounts.google.com/o/oauth2/auth?"
  params = {
    :scope => "https://www.googleapis.com/auth/userinfo.profile",
    :redirect_uri => "http://localhost:3000/oauth/callback/",
    :client_id => "id",
    :response_type => 'code'
  }
  redirect_to base + params.to_query
end
但是,当我尝试从Google获取访问令牌时,我得到一个404错误:

def callback
  code = params[:code]
  client_id = 'id'
  client_secret = 'secret'
  redirect_uri = "http://localhost:3000/oauth/callback/"
  http = Net::HTTP.new('accounts.google.com', 80)
  path = "https://accounts.google.com/o/oauth2/token?"
  headers = {'Content-Type'=>"application/x-www-form-urlencoded" }
  parameters = "code=#{code}&grant_type=authorization_code&client_secret=#{client_secret}&client_id=#{client_id}&redirect_uri=#{redirect_uri}"
  resp, data = http.post(path,parameters,headers)
end

response code: 404  data: Google Home | Sign in

The page you requested is invalid.
我不完全确定问题可能是什么。我已尝试将已注册的回调URL与“复制+粘贴”匹配。我已多次检查我的参数,但找不到导致错误的原因

我正在跟踪,并在谷歌注册了以下信息:

Client ID for web applications 
Client ID: id
Client secret: secret
Redirect URIs: http://localhost:3000/oauth/callback/ 
JavaScript origins: none

如果您试图让Google重定向到:

:redirect_uri => "http://localhost:3000/oauth/callback/",

我怀疑他们找不到
localhost
。给他们你的真实IP号码。

如果你想让Google重定向到:

:redirect_uri => "http://localhost:3000/oauth/callback/",
我怀疑他们找不到
localhost
。给他们你的真实IP号码。

成功了

我好像错过了几件事:

  • 为HTTP请求添加了SSL设置
  • 将参数作为正文发送,而不是作为请求的一部分发送
  • 将内容类型正确地放入请求中
  • 我希望这能帮助别人

    param = {
      :code => params[:code],
      :client_id => client_id,
      :client_secret => client_secret,
      :redirect_uri => "http://localhost:3000/oauth/callback/",
      :grant_type => 'authorization_code'
    }
    
    uri = URI.parse("https://accounts.google.com/o/oauth2/token")
    http = Net::HTTP.new(uri.host, uri.port)
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.request_uri)
    request["Content-Type"] = "application/x-www-form-urlencoded"
    request.body = param.to_query
    response = http.request(request)
    
    开始工作了

    我好像错过了几件事:

  • 为HTTP请求添加了SSL设置
  • 将参数作为正文发送,而不是作为请求的一部分发送
  • 将内容类型正确地放入请求中
  • 我希望这能帮助别人

    param = {
      :code => params[:code],
      :client_id => client_id,
      :client_secret => client_secret,
      :redirect_uri => "http://localhost:3000/oauth/callback/",
      :grant_type => 'authorization_code'
    }
    
    uri = URI.parse("https://accounts.google.com/o/oauth2/token")
    http = Net::HTTP.new(uri.host, uri.port)
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.request_uri)
    request["Content-Type"] = "application/x-www-form-urlencoded"
    request.body = param.to_query
    response = http.request(request)
    

    他们在做重定向吗?HTTP不会像OpenURI那样自动处理它们,但OpenURI不支持POST。你可以看看Typhous,它可以很好地处理这两个问题。根据google的文档,它可以返回带有访问令牌或错误的json blob。此呼叫不应该有重定向。他们正在进行重定向吗?HTTP不会像OpenURI那样自动处理它们,但OpenURI不支持POST。你可以看看Typhous,它可以很好地处理这两个问题。根据google的文档,它可以返回带有访问令牌或错误的json blob。此呼叫不应重定向。我相信这不是问题。获取令牌的初始调用正常工作。他们返回到我的本地主机,甚至在他们的表单上签署应用程序。我将尝试部署到heroku并在那里进行实验。我相信这不是问题。获取令牌的初始调用正常工作。他们返回到我的本地主机,甚至在他们的表单上签署应用程序。我将尝试部署到heroku并在那里进行实验。仅供参考,我必须将端口硬编码为443,因为uri.port返回80(Ruby 1.9.2 Rails 3.0.9)。仅供参考,我必须将端口硬编码为443,因为uri.port返回80(Ruby 1.9.2 Rails 3.0.9)