【问题标题】:In token-based authentication, who should create the JWT, the app developer or the auth server?在基于令牌的身份验证中,谁应该创建 JWT、应用程序开发人员或身份验证服务器?
【发布时间】: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


【解决方案1】:

根据项目需求/预算/时间线,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 Demo

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

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

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2016-06-18
    • 2018-08-15
    • 2018-05-10
    相关资源
    最近更新 更多