在前后端分离的架构下JWT认证该如何设计?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在前后端分离的架构下,JWT(JSON Web Token)认证的设计需要从前端、后端以及网关或中间层的角度进行综合考虑。以下是基于知识库资料的详细设计建议:
前端负责生成认证请求、存储Token以及在业务请求中携带Token。
localStorage
或sessionStorage
),以便后续请求使用。Authorization: Bearer {token}
的方式携带Token。exp
字段),前端需实现Token刷新机制,通常通过刷新Token接口获取新的Token。后端主要负责Token的签发、验证以及业务逻辑处理。
Token签发:
sub
、aud
、exp
等标准Claim)。import jwt
import time
private_key = """-----BEGIN PRIVATE KEY-----
... (私钥内容)
-----END PRIVATE KEY-----"""
payload = {
"sub": "user_id", # 用户标识
"aud": "client_id", # 受众
"exp": int(time.time()) + 3600, # 过期时间
"iat": int(time.time()), # 签发时间
}
token = jwt.encode(payload, private_key, algorithm="RS256")
print(token)
exp
)、受众(aud
)等。jti
字段实现防重放检查,确保每个Token只能使用一次。sub
、roles
等),并根据这些信息执行业务逻辑。在前后端分离架构中,网关或中间层可以作为统一的认证入口,减轻后端服务的压力。
jwks:
keys:
- alg: "RS256"
e: "AQAB"
kty: "RSA"
n: "qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ"
sub
、roles
)映射为后端服务所需的参数,并通过Header、Query参数或表单参数传递给后端。为了提升JWT认证的安全性,需注意以下几点:
exp
),避免长期有效的Token被滥用。jti
),并在网关或后端记录已使用的jti
,防止Token被重复使用。以下是一个完整的JWT认证流程示例:
用户登录:
业务请求:
Authorization: Bearer {token}
。Token验证:
exp
、aud
等字段是否有效。请求转发:
通过上述设计,您可以构建一个安全、高效的JWT认证系统,满足前后端分离架构的需求。