无法检索 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_uris
有urn:ietf:wg:oauth:2.0:oob
和http://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
使用 spring-boot-starter-oauth2-client 检索 OAuth2 3-legged 身份验证的访问令牌