【问题标题】:Getting a Google OAuth access token from an id_token从 id_token 获取 Google OAuth 访问令牌
【发布时间】:2023-03-27 02:06:01
【问题描述】:

我正在使用带有 redirect_uri 选项的 Google 身份验证(以避免弹出窗口)。当用户登录 Chrome 时,我可以获得访问令牌,但在 Safari(例如)中,我不知道如何获取访问令牌。重定向查询字符串包含一个 id_token,我可以使用此端点成功验证:

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123

这给了我一些关于用户的信息,但我真正想要的是一个访问令牌,因为我的后端 API 需要它。

我可以从 id_token 获取访问令牌吗?如果是这样,如何。我找不到任何例子。

澄清:我不是在尝试对我的应用进行身份验证,而是从通过 Google 在前端登录进行身份验证的用户那里获取 id_token。

【问题讨论】:

  • 您在对 Google 的初始授权请求中使用什么响应类型?
  • @sg3s 你是在建议我尝试“代码”然后用它来获取访问令牌吗?我正在使用 @types/gapi 和 Angular,它没有这个选项,但我可以自己添加它并尝试它,

标签: javascript google-authentication


【解决方案1】:

仅对用户进行身份验证

如果您不使用 Google API 并且仅使用令牌来验证用户身份,您应该只验证 id_token 而不要使用访问令牌。 id_tokens 是一个 OpenID Connect 概念,用于通知客户端(您的应用程序)有关当前登录用户的一些基本信息。

要验证 id_token,您可以在 Stackoverflow 上使用 use the documentationthis related question 进行描述。

代表您的用户使用 Google API

但是,如果您想以用户的名义使用 Google API,则需要 access_token,因为 id_tokens 通常不用于后端身份验证。要获取访问令牌,用户需要授权您的应用才能代表他们访问 Google API。如果您使用的是 gapi 库,那么调用 Google API 的过程可能大部分是隐藏的,但它应该在某个地方有一个访问令牌。

这份 Google 文档描述了幕后发生的事情。

https://developers.google.com/identity/protocols/OAuth2

如果您想在后端代表您的用户访问 Google API,您可能必须遵循与您的前端使用的流程不同的流程。授权请求中的响应类型定义了使用哪个进程(这就是我询问使用哪种响应类型的原因)。但是 gapi npm 包背后的 Javascript 库似乎支持它,尽管您使用它的方式可能不容易访问。

https://developers.google.com/api-client-library/javascript/reference/referencedocs#googleusergetauthresponseincludeauthorizationdata

还可以查看离线选项,也许这就是您想要的?如果这没有帮助,您仍然可以查看我之前引用的 Oauth2 文档页面,以获取指向其他选项/其他语言的链接以获取身份验证令牌。

【讨论】:

  • 不幸的是,我确实需要 Google API 的 access_token。在使用 ux_mode: 'redirect' 以避免弹出窗口时,我还没有弄清楚如何从非 Chrome 浏览器中获取它。
  • 如果您已经有一个 Google 用户,您也许可以获得访问令牌,但前提是您的访问令牌需要与已使用的范围相同的范围。如果您还没有所需的特定范围,则无法在没有交互的情况下获得访问令牌。请查看我引用的离线选项了解更多详情。
猜你喜欢
  • 2012-08-03
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2018-02-05
  • 2011-08-21
  • 2018-02-17
相关资源
最近更新 更多