Authentication 在基于令牌的身份验证中,谁应该创建JWT、应用程序开发人员还是身份验证服务器?

Authentication 在基于令牌的身份验证中,谁应该创建JWT、应用程序开发人员还是身份验证服务器?,authentication,jwt,access-token,Authentication,Jwt,Access Token,我有一个关于基于令牌的身份验证的一般性问题。我见过多个指南似乎在说相互矛盾的话,所以我很困惑: 问题: 谁应该负责创建JWT、应用程序开发人员(通过应用程序的后端服务器)或身份验证服务器(例如身份提供商) (1) 在这里[0],它解释了开发人员需要生成+散列JWT,并将其用作任何请求的承载令牌。从那里,身份验证服务器可以使用共享密钥验证令牌 (2) 在这里[1],它说auth服务器生成JWT,并在登录被提供和验证后将其返回给客户端(开发人员方面不涉及后端服务器) 哪一个是正确的?如果两者都正确,

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

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

(1) 在这里[0],它解释了开发人员需要生成+散列JWT,并将其用作任何请求的承载令牌。从那里,身份验证服务器可以使用共享密钥验证令牌

(2) 在这里[1],它说auth服务器生成JWT,并在登录被提供和验证后将其返回给客户端(开发人员方面不涉及后端服务器)

哪一个是正确的?如果两者都正确,我怎么知道该用哪一个呢

我的理解是:

(1) #1是开发者在其应用程序的后端服务器中存储秘密的地方。backen充当客户端和身份验证服务器之间的中间人,在不公开secret+访问令牌的情况下发出经过身份验证的请求

(2) #2上面的应用程序根本没有后端服务器(像Angular/React这样的SPA)。客户机直接与身份验证服务器交互(即不涉及机密)。根据[1],IdP只使用客户机ID、作用域和其他一些东西来生成JWT

[0](跳到1:49)


[1] (向下滚动到“向应用程序添加身份验证”下的第一块代码,其中配置了Auth0实例)

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


条款 身份验证服务器
  • 接收用户凭据(例如用户名和密码)
  • 验证用户凭据(例如,将数据库中存储的用户名哈希密码与请求中的密码哈希结果进行比较)
  • 如果令牌有效,服务器将使用一个令牌进行响应,该令牌用于对未来的请求进行身份验证(通常自动存储在客户端的cookie中,方法是将其传递到auth服务器响应中的适当头中,然后可以将其自动包含在每个请求中)
  • 可以从头开始编写(允许更多自定义),也可以通过Auth0等工具进行处理
情景1(SAP) 此场景涉及向第三方API发出经过身份验证的请求

  • 您的前端接受用户凭据
  • 您的后端(“身份验证服务器”)验证凭据
  • 您的后端使用JWT令牌进行响应,JWT令牌是使用SAP的RSA密钥创建的,您的用户ID来自SAP,很可能还有来自后端服务器的用户ID,这样您就可以确保向您发出请求的用户有权访问请求的数据注意:如果Auth0支持存储自定义值并将其传递给JWT,则可以使用Auth0创建令牌
  • 前端向后端(包括JWT)发出请求
  • 您的后端确保授权(Auth0可用于创建用于检查授权的自定义逻辑),然后向SAP服务器发出相关请求(基于来自前端的请求),并将JWT和API密钥(存储在服务器上)与请求一起传递
  • SAP验证JWT,并用请求的数据响应您的后端
  • 然后,后端将相关数据传递到前端
场景2(Auth0)- 此场景使用第三方身份验证服务器对前端和后端上的路由进行身份验证/授权(两者都将利用Auth0工具)

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

它具体建议客户机在哪里生成令牌?如果没有对服务器的api请求,如何对用户进行身份验证?你如何将秘密安全地存储在客户机上?@JBallin感谢你指出这一点。再看一遍,我误解了我在#1中的观点——我的意思是:应用程序开发人员必须创建JWT(通过后端服务器)还是auth服务器必须创建它?为清晰起见,编辑了该问题。@JBallin关于“您如何将秘密安全地存储在客户身上?”的问题:我看到的SPA指南没有涉及秘密。它们只需要一个客户端ID、回调URI、作用域,身份验证服务器使用它返回JWT。从那里,客户端使用该JWT发出经过身份验证的请求(例如:,向下滚动至“向应用程序添加身份验证”,并查看第一段代码,其中配置了Auth0实例)。Auth0链接已被弃用,下面是新链接: