ここにコンテキストがあります:
問題:
{
"message": "User is not authorized to access this resource"
}
さらに、オーソライザーのキャッシュを無効にしました。
この問題の原因は何ですか?
これは、バギーの回答に記載されている2つのオプションで修正できます。 https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with -authorization-and-policy-cache/331
短縮版:
両方のソリューションを試したところ、「ユーザーはこのリソースにアクセスする権限がありません」という問題が解決しました。
このエラーは、生成されたポリシーのリソースとして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": "*"
一部の高度なテンプレートでは ポリシー変数 を使用できます。
ワイルドカードを使用してすべてを許可し、別のポリシーステートメントで特定のリソースを拒否することにより、ブラックリストアプローチを使用することもできます。
出典:
カスタムポリシービルドコードの使用では、node 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();
AuthorizerResultTtlInSeconds
を0
に設定して、これを修正しました。
これは、共有の承認者を使用していたためです。ただし、承認者はリクエストのイベントコンテキストを読み取り、IAMに特定のラムダを呼び出すことを許可することで機能しました。
オーソライザーが共有されていたため、特定のラムダのIAMである応答をTTL(私の場合)の300秒)キャッシュしていました。
したがって、1つのAPIを1分で呼び出すことができ、次のAPIを呼び出すことはできません。
上記の値を0に変更すると、問題が修正されました。