Google 登录 - 访问令牌、身份验证令牌和 JWT ID 令牌之间的区别

Posted

技术标签:

【中文标题】Google 登录 - 访问令牌、身份验证令牌和 JWT ID 令牌之间的区别【英文标题】:Google Sign In - Difference between Access Token, Authentication Token and JWT ID Token 【发布时间】:2021-12-10 03:03:24 【问题描述】:

我在我的网络应用程序中使用 OAuth Flow。我的网络应用与 Google Calendar API 交互,用户通过 Sign In with Google(使用他们的 Gmail 帐户)进行身份验证。

我只是想确保我对 Authentication Tokens 和 Access Tokens 的理解和使用是正确的:

    仅在登录期间需要 JWT ID 令牌。我们只需要在登录期间验证一次,如下所示:client.verifyIdToken(idToken: token, audience: CLIENT_ID)。 ID 令牌不用于向 My Web App 验证用户。参考:https://developers.google.com/identity/sign-in/web/backend-auth

    此 JWT ID 令牌与我传递给 My Web App 的安全(经过身份验证的)端点的身份验证令牌完全不同。 Authentication Token 代表用户的会话,可以使用任何库生成(即crypto.generateRandomNumber())。

    另一方面,我将拥有许多访问令牌,用于访问第三方 API(即 Slack API、Google 日历 API)。这些 Access Token 与上面提到的 JWT ID Token 和 Authentication Token 不同。

我的理解/实施是否正确?有一次,我实际上是在使用我的 Google Calendar API Access 令牌作为我的 Web 应用的 Authentication 令牌,但我意识到这可能是错误的。 访问令牌将授权用户使用 Google/第三方 API,但我需要一个单独的 身份验证令牌来身份验证 用户进入 My Web App。

【问题讨论】:

【参考方案1】:

JWT ID Token 仅在登录时需要

正确,这称为Open Id connect, id 令牌用于验证计算机后面的用户是否是帐户的所有者,因为他们知道登录名和密码。把它想象成你的出生证明,它证明你就是你。

此 JWT ID Token 与 Authentication Token 完全不同

Correct Id token 或 open id connect 建立在用于授权的 Oauth2 之上。

身份验证令牌代表用户的会话,可以使用任何库生成。

在某些情况下,不正确的 Oauth2 允许您的应用程序请求已通过 Open id connect 进行身份验证的用户的同意,以授予应用程序访问其数据的权限。它与会话无关。使用访问令牌,您的应用程序可以在一段时间内访问数据。使用刷新令牌,您的应用程序将能够在过期时请求新的访问令牌。考虑一下,身份验证更像是您有权驾驶汽车的驾照。

我将拥有许多访问令牌,用于访问第三方 API

正确的每个第三方api都有自己的授权服务器。您的应用需要由他们注册,他们会为您提供一个客户端 ID 和密码,您可以使用它们来生成访问令牌,以通过他们的 api 访问您的用户数据。

客户端 ID + 客户端密码 + 用户同意 = 访问令牌和刷新令牌到范围授予的 api

在某一时刻,我实际上是使用我的 Google Calendar API 访问令牌作为我的 Web 应用程序的身份验证令牌,但我意识到这可能是错误的。

Pre open id connect 这可能发生了很多,现在仍然如此。

访问令牌将授权用户使用 Google/第三方 API,但我需要一个单独的身份验证令牌来验证用户进入我的 Web 应用程序。

从技术上讲,是的。但是,如果您有一个内部登录系统,您的用户在您的系统中创建帐户,这就是您在那里的身份验证,您只需请求对用户 google 帐户的额外授权,您就可以将他们的刷新令牌存储为您的内部身份验证的一部分。

您可以使用多个身份验证提供程序(Facebook、twitter、google),但最好有一个内部的身份验证提供程序将它们全部映射在一起,否则用户最终可能会在您的系统中拥有三个帐户。

【讨论】:

感谢@DaImTo 的清晰解释。以前,我见过包含“使用 Google 登录”的 Web 应用程序在每次调用安全的内部端点时都会发送其 JWT ID 令牌。我还看到人们使用一些库生成自己的 Auth Token,并将该 Auth Token 传递给他们的安全端点。根据您的回复,第一种方法似乎是错误的。有人有关于如何为 node.js 项目构建内部身份验证系统的资源吗? 您无法生成自己的身份验证令牌 身份验证令牌由授权服务器生成。您的应用程序唯一要做的就是发送其客户端 ID 和密钥以换取授权令牌。 @DalmTo,很抱歉,我的第一条评论中的意思是身份验证令牌(会话 ID),而不是 Oauth 授权令牌。从现在开始,我将坚持将其称为会话 ID。我可以使用 Google Oauth 访问令牌以及随机生成的字符串作为我的会话 ID 是否正确?两者都可以作为“使用 Google 登录”应用程序的会话 ID 吗? @universal thinker 我也在构建一个使用谷歌登录并使用谷歌日历 api 的网络应用程序,并且有类似的设计问题。您链接到developers.google.com/identity/sign-in/web/backend-auth 的参考是用于谷歌登录,使用已被弃用的gapi 库。这是您正在使用的还是您正在使用新的 google 登录 - developers.google.com/identity/gsi/web/reference/html-reference,正在替换它。您还在构建传统的网络应用程序还是水疗中心?

以上是关于Google 登录 - 访问令牌、身份验证令牌和 JWT ID 令牌之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用用户名和密码获取谷歌身份验证令牌

AWS身份池Google登录

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌

如何通过 Firebase Google 身份验证获取带有刷新令牌的 YouTube 数据 API 访问令牌?

Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌

ASP.net core web api:使用 Facebook/Google OAuth 访问令牌进行身份验证