首页 > 解决方案 > 在基于令牌的身份验证中,谁应该创建 JWT、应用程序开发人员或身份验证服务器?

问题描述

我有一个关于基于令牌的身份验证的一般性问题。我看过多个指南似乎在说相互矛盾的事情,所以我很困惑:

问题

谁应该负责创建 JWT、应用程序开发人员(通过应用程序的后端服务器)或身份验证服务器(例如身份提供者)?

(1) 此处 [0] 说明开发人员需要生成 + 散列 JWT 并将其用作任何请求的不记名令牌。从那里,身份验证服务器可以使用共享密钥来验证令牌。

(2) 此处 [1] 表示身份验证服务器生成 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实例已配置)

标签: authenticationjwtaccess-token

解决方案


根据项目需求/预算/时间表,JWT 可以由开发人员创建,也可以由第三方(例如 Auth0)管理。


条款

认证服务器

  • 接收用户凭据(例如用户名和密码)
  • 验证用户凭据(例如,将用户名存储在数据库中的哈希密码与请求中的密码哈希结果进行比较)
  • 如果令牌有效,服务器将使用用于验证未来请求的令牌进行响应(通常通过将其传递到身份验证服务器响应中的正确标头中自动存储在客户端的 cookie 中,然后可以自动包含在每个请求中) .
  • 可以从头开始编写(允许更多自定义),也可以通过 Auth0 等工具处理

方案 1 (SAP)

此场景涉及向第三方 API 发出经过身份验证的请求。

  • 您的前端接受用户凭据
  • 您的后端(“身份验证服务器”)验证凭据
  • 您的后端使用 JWT 令牌进行响应,该令牌使用 SAP 的 RSA 密钥、SAP 的用户 ID 以及后端服务器的用户 ID 创建,以便您可以确保发出请求的用户有权访问所请求的数据。注意:Auth0 可用于创建令牌,如果它支持存储自定义值并将其传递给 JWT
  • 您的前端向您的后端发出请求,包括 JWT
  • 您的后端确保授权(如果支持创建用于检查授权的自定义逻辑,则可以使用 Auth0),然后向 SAP 服务器发出相关请求(基于来自前端的请求)并传递 JWT 和 API 密钥(存储在您的服务器)与请求
  • SAP 验证 JWT,并使用请求的数据响应您的后端
  • 然后您的后端将相关数据传递给您的前端

场景 2 (Auth0) - YouTube 演示

此方案使用第三方身份验证服务器在您的前端和后端(两者都将利用 Auth0 工具)上对路由进行身份验证/授权。

  • 您的前端将用户定向到 Auth0 的登录页面
  • Auth0 重定向回你的前端,它存储 JWT
  • 当用户单击前端的按钮将他们带到不同的路径(例如/profile)时,您的前端可以使用 Auth0 来查看他们是否经过身份验证/授权并提取相关的用户数据。
  • 当用户单击前端向后端发出 API 请求的按钮时,它会随请求一起发送 JWT 令牌,后端使用该令牌使用 Auth0 进行身份验证,然后使用相关数据进行响应(如果用户被授权接收它)。

推荐阅读