【问题标题】:Is JWT right for me?JWT 适合我吗?
【发布时间】:2020-10-02 09:41:20
【问题描述】:

我已经对许多不同的方法进行了大量研究,以验证和授权使用我的前端应用程序的用户访问我的 REST API。我已经构建了一个使用 OAuth2 和 JWT 的系统,并且需要进行健全性检查,因为我一个人在做这件事。

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

为了简单起见,我将省略我拥有的替代解决方案,只谈谈最具争议的解决方案。

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

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

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

我的问题是我不知道这是否是一个好方法。似乎我在我的圈子里问过的每个人都对是否使用 JWT 意见不一。那些并列的主要提出了安全问题,但是,据我了解,许多 JWT 安全陷阱都有据可查,只需使用一些常识就可以避免,就像任何其他基于会话/令牌的身份验证一样。我开始出现分析瘫痪。请帮忙。

【问题讨论】:

    标签: authentication oauth oauth-2.0 jwt


    【解决方案1】:

    分类

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

    • 授权服务器和令牌的作用其实只是为了证明用户的身份
    • 产品特定逻辑在用户登录后出现,通常最好在您的应用中处理

    我的偏好

    这是我的处理方式:

    • 在用户注册时将计划类型保存到您的产品数据中
    • 登录后,从访问令牌中查找用户
    • 然后从你的产品数据中查找用户的套餐类型
    • 在您的 API 中生成包含两者的 Claims / Principal 对象
    • 根据计划类型声明强制执行业务规则

    我的目标是像这样的 Claims 对象:

    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?

    您需要某种在 HTTPS 消息中发送且对 Web 和移动设备友好的 API 凭证,因此我会使用 JWT。不过,您可以使用任何 API 凭据遵循相同的模式。

    【讨论】:

      【解决方案2】:

      当然,这取决于您要保护什么,但 JWT 不记名令牌是行业标准。由于您同时控制客户端和授权服务器,因此您可以随心所欲地实现它。

      我会考虑将资源所有者密码凭据流更改为授权代码流。它将使您能够使用 Google 或 Facebook 等社交身份验证提供商来登录用户(同时仍然在您自己的服务中维护计划信息)。与您的公司相比,人们可能更信任这些公司来保证他们的凭据安全,并且它允许您从这些公司实施的任何身份验证功能 (MFA) 中受益。

      另外,如果您希望客户端读取令牌的内容,您应该使用 OpenID Connect id_tokens,因为它们保证为 JWT 格式。

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多