我将 Lambda 授权方与 AWS API Gateway 结合使用,但遇到 403 错误,即使我的 Lambda 授权方返回允许策略也是如此。
我检查了 Lambda 授权方函数,以确保它正确处理传入请求、解码 JWT 令牌并生成适当的策略文档。具体来说,我检查了该函数是否返回所需资源的允许效果,并且资源 ARN 是否与请求的方法和路径匹配。
export const handler = async function (event: any, callback: Callback, context: Context): Promise<APIGatewayAuthorizerResult> {
try {
logger.info('Event: ', event);
const permissions = await getUserIdFromEvent(event);
console.log('Permissions: ', permissions);
if (isAuthorized(event, permissions)) {
return {
principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
policyDocument: {
Version: '2012-10-17',
Statement: [
{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
},
],
}
} as AuthResponse;
} else {
return {
principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
policyDocument: {
Version: '2012-10-17',
Statement: [
{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
},
],
}
} as AuthResponse;
}
} catch (error) {
console.error(error);
return {
principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
policyDocument: {
Version: '2012-10-17',
Statement: [
{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
},
],
}
} as AuthResponse;
}
};
我检查了 Lambda 授权方函数,以确保它正确处理传入请求、解码 JWT 令牌并生成适当的策略文档。具体来说,我检查了该函数是否返回所需资源的允许效果,并且资源 ARN 是否与请求的方法和路径匹配。
总的来说,lambda 代码看起来相当不错,我在下面分享了一些建议(请参阅“Lambda 代码”)。
我无法判断API网关和Lambda之间的连接是否正确(要求在评论中分享这一点)。但我会指出如何做到这一点。
在 API Gateway 上,转到端点定义(在
Resources
下),您应该看到 Method request
。在其设置下,Authorization
应该有一个链接到您的 lambda 的令牌授权者。
要设置令牌授权者,请在 API 菜单中选择
Authorizers
,创建一个新的 Lambda
类型(更多详细信息请参见 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-使用-lambda-authorizer.html)。
一旦您分享更多信息,我们也许能够帮助您查明问题和相应的解决方案。
principalId
应该是用户的子,所以通常是解码后的JWT的sub
。
我看到您有
event.methodArn
作为声明的资源。您可以在那里使用 *
来帮助测试(然后,一旦您让它工作,您就可以迭代地关闭对所请求方法的访问)。
注意:我假设您共享的代码仅用于测试目的(允许所有请求通过),但您的 lambda 代码应在用户不应进行身份验证的情况下返回“拒绝”。我会有一个“如果用户可以通过身份验证,则允许他们”,然后在最后(在 try/catch 之外)返回一个“catch-all”返回“Deny”。
为了帮助调试正在处理的请求,您可以启用 API Gateway 的执行日志 (https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html)。
超级有用,它指示了请求处理的每一步:
在 API 网关上:
注意:不建议在生产环境中启用此功能 - 请参阅 ps://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html。