如何在 Django REST Framework 中跨多个 REST 服务实现 JWT 身份验证?

问题描述 投票:0回答:1

我最终将为这个项目提供多个微服务(计算、客户和其他)。 工作流程是:用户登录,获取 JWT,然后只要令牌尚未过期,就会多次调用各种服务。

我使用 Simple JWT 在 DRF 中创建了身份验证服务。 令牌调用和刷新效果很好。 我对 DRF 完全陌生,所以我不知道执行此操作的最佳方法。 我如何实现它以便其他服务知道令牌是有效的? 从架构上讲,每个微服务都将托管在 AWS 中自己的容器中。 我可以利用 AWS 的 API 管理来实现这一点吗?

非常感谢任何帮助。

django rest authentication jwt frameworks
1个回答
0
投票

要在 Django REST Framework (DRF) 中跨多个 REST 服务实现 JWT 身份验证,您需要一种策略来确保身份验证服务颁发的令牌可由其他微服务安全地验证。这是一个逐步的方法:


1.使用中央身份验证服务

  • 使用 DRF 创建中央身份验证服务和
    Simple JWT
    来颁发和刷新令牌。
  • 该服务将负责验证用户身份并生成 JSON Web 令牌 (JWT)。

2.分享秘钥或公钥

允许微服务验证 JWT,而不依赖于与身份验证服务的直接通信:

选项 1:共享密钥

  • 如果您使用对称加密(简单 JWT 的默认设置),所有微服务都需要访问身份验证服务使用的相同
    SECRET_KEY
    来验证 JWT。

选项 2:使用非对称加密

  • 配置 Simple JWT 以使用私钥 (
    RS256
    ) 来签署令牌并使用相应的公钥进行验证。将公钥分发给所有微服务。

生成密钥对:

openssl genrsa -out private.key 2048
openssl rsa -in private.key -pubout -out public.key

在身份验证服务中更新您的

settings.py

SIMPLE_JWT = {
    'ALGORITHM': 'RS256',
    'SIGNING_KEY': open('private.key').read(),
    'VERIFYING_KEY': open('public.key').read(),
}

在其他微服务中,仅提供公钥:

SIMPLE_JWT = {
    'ALGORITHM': 'RS256',
    'VERIFYING_KEY': open('public.key').read(),
}

3.配置 DRF 以验证令牌

对于所有微服务,使用 Django REST Framework 的自定义身份验证类来验证令牌。将其添加到

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

这可确保所有 API 端点都需要有效的 JWT,除非另有明确配置。


4.验证 JWT 中的声明

确保每个服务验证令牌的声明,例如:

  • Issuer (
    iss
    )
    :匹配身份验证服务的 URL 或标识符。
  • 受众 (
    aud
    )
    :标识令牌的预期接收者(特定于每个微服务,如果适用)。
  • 过期 (
    exp
    )
    :防止令牌过期后被使用。

配置 Simple JWT 以在生成令牌时包含这些声明:

from rest_framework_simplejwt.tokens import AccessToken

def generate_custom_token(user):
    token = AccessToken.for_user(user)
    token['iss'] = 'https://auth-service.example.com'
    token['aud'] = 'calculation-service'
    return str(token)

每个微服务都应该在中间件或自定义身份验证类中验证这些声明。


5.使用集中撤销策略(可选)

为了增加安全性,请在身份验证服务中实施令牌黑名单或撤销策略:

  • 将已撤销令牌的黑名单存储在数据库中。
  • 微服务可以调用身份验证服务来根据黑名单验证令牌。

或者,使用 JWT 生命周期 来最大程度地降低风险:

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

6.利用 AWS API Gateway(可选)

您可以使用 AWS API Gateway 卸载令牌验证:

  • 配置 API Gateway 以根据身份验证服务的公钥验证 JWT。
  • 仅当令牌有效时,API 网关才能将请求路由到适当的微服务。

7.微服务之间的安全通信

  • 使用 HTTPS 进行服务之间的所有通信。
  • 限制通过专用网络(例如 AWS VPC)访问微服务。
  • 使用 API 网关安全地公开公共端点。

8.测试设置

  • 第 1 步:通过身份验证服务登录并检索 JWT。
  • 第 2 步:使用 JWT 访问微服务上的端点。将令牌包含在
    Authorization
    标头中:
    Authorization: Bearer <your_jwt_token>
    
  • 第 3 步:验证令牌是否已验证以及是否适当地授予或拒绝访问权限。

总结

  1. 身份验证服务使用
    Simple JWT
    发出 JWT。
  2. 共享密钥或公钥使其他微服务能够验证令牌。
  3. 在每个微服务中配置DRF的JWTAuthentication
  4. (可选)使用 AWS API Gateway 集中处理令牌验证。
© www.soinside.com 2019 - 2024. All rights reserved.