【发布时间】:2020-10-31 13:04:13
【问题描述】:
我有一个关于基于令牌的身份验证的一般性问题。我看到多个指南似乎在说相互矛盾的东西,所以我很困惑:
问题
谁应该负责创建 JWT、应用开发者(通过应用的后端服务器)或身份验证服务器(例如身份提供者)?
(1) 这里的 [0],它解释了 开发人员 需要生成 + 散列 JWT 并将其用作任何请求的不记名令牌。从那里,身份验证服务器可以使用共享密钥来验证令牌。
(2) 这里的 [1],它说 auth 服务器 生成 JWT,并在提供登录 + 验证后将其返回给客户端(开发人员端不涉及后端服务器)。
哪一个是正确的?如果它们都正确,我怎么知道该使用哪一个?
我的理解:
(1) 上面的#1 是开发人员将秘密存储在其应用程序的后端服务器中的一种。后端充当客户端和身份验证服务器之间的中间人,在不暴露秘密 + 访问令牌的情况下发出经过身份验证的请求。
(2) 上面的 #2 是应用程序根本没有后端服务器的情况(像 Angular/React 这样的 SPA)。客户端直接与身份验证服务器交互(也就是不涉及秘密)。根据 [1],IdP 仅使用客户端 ID、范围和其他一些东西来生成 JWT。
[0] https://enable.cx.sap.com/media/1_uup99qpg(跳至 1:49)
[1] https://auth0.com/blog/handling-authentication-in-react-with-context-and-hooks/(向下滚动到“向您的应用添加身份验证”下的第一个代码块,其中配置了 Auth0 实例)
【问题讨论】:
-
它究竟在哪里建议客户端应该生成令牌?如果没有对服务器的 api 请求,您如何验证用户身份?您将如何将秘密安全地存储在客户端上?
-
@JBallin 感谢您指出这一点。再看一遍,我误解了我在 #1 中的观点——我的意思是:应用程序开发人员必须创建 JWT(通过后端服务器)还是身份验证服务器必须创建它?为了清楚起见,编辑了问题。
-
@JBallin 关于这个问题,“你将如何在客户端安全地存储秘密?”:我见过的 SPA 指南不涉及秘密。它们只需要一个客户端 ID、回调 URI、范围,而身份验证服务器使用它来返回 JWT。从那里,客户端使用该 JWT 发出经过身份验证的请求(例如:auth0.com/blog/…,向下滚动到“向您的应用添加身份验证”并查看第一个代码块,其中配置了 Auth0 实例)。
-
auth0 链接已弃用,这是新链接:auth0.com/blog/complete-guide-to-react-user-authentication
标签: authentication jwt access-token