无法检索 oauth2 的访问令牌

cannot retrieve access token for oauth2

我正在尝试获取 Oauth2 访问令牌以使用 adwords api。我正在使用 google-api-ads-ruby 并尝试按照此处的说明进行操作 https://github.com/googleads/google-api-ads-ruby/wiki/API-access-using-own-credentials-(installed-application-flow)。我已将开发者令牌、客户端 ID、机密和所有其他信息插入 adwords_api.yml。当我 运行 setup_oauth2.rb 它显示如下:

Hit Auth error, please navigate to URL:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=309181******-lnbictq23g17o7pp3e6v7vdqq9juinv9.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/adwords
log in and type the verification code: 

所以正如文档所说,我在浏览器中复制并粘贴了 url,但我一直得到这个:

我也尝试过选择 'other' 而不是 'web application' 创建新的客户端 ID。虽然网上很多人说选择'installed application',但是没有这个选项。我看到的所有选项都只有这个:

在这上面卡了不知道多少天了。如果您有任何建议,请提供。谢谢。

Oauth2 的工作方式是它需要知道return 身份验证的位置。这是通过定义重定向 URI 来完成的。

使用基于浏览器的应用程序,很容易知道身份验证应该 return 到哪里。在这种情况下,它应该转到网站上的一个页面,该页面旨在处理来自身份验证服务器的响应。

对于已安装的应用程序,这有点困难,因为没有网站可以 return 所以无法知道将其发送到哪里的确切 IP 地址。在本例中,google 创建了两个您可以使用的标准重定向 URI。

urn:ietf:wg:oauth:2.0:oob and and http://localhost

错误说明

在您的情况下,如果您阅读错误消息,则表示您正在向浏览器客户端 ID 发送本机重定向 uri。

您的问题:

309181******-lnbictq23g17o7pp3e6v7vdqq9juinv9.apps.googleusercontent.com  <--- Web client id  
urn:ietf:wg:oauth:2.0:oob  <--- Redirect uri only allowed for native clients

解决方案

返回 Google 开发人员控制台并找到您创建的本机(其他)客户端的客户端 ID 和客户端密码。您不能像现在一样将 urn:ietf:wg:oauth:2.0:oob 与浏览器客户端 ID 一起使用。

现在这真的取决于你在这里做什么。如果您打算在某个网站上发布它,那么将其保留为浏览器客户端可能是一个决定性的 ID。在这种情况下,只需使用 http://localhost 作为您的重定向 uri 即可解决您的问题。但是当您将其发布到您的生产网站时,您应该添加一个新的重定向 uri。在我看来,在生产客户端中允许使用 localhost 是个坏主意。

但这实际上取决于您打算如何使用此应用程序。