2

我正在使用 gem OAuth2与 Google 服务进行通信。我不明白如何实现回调,它接收带有 OAuth 代码的响应以获取访问令牌。当我在callback方法中设置断点时,它似乎永远不会被调用。

这是我的代码:

路线:

match '/oauth2/callback' => 'reports#callback'

实际重定向网址:

http://localhost/oauth2/callback?code=111111  

报告控制器:

def new
 client = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {
         :authorize_url => 'https://accounts.google.com/o/oauth2/auth',
         :token_url => 'https://accounts.google.com/o/oauth2/token'
    })
redirect_to client.auth_code.authorize_url({
        :scope => 'https://www.googleapis.com/auth/analytics.readonly',
        :redirect_uri => 'http://localhost/oauth2/callback',
        :access_type => 'offline'
    }) 
end

def callback
  oauth_code = params[:code]

  # Create access token with oauth_code
end
4

2 回答 2

4

Google 服务器正在尝试访问这个http://localhost/oauth2/callback?code=111111无效的 url。

您需要域名才能使用 OAuth 等服务,因为 google 服务器必须能够通过 Internet 找到您的计算机。

为了能够从您的开发机器上执行此操作,您应该:

  1. 在已知的 DNS 服务器上设置名称:最简单的方法是通过动态 DNS 服务器,如dyndnsno-ip

  2. 如果您使用的是路由器NAT,您可能需要将请求重定向到您的调制解调器上的端口 80 到您的计算机:如果您不这样做,您的调制解调器将从 google 的端口 80 上收到一个包,并会说“不适合我”,丢弃它。您可以在调制解调器菜单中执行此操作 - 查找端口转发或 NAT 部分。

于 2013-06-04T16:46:00.977 回答
1

传递给 google 的 redirect_url 必须与从客户端浏览器看到的回调 url 完全匹配。在 url 中使用 localhost 没问题(关于 DNS 和 NAT 的 fotanus 语句是错误的)。如果你在不同的端口(例如 8080)运行你的容器,你必须:

  • 指定谷歌云中的url:http://localhost:8080/oauth2/callback

  • 在客户端请求中指定相同的返回 url。

于 2013-12-19T09:29:30.277 回答