API Gateway声称正在调用自定义授权者,但在调用前拒绝了。

0

【以下的问题经过翻译处理】 我在API Gateway中设置了一个自定义授权者来验证在Authorization头部中的JWT。对于一些GET资源,授权者运行良好,但是对于一个特定的POST调用,它以403禁止(AccessDeniedException)拒绝:

{
    "message": "User is not authorized to access this resource"
}

我打开了API Gateway日志,并且对于这两个资源,它声称正在使用ID vf0zk6 调用授权者。这是API Gateway日志:

Extended Request Id: d0GmcE2HCYcFrVQ=
Starting authorizer: vf0zk6 for request: f23990ba-c1a4-4c71-9427-d28697735735
Incoming identity: ***************voGFIg
Extended Request Id: d0GmcE2HCYcFrVQ=
Using valid authorizer policy for principal: ************************f8069d
成功完成授权者执行
客户端未被授权执行此操作。
网关响应类型:ACCESS_DENIED,状态码:403
网关响应主体:{"message":"User is not authorized to access this resource"}
网关响应头:{Access-Control-Allow-Headers=Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token, Access-Control-Allow-Origin=*, Access-Control-Allow-Methods=OPTIONS,POST}
网关响应类型:ACCESS_DENIED,状态码:403

我还为自定义授权者Lambda启用了CloudWatch日志。我可以看到它成功的GET资源的日志,但是没有日志显示给失败的POST资源。因此,它看起来是未经调用即失败。这两个资源都使用完全相同的Authorization标头进行调用。

我通过创建新的授权者并将其指向相同的Lambda函数(禁用缓存)来暂时使其工作。但是,第二天,当我重新添加新授权者的缓存时,它再次失败,而没有调用Lambda函数。

(编辑)这与GET vs POST无关;一些 POST 资源成功,另一些则失败。这些请求是相同的,指向相同的授权者,但有些请求在调用自定义授权者 lambda 之前被拒绝,而其他请求则调用 lambda 并正常工作。

profile picture
专家
已提问 5 个月前49 查看次数
1 回答
0

【以下的回答经过翻译处理】 我曾通过创建新的授权器并将其指向相同的lambda函数(禁用缓存)来暂时解决它。但是第二天,当我重新添加新授权器的缓存时,它再次失败,没有调用任何lambda函数。

上述提示表明,缓存授权器导致了问题。如果您能够进行GET请求并且随后的GET请求成功,但随后的POST请求失败,则授权器返回的策略仅限于GET方法。

我建议遵循以下文章来解决问题。请参见名为“解决从Lambda授权器返回的“未经授权访问此资源”错误”部分。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则