我最终将为这个项目提供多个微服务(计算、客户和其他)。 工作流程是:用户登录,获取 JWT,然后只要令牌尚未过期,就会多次调用各种服务。
我使用 Simple JWT 在 DRF 中创建了身份验证服务。 令牌调用和刷新效果很好。 我对 DRF 完全陌生,所以我不知道执行此操作的最佳方法。 我如何实现它以便其他服务知道令牌是有效的? 从架构上讲,每个微服务都将托管在 AWS 中自己的容器中。 我可以利用 AWS 的 API 管理来实现这一点吗?
非常感谢任何帮助。
要在 Django REST Framework (DRF) 中跨多个 REST 服务实现 JWT 身份验证,您需要一种策略来确保身份验证服务颁发的令牌可由其他微服务安全地验证。这是一个逐步的方法:
Simple JWT
来颁发和刷新令牌。允许微服务验证 JWT,而不依赖于与身份验证服务的直接通信:
SECRET_KEY
来验证 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(),
}
对于所有微服务,使用 Django REST Framework 的自定义身份验证类来验证令牌。将其添加到
settings.py
:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
这可确保所有 API 端点都需要有效的 JWT,除非另有明确配置。
确保每个服务验证令牌的声明,例如:
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)
每个微服务都应该在中间件或自定义身份验证类中验证这些声明。
为了增加安全性,请在身份验证服务中实施令牌黑名单或撤销策略:
或者,使用 JWT 生命周期 来最大程度地降低风险:
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
您可以使用 AWS API Gateway 卸载令牌验证:
Authorization
标头中:
Authorization: Bearer <your_jwt_token>
Simple JWT
发出 JWT。