在AWS JWT-Authorizer中,确实不支持"任何"受众。受众(audience)是JWT令牌的一个属性,用于指定该令牌的接收者。AWS JWT-Authorizer只支持验证受众与当前API Gateway配置的受众匹配的JWT令牌。
如果你想要实现不限制受众的验证逻辑,可以使用自定义的Lambda授权函数来替代JWT-Authorizer。下面是一个示例代码,演示了如何使用自定义Lambda授权函数来验证JWT令牌的受众。
import json
def lambda_handler(event, context):
# 获取JWT令牌
token = event['authorizationToken']
# 解码JWT令牌获取受众
# 这里使用了一个假设的解码逻辑,实际上需要使用你选择的JWT库来解码JWT令牌
decoded_token = decode_jwt(token)
audience = decoded_token['aud']
# 这里可以添加自定义的受众验证逻辑
# 如果受众验证通过,返回allow策略;否则返回deny策略
if audience == 'any':
# 受众验证通过,返回allow策略
return generate_policy('user', 'Allow', event['methodArn'])
else:
# 受众验证未通过,返回deny策略
return generate_policy('user', 'Deny', event['methodArn'])
def decode_jwt(token):
# 解码JWT令牌的逻辑
# 这里使用了一个假设的解码逻辑,实际上需要使用你选择的JWT库来解码JWT令牌
decoded_token = {
'aud': 'any' # 假设受众为"any"
}
return decoded_token
def generate_policy(principal_id, effect, resource):
auth_response = {
'principalId': principal_id,
'policyDocument': {
'Version': '2012-10-17',
'Statement': [
{
'Action': 'execute-api:Invoke',
'Effect': effect,
'Resource': resource
}
]
}
}
return auth_response
以上代码中,lambda_handler函数接收到API Gateway发送的事件,其中包含JWT令牌。你可以按照你选择的JWT库来解码JWT令牌,并获取受众。然后,你可以根据你的受众验证逻辑,返回相应的allow或deny策略。
这个自定义Lambda授权函数可以部署为API Gateway的授权函数,替代JWT-Authorizer。在API Gateway的配置中,将授权方式设置为"Lambda函数",并指定部署的这个Lambda函数。这样,API Gateway就会调用这个Lambda函数来验证JWT令牌,并根据返回的策略来授权访问。