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

时间:2020-07-10 18:21:43

标签: authentication jwt access-token

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

问题

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

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

(2)在这里[1],它表示 auth服务器生成JWT,并在提供登录名+验证后将其返回给客户端(开发者一方不涉及后端服务器)。

哪个是正确的?如果它们都正确,我怎么知道要使用哪个?

我的理解:

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

上面的

(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实例)

1 个答案:

答案 0 :(得分:1)

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


条款

身份验证服务器

  • 接收用户凭据(例如用户名和密码)
  • 验证用户凭据(例如,将用户名在数据库中存储的哈希密码与对请求中密码进行哈希处理的结果进行比较)
  • 如果令牌有效,则服务器会使用令牌进行身份验证,该令牌用于对以后的请求进行身份验证(通常通过将其传递到auth服务器响应中的适当标头中而自动存储在客户端的Cookie中,然后可以自动将其包含在每个请求)。
  • 可以从头开始编写(允许更多自定义),或者可以通过Auth0之类的工具进行处理

方案1(SAP)

这种情况涉及向第三方API发出经过身份验证的请求。

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

方案2(Auth0)-YouTube Demo

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

  • 您的前端将用户定向到Auth0的登录页面
  • Auth0重定向回到存储JWT的前端
  • 当用户点击前端上的将其转到其他路由的按钮(例如/ profile)时,前端可以使用Auth0查看他们是否已通过身份验证/授权并提取相关的用户数据。
  • 当用户单击前端上向后端发送API请求的按钮时,它会将请求发送给JWT令牌,后端将使用该令牌通过Auth0进行身份验证,然后使用相关数据进行响应(如果用户有权接收它。)