gpt4 book ai didi

javascript - API 网关返回 403 - 禁止访问

转载 作者:搜寻专家 更新时间:2023-10-31 23:44:20 33 4
gpt4 key购买 nike

我有一个 API 网关,其端点由 AWS Lambda 代理集成实现。我还为此端点配置了自定义授权方。我看到一个问题,即我对该端点发出的第一个请求成功,但其他调用将失败;我收到 403 - 禁止错误。如果我稍等片刻,我可以发出另一个成功的请求,但随后我开始遇到同样的问题。

这是我的授权人代码:

const jwt = require('jsonwebtoken');

exports.authorizer = async function (event, context) {
const bearerToken = event.authorizationToken.slice(7);
const { payload } = jwt.decode(bearerToken);
return {
principalId: payload.sub,
policyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
}],
},
};
};

在此端点的 API 网关日志中,我可以看到授权方正在返回 Allow,但我仍然可以看到授权失败:

(50ac5f87-e152-4933-a797-63d84a528f61) The client is not authorized to perform this operation.

有谁知道这是怎么发生的或者为什么会发生?

最佳答案

我认为问题出在您的授权方发回的响应中。在您的政策文件中,您可以看到您正在返回 Resource: event.methodArn

这通常会起作用,前提是您的授权方未缓存来自自定义授权方的响应(默认情况下处于启用状态)。当您向 API 网关发出请求并取回与当前请求的请求 ARN 不匹配的缓存授权方响应时,就会出现您遇到的问题。 This post explains more about how Lambda authorizers work, including caching .

您可以通过进入 AWS 控制台并为您的自定义授权方禁用缓存来验证这是否是问题所在;执行此操作后,您应该不会再遇到此问题。

那么如何解决这个长期问题呢?有几个选项:

禁用缓存:这是最简单的解决方案。不利之处在于,您现在会针对每个请求调用您的授权方,这会给您的 API 带来更多延迟。

返回更广泛的策略:这是最好的解决方案,但更复杂。这里有几个选项,您可以在授权方响应中返回多个 Allow 策略,这些策略适用于使用此授权方的任何端点。

如果您查看 format of an authorizer request,您会发现 methodArn 采用以下格式:

{
"type":"TOKEN",
"authorizationToken":"{caller-supplied-token}",
    "methodArn":"arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
}

所以您可能会为 methodArn 返回类似这样的内容:

arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/e56bde3c-7c77-46c6-bdf0-ab4a8cb5f5ca

适用于此端点的任何资源的更广泛的政策是:

arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/*

如果您有多个端点使用同一个授权方,那么您可以返回多个策略:

{
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/GET/my-resource/*"
},
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/*/POST/my-resource"
}
]
}
}

关于javascript - API 网关返回 403 - 禁止访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55968925/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com