Authentication JWT适合我吗?

Authentication JWT适合我吗?,authentication,oauth,oauth-2.0,jwt,Authentication,Oauth,Oauth 2.0,Jwt,我对使用我的前端应用程序访问我的RESTAPI的用户进行身份验证和授权的许多不同方法做了大量的研究。我已经构建了一个使用OAuth2和JWT的系统,并且需要一个健全性检查,因为我正在独自处理这个问题 作为一个背景,我的前端是使用Vue.js构建的,我的API是使用Django和Django Rest框架构建的。我的团队已经计划同时开发这个应用程序的移动版和桌面版,这两个版本都需要身份验证和授权 为了简单起见,我将省略我已有的其他解决方案,只讨论最具争议的一个 现在,OAuth2(我的授权服务器)

我对使用我的前端应用程序访问我的RESTAPI的用户进行身份验证和授权的许多不同方法做了大量的研究。我已经构建了一个使用OAuth2和JWT的系统,并且需要一个健全性检查,因为我正在独自处理这个问题

作为一个背景,我的前端是使用Vue.js构建的,我的API是使用Django和Django Rest框架构建的。我的团队已经计划同时开发这个应用程序的移动版和桌面版,这两个版本都需要身份验证和授权

为了简单起见,我将省略我已有的其他解决方案,只讨论最具争议的一个

现在,OAuth2(我的授权服务器)在用户向我的前端客户端提供电子邮件和密码时,使用ROPC向用户授予JWT令牌。我应该注意,我的API(我的资源服务器)和授权服务器位于同一台机器上

我的应用程序允许用户使用不同的计划(例如免费计划和付费计划)注册。当用户注册免费计划时,我需要前端应用程序不仅禁用UI中的某些功能和元素,还需要授权服务器和/或资源服务器限制该用户根据其计划可以查询的内容

这个想法是,当用户注册或登录时,我的授权服务器将从数据库中获取相关的用户记录,并创建一个有效的JWT,并附上声明,说明用户的计划以及一些其他非个人信息。然后,一旦签名,它会将其发送给用户,前端可以在其中启用/禁用部分UI。。。因此,如果用户登录手机,我们可以根据JWT发送的相同声明定制UI


我的问题是,我不知道这是否是一个好办法。我问过的圈子里的每个人似乎都不同意使用JWT。被任命的人大多会提出安全问题,但据我所知,许多JWT安全隐患都有很好的文档记录,并且可以像使用任何其他基于会话/令牌的身份验证一样使用一些常识来避免。我开始变得分析瘫痪了。请帮助。

分类

我想说这实际上是一个API授权问题,而不是OAuth问题:

  • 授权服务器和令牌的作用实际上只是证明用户的身份
  • 特定于产品的逻辑在用户登录后出现,通常最好在应用程序中处理
我的偏好

以下是我将如何处理它:

  • 当用户注册时,将计划类型保存到产品数据中
  • 登录后,从访问令牌中查找用户
  • 然后从产品数据中查找用户的计划类型
  • 在API中生成包含这两个元素的Claims/Principal对象
  • 基于计划类型声明强制执行业务规则
我的目标是这样的索赔对象:

class ApiClaims {

  // The user id in the access token
  userId: string;

  // The email
  email: string;

  // The plan type
  planType: string;

  // Other claims from the token

  // Other claims from product data, eg user roles
}
资源

如果对这种方法感兴趣,我的这些博客文章可能会感兴趣:

JWT?


您需要某种API凭据,它以HTTPS消息的形式发送,并且是web和移动友好的,因此我将使用JWTs。不过,对于任何API凭证,您都可以遵循相同的模式。

分类

我想说这实际上是一个API授权问题,而不是OAuth问题:

  • 授权服务器和令牌的作用实际上只是证明用户的身份
  • 特定于产品的逻辑在用户登录后出现,通常最好在应用程序中处理
我的偏好

以下是我将如何处理它:

  • 当用户注册时,将计划类型保存到产品数据中
  • 登录后,从访问令牌中查找用户
  • 然后从产品数据中查找用户的计划类型
  • 在API中生成包含这两个元素的Claims/Principal对象
  • 基于计划类型声明强制执行业务规则
我的目标是这样的索赔对象:

class ApiClaims {

  // The user id in the access token
  userId: string;

  // The email
  email: string;

  // The plan type
  planType: string;

  // Other claims from the token

  // Other claims from product data, eg user roles
}
资源

如果对这种方法感兴趣,我的这些博客文章可能会感兴趣:

JWT?


您需要某种API凭据,它以HTTPS消息的形式发送,并且是web和移动友好的,因此我将使用JWTs。不过,任何API凭证都可以遵循相同的模式。

这当然取决于您试图保护的内容,但JWT承载令牌是行业标准。由于您同时控制客户机和授权服务器,因此可以随意实现它

我将研究将资源所有者密码凭证流更改为授权代码流。它将使您能够使用谷歌或Facebook等社交身份验证提供商登录用户(同时仍在您自己的服务中维护计划信息)。人们可能更信任这些公司,因为它们比您的公司更能保证其凭据的安全,这使您能够从这些公司实施的任何身份验证功能(MFA)中获益


此外,如果您希望客户端读取令牌的内容,您应该使用OpenID Connect id_令牌,因为这些令牌被保证为JWT格式。

当然这取决于您试图保护的内容,但JWT承载令牌是行业标准。由于您同时控制客户机和授权服务器,因此可以随意实现它

我将研究将资源所有者密码凭证流更改为授权代码流。它将使您能够使用谷歌或Facebook等社交身份验证提供商登录用户(同时仍在您自己的服务中维护计划信息)。人们可能更信任这些公司,以保持他们的信誉