authentication - Google 登录 - 访问令牌、身份验证令牌和 JWT ID 令牌之间的区别
问题描述
我在我的网络应用程序中使用 OAuth Flow。我的网络应用程序与 Google 日历 API 交互,用户通过使用 Google 登录(使用他们的 Gmail 帐户)进行身份验证。
我只是想确保我对身份验证令牌和访问令牌的理解和使用是正确的:
仅在登录期间需要 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访问令牌作为我的 Web 应用程序的身份验证令牌,但我意识到这可能是错误的。访问令牌将授权用户使用 Google/第三方 API,但我需要一个单独的身份验证令牌来将用户身份验证到我的 Web 应用程序中。
解决方案
仅在登录期间需要 JWT ID 令牌
更正这称为Open Id connect, id 令牌用于验证计算机背后的用户是否是帐户的所有者,因为他们知道登录名和密码。把它想象成你的出生证明,它证明你就是你。
此 JWT ID Token 与 Authentication Token 完全不同
Correct Id token 或 open id connect 建立在用于授权的 Oauth2 之上。
Authentication Token 代表用户的会话,它可以使用任何库生成。
在某些情况下,不正确的 Oauth2 允许您的应用程序请求已通过 Open id connect 进行身份验证的用户的同意,以授予应用程序访问其数据的权限。它与会话无关。使用访问令牌,您的应用程序可以在一段时间内访问数据。使用刷新令牌,您的应用程序将能够在过期时请求新的访问令牌。考虑到身份验证更像是您被授权驾驶汽车的驾驶执照。
我将拥有许多访问令牌,用于访问第三方 API
正确的每个第三方 api 都有自己的授权服务器。您的应用程序需要由他们注册,他们会为您提供一个客户端 ID 和密码,您可以使用它们来生成访问令牌,以通过他们的 API 访问您的用户数据。
客户端 ID + 客户端密码 + 用户同意 = 访问令牌和刷新令牌到范围授予的 API
有一次,我实际上是在使用我的 Google Calendar API 访问令牌作为我的 Web 应用程序的身份验证令牌,但我意识到这可能是错误的。
Pre open id connect 这可能发生了很多并且仍然存在。
访问令牌将授权用户使用 Google/第三方 API,但我需要一个单独的身份验证令牌来将用户身份验证到我的 Web 应用程序中。
从技术上讲,是的。但是,如果您有一个内部登录系统,您的用户在您的系统中创建帐户,那是您在那里的身份验证,您只需请求对用户 google 帐户的额外授权,您就可以将他们的刷新令牌存储为内部身份验证的一部分。
您可以使用多个身份验证提供程序(Facebook、推特、谷歌),但最好有一个将它们全部映射在一起的内部身份验证提供程序,否则用户最终可能会在您的系统中拥有三个帐户。
推荐阅读
- python - 在 Python Pandas 中,如何使用 datetime 或其他包来合并我的数据集?
- loops - Execute a number of Ansible Plays, one variable list item at a time
- oracle - PL/SQL:求两个值相减的平均值
- javascript - 如何在代码中获取 ajax 数据数组结果?
- python - 我如何每次在 Tkinter 中访问不同的按钮?
- mysql - Procedure to update mysql database every night to run .sql file stored in a shared drive location
- swift - NSOutlineView 中的 NSTextField 不发送其操作
- git - How can I get the hashes of all files changed in a commit?
- python - Replacing a layout in PyQt5
- java - 在我的逃逸速度程序中调试问题