如何验证API的Cognito用户已登录?React前端+Python后端场景
前端向后端发送请求并验证用户登录的方案
一、令牌选择:优先用访问令牌(Access Token)
- ID令牌:主要用于前端展示用户身份信息(比如用户名、邮箱),它的受众(
aud字段)是前端应用,不适合后端API的身份验证。 - 访问令牌:专门设计用来访问受保护的后端API,受众是你的后端服务,是后端验证用户身份的正确选择。
- 刷新令牌:仅用于在访问令牌过期时,向Cognito申请新的访问/ID令牌,绝对不能直接发送给后端API。
二、令牌的本质与验证方式
这些令牌都是JWT(JSON Web Token),验证时不需要额外依赖特殊库(基础JWT库即可),常规做法是本地验证,效率远高于远程调用Cognito:
- 从你的Cognito用户池公开密钥端点获取公钥(每个用户池对应一组公钥)
- 用公钥验证JWT的签名、有效期、受众(
aud)、发行方(iss)等核心字段是否合法
Python后端可以用pyjwt+cryptography实现本地验证,示例代码:
import jwt from jwt import PyJWKClient def verify_access_token(token, user_pool_id, backend_client_id): # 拼接Cognito公钥地址 region = user_pool_id.split('_')[0] jwks_url = f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}/.well-known/jwks.json" jwks_client = PyJWKClient(jwks_url) signing_key = jwks_client.get_signing_key_from_jwt(token) try: # 解码并验证令牌 payload = jwt.decode( token, signing_key.key, algorithms=["RS256"], audience=backend_client_id, issuer=f"https://cognito-idp.{region}.amazonaws.com/{user_pool_id}" ) return payload # 验证通过,返回用户身份信息 except jwt.InvalidTokenError: return None # 令牌无效或已过期
三、用boto3验证用户会话的可行性
可以用boto3调用Cognito的接口验证,但属于远程调用Cognito服务,会增加请求延迟和API调用成本,仅适合对安全性要求极高且能接受性能损耗的场景:
- 前端将访问令牌传给后端
- 后端调用
get_user接口验证令牌有效性
示例代码:
import boto3 # 初始化Cognito客户端 cognito_client = boto3.client('cognito-idp', region_name='你的区域') def verify_session_via_boto3(access_token): try: response = cognito_client.get_user(AccessToken=access_token) return response # 返回用户信息,说明会话有效 except cognito_client.exceptions.NotAuthorizedException: return None # 令牌无效、过期或无权限
四、前端发送请求的完整流程
- 用户通过
amazon-cognito-identity-js登录成功后,获取AccessToken - 前端发送API请求时,将访问令牌放在请求头的
Authorization字段中,格式为Bearer <你的Access Token> - 后端收到请求后,先提取
Authorization头中的令牌,再通过本地JWT验证或boto3远程验证确认身份 - 验证通过则返回业务数据,验证失败则返回
401 Unauthorized状态码
内容的提问来源于stack exchange,提问作者Jahill
相关产品推荐
相关产品推荐

