web-dev-qa-db-ja.com

AWS API Gatewayカスタム認証で奇妙なエラーが表示される

ここにコンテキストがあります:

  • APIゲートウェイでリソースを設定しました。/user/company
  • このリソースには2つのメソッドがあります。取得してPOSTします。
  • このリソースのカスタム認証を構成しました。

問題:

  • 正しい認証情報を送信することでGETメソッドを呼び出すことができ、期待どおりの結果が得られます。
  • POSTリクエストを送信しようとすると、次のエラーが発生します。
{
  "message": "User is not authorized to access this resource"
}
  • 数分待ってからPOSTメソッドを呼び出すと、動作します。
  • POSTメソッドを呼び出して結果を取得した後、GETメソッドを呼び出すと、上記と同じエラーが表示されます。

さらに、オーソライザーのキャッシュを無効にしました。

enter image description here

この問題の原因は何ですか?

15
Arman Fatahi

これは、バギーの回答に記載されている2つのオプションで修正できます。 https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with -authorization-and-policy-cache/331

短縮版:

  1. TTL Customer Authorizerの場合は0に設定します
  2. カスタムオーソライザーポリシーリソースを「*」として設定します

両方のソリューションを試したところ、「ユーザーはこのリソースにアクセスする権限がありません」という問題が解決しました。

12
Orest

このエラーは、生成されたポリシーのリソースとして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": "*"

一部の高度なテンプレートでは ポリシー変数 を使用できます。

ワイルドカードを使用してすべてを許可し、別のポリシーステートメントで特定のリソースを拒否することにより、ブラックリストアプローチを使用することもできます。

出典:

3

カスタムポリシービルドコードの使用では、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();
2
Subrata Fouzdar

AuthorizerResultTtlInSeconds0に設定して、これを修正しました。

これは、共有の承認者を使用していたためです。ただし、承認者はリクエストのイベントコンテキストを読み取り、IAMに特定のラムダを呼び出すことを許可することで機能しました。

オーソライザーが共有されていたため、特定のラムダのIAMである応答をTTL(私の場合)の300秒)キャッシュしていました。

したがって、1つのAPIを1分で呼び出すことができ、次のAPIを呼び出すことはできません。

上記の値を0に変更すると、問題が修正されました。

1
Remotec