以下是上下文:
问题:
{
"message": "User is not authorized to access this resource"
}

此外,我已为授权人禁用了缓存。
可能导致此问题的原因是什么?
答案 0 :(得分:10)
这可以通过越野车的答案中描述的两个选项来解决:https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with-authorization-and-policy-cache/3310
简短版本:
尝试了两种解决方案,他们为我解决了“用户无权访问此资源”的问题。
答案 1 :(得分:1)
在您的自定义策略构建代码使用中,节点js模块aws-auth-policy 您可以使用的Nodejs部分,
AuthPolicy.prototype.allowAllMethods = function () {
addMethod.call(this, "allow", "*", "*", null);
}
在代码中
const AuthPolicy = require('aws-auth-policy');
const policy = new AuthPolicy(principalId, awsAccountId, apiOptions);
// policy.allowMethod(method, resource);
policy.allowAllMethods();
const authResponse = policy.build();
答案 2 :(得分:0)
如果您将event.methodArn
用作生成策略的资源,并在不同功能之间共享授权者,则将发生此错误,因为策略缓存的工作方式。对于提供的令牌,它将在整个API中缓存策略,对于同一API和阶段(如果它们共享相同的授权者)中的所有方法和资源,它将是相同的缓存条目。
例如,当向GET /users
发出请求时,ARN看起来像这样:
arn:aws:execute-api:us-1:abc:123/prod/GET/users
对具有相同身份验证令牌的任何终结点的下一次调用将使用在第一次调用GET /users
时创建的缓存策略。该缓存策略的问题在于它的资源仅允许单个特定资源arn: ... /prod/GET/users
,其他任何资源都将被拒绝。
根据要限制策略权限的数量,可以在创建策略时提及所有可能的资源
{
"principalId": "user",
"policyDocument": {
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": [
"arn:aws:execute-api:us-1:abc:123/prod/GET/v1/users",
"arn:aws:execute-api:us-1:abc:123/prod/POST/v1/users",
"arn:aws:execute-api:us-1:abc:123/prod/GET/v1/orders"
]
}
],
"Version": "2012-10-17"
}
}
或使用wildcards
"Resource": "arn:aws:execute-api:us-1:abc:123/prod/*/v?/*"
甚至
"Resource": "*"
您可以将policy variables用于某些高级模板。
通过允许使用通配符的所有内容,然后在另一条策略声明中拒绝特定资源,也可以使用黑名单方法。
来源:
答案 3 :(得分:0)
我通过将AuthorizerResultTtlInSeconds
设置为0
来解决此问题。
原因是我使用的是共享授权者。但是,授权者通过读取请求的事件上下文并授予IAM来调用特定的lambda来进行工作。
因为共享了授权者,所以它正在缓存响应,该响应是针对特定lambda的IAM,对于TTL(在我的情况下)为300秒。
因此,我可以一分钟调用一个API,而不是下一分钟。
将上述值更改为0可以解决此问题。
答案 4 :(得分:0)
我面临着同样的“用户无权访问此资源”的错误,因为我没有在api网关的授权者中提供OAuth范围