在 AWS Cognito 中,当使用无效的令牌签名或无法在密钥列表中匹配所需的密钥标识符时,会出现错误消息 "Invalid token signature. Unable to match the desired key identifier in the key list"。
这个错误通常是由于以下几个原因引起的:
为了解决这个问题,你可以按照以下步骤进行排查和修复:
确保令牌签名有效且未过期。你可以使用 JWT 解码工具来验证令牌的有效性和过期时间。
检查令牌中使用的密钥标识符是否正确。在 AWS Cognito 中,令牌中的 kid 字段表示密钥标识符。确保你使用了正确的 kid 值。
检查密钥是否正确。AWS Cognito 使用一组公钥来验证令牌签名。你需要使用正确的公钥来验证令牌。你可以通过以下代码示例从 AWS Cognito 获取公钥并验证令牌签名:
import jwt
import requests
def validate_token(token):
# 获取公钥
keys_url = 'https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json'
keys_response = requests.get(keys_url)
keys = keys_response.json()['keys']
# 查找匹配的密钥
header = jwt.get_unverified_header(token)
matched_keys = [k for k in keys if k['kid'] == header['kid']]
if len(matched_keys) == 0:
raise ValueError('No matching key found')
# 验证令牌签名
key = matched_keys[0]
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
jwt.decode(token, public_key, algorithms=['RS256'])
通过以上代码,你可以获取 AWS Cognito 的公钥,并使用 jwt.decode 方法验证令牌签名是否有效。
如果以上步骤仍然无法解决问题,可能是由于其他原因引起的。你可以查看 AWS Cognito 的文档或联系 AWS 支持团队来获取更多帮助。