API网关缺少身份验证令牌错误通常是由于尝试访问受保护API资源时未提供有效的身份验证凭据所致。在API网关设置中启用身份验证选项,并识别您的API资源所需的身份验证机制可能有助于解决此问题。
以下是一个使用身份验证凭据的示例Lambda函数:
import json
def lambda_handler(event, context):
if 'Authorization' not in event['headers']:
raise Exception('Unauthorized')
authorization = event['headers']['Authorization']
token = authorization.split(' ')[1]
if token != 'valid_token':
raise Exception('Invalid credentials')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
在这个示例中,我们使用 Authorization
头部在API访问时提供凭据。如果没有提供此头部,将引发异常。然后,我们从头部中提取访问令牌并验证它是否与预期的值匹配。如果令牌无效,则会引发异常。否则,Lambda函数将返回200状态码和'Hello from Lambda!”消息体。
启用身份验证后,我们可以在API网关中定义一个自定义授权器来验证头部中的凭据并将其传递给后端Lambda函数。以下是一个示例自定义授权Lambda函数,它使用JWT令牌验证身份:
import json
import jwt
def lambda_handler(event, context):
token_str = event['authorizationToken']
token = token_str.split(' ')[1]
try:
decoded = jwt.decode(token, 'secret-key', algorithms=['HS256'])
except jwt.exceptions.DecodeError:
raise Exception('Invalid token')
principal_id = decoded['sub']
effect = 'Allow'
policy = {
'principalId': principal_id,
'policyDocument': {
'Version': '2012-10-17',
'Statement': [
{
'Action': 'execute-api:Invoke',
'Effect': effect,
'Resource': event['methodArn']
}
]
}
}
return policy
在此示例中,我们获取 authorizationToken
事件参数并从中提取JWT令牌。然后,我们使用给定的秘密密钥对令牌进行解码,