无法检索 oauth2 的访问令牌

Posted

技术标签:

【中文标题】无法检索 oauth2 的访问令牌【英文标题】:cannot retrieve access token for oauth2 【发布时间】:2018-05-15 01:57:19 【问题描述】:

我正在尝试获取 Oauth2 访问令牌以使用 adwords api。我正在使用 google-api-ads-ruby 并尝试按照此处的说明进行操作,https://github.com/googleads/google-api-ads-ruby/wiki/API-access-using-own-credentials-(installed-application-flow)。我在 adwords_api.yml 中插入了开发人员令牌、客户端 ID、密码和所有其他信息。当我运行 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: 

正如文档所说,我将网址复制并粘贴到浏览器中,但我不断收到:

我还尝试通过选择“其他”而不是“Web 应用程序”来创建新的客户端 ID。虽然网上很多人说选择“已安装的应用程序”,但没有这样的选项。我看到的所有选项都只有这个:

我不知道我被困了多少天。如果您有任何建议,请提供任何建议。谢谢。

【问题讨论】:

当客户端ID被检索为other时,redirect_urisurn:ietf:wg:oauth:2.0:oobhttp://localhost。那么如何从redirect_uri=urn:ietf:wg:oauth:2.0:oob 修改为redirect_uri=http://localhost?如果这对你没有用,我很抱歉。 哇,现在它把我重定向到谷歌登录页面,它还提示用户允许我的应用程序管理用户的活动。但是虽然它应该给我一个验证码,但它说这个站点无法提供安全连接 localhost 发送了一个无效响应。尝试运行网络诊断。 ERR_SSL_PROTOCOL_ERROR 而且我的服务器也有这样的错误,2018-05-14 22:55:43 -0700: HTTP parse error, malformed request(): #<:httpparsererror: invalid http format parsing failed.> 你知道吗为什么会这样..? 【参考方案1】:

Oauth2 的工作方式是它需要知道将身份验证返回到哪里。这是通过定义重定向 URI 来完成的。

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

安装应用程序会更难一些,因为没有可以返回的网站,因此无法知道将其发送到的确切 IP 地址。在这种情况下,谷歌创建了两个您可以使用的标准重定向 uri。

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

您的错误说明

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

您的问题:

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

解决方案

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

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

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

【讨论】:

感谢您的详细回答。正如您所说,将 urn:ietf:wg:oauth:2.0:oob 更改为 localhost 修复了 http 错误。它重定向到谷歌的身份验证页面。但是,在我授予访问权限后,虽然它应该根据 oauth2 文档(github.com/googleads/google-api-ads-ruby/wiki/…)给我一个验证码,但它给了我另一条错误消息,说“此站点无法提供安全连接 localhost 发送了一个无效的回应。' 你认为它为什么这样做?我的应用程序是用于网络的。此外,我目前只有主页,并在开始构建应用程序之前尝试连接到 adwords api。 没关系!我实际上在我的客户端 ID 上设置了错误的重定向 uri。现在它在授予访问权限后重定向到我的应用程序。我很感激所有人。谢谢:D

以上是关于无法检索 oauth2 的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

从Spring Security Oauth2中的Token Store检索访问和刷新令牌的方法

OAuth2.0 令牌奇怪行为(Invalid Credentials 401)

即使访问令牌有效,也无法使用刷新令牌刷新 Google OAuth2 的访问令牌

检索访问令牌时出错 FetchError:对 https://oauth2.googleapis.com/token 的请求失败,原因:读取 ECONNRESET

使用 oauth2 休息服务:无法找到令牌的访问令牌

使用 spring-boot-starter-oauth2-client 检索 OAuth2 3-legged 身份验证的访问令牌