Amazon API Gateway REST API で、Amazon Cognito ユーザープールを COGNITO_USER_POOLS オーソライザーとして設定しました。API レスポンスで「401 Unauthorized」エラーを受け取るようになりました。このエラーのトラブルシューティング方法を教えてください。
解決方法
注: API Gateway は、さまざまな理由で 401 Unauthorized エラーを返すことがあります。次の手順は、COGNITO_USER_POOLS オーソライザーのみに関連する 401 エラーのトラブルシューティング方法を示しています。
API メソッドでのオーソライザーの設定を確認する
1. API Gateway コンソールの [API] ペインで、作成した API の名前を選択します。
2. ナビゲーションペインで、API の [Authorizers] (オーソライザー) を選択します。
3. オーソライザーの設定を確認し、次の条件に該当することを確認します。
ユーザープール ID がトークンの発行元と一致する。
API がデプロイされている。
オーソライザーはテストモードで動作する。
詳細については、「REST API と Amazon Cognito ユーザープールを統合する」を参照してください。
注: API メソッドでオーソライザーの設定を確認した後で API を呼び出すことができない場合は、セキュリティトークンが有効であるかを確認してください。
セキュリティトークンの有効性を確認する
セキュリティトークンの有効性を確認するときは、次の条件に該当することを確認します。
- セキュリティトークンの有効期限が切れていない。
- セキュリティトークンの発行者は、API で設定された Amazon Cognito ユーザープールと一致する。
- ID トークンとアクセストークン文字列の値が有効である。
注: 文字列の値が有効な場合は、トークンをデコードできます。トークンが有効でない場合は、リクエストヘッダーに渡されたときに、トークンにスペースが追加されていないことを確認してください。
重要: API Gateway メソッドで追加のスコープが設定されていない場合は、有効な ID トークンを使用していることを確認してください。API Gateway メソッドで追加のスコープが設定されている場合は、有効なアクセストークンを使用していることを確認してください。詳細については、「REST API と Amazon Cognito ユーザープールを統合する」および「using Amazon Cognito custom scopes in API Gateway」(API Gateway での Amazon Cognito カスタムスコープの使用) を参照してください。
セキュリティトークンのペイロードの例
Id token payload:
{
"sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"aud": "xxxxxxxxxxxxexample",
"email_verified": true,
"token_use": "id",
"auth_time": 1500009400,
"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
"cognito:username": "janedoe",
"exp": 1500013000,
"given_name": "Jane",
"iat": 1500009400,
"email": "janedoe@example.com"
}
Access token payload:
{
"auth_time": 1500009400,
"exp": 1500013000,
"iat": 1500009400,
"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
"scope": "aws.cognito.signin.user.admin",
"sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"token_use": "access",
"username": "janedoe@example.com"
}
セキュリティトークンのペイロードの例では、次のクレーム名に注意してください。
- token_use はトークンの種類 (ID またはアクセストークン) を示します。
- exp は、トークンの有効期限を示します。
注: exp クレームは、Unix エポック (1970-01-01T0:0:0Z) から、協定世界時 (UTC) でトークンの有効期限が切れるまでの秒数で表されます。
- auth_time は、トークンが発行された日時を示します。
- iss は、トークンを発行したユーザープールのドメインを示します。
重要:
- 使用しているトークンが、API Gateway メソッドで設定されているユーザープールと一致していることを確認してください。それでも API を呼び出すことができない場合は、認証ヘッダーを正しく使用していることを確認してください。
- それでも 401 エラーが表示される場合は、リソースポリシーがリクエストをブロックしていないことを確認してください。
Postman を使用して API を呼び出す場合
Amazon Cognito トークンを直接使用するには、OAuth 2.0 認証モードを使用します。OAuth 2.0 認証モードを設定するときは、次の条件に該当することを確認します。
- [Grant type] (付与タイプ) は、ユーザープールのアプリクライアントの設定に従って、[Authorization code] (承認コード) または [authorization implicit] (暗黙的な承認) である。
- コールバック URL は、ユーザープールのアプリクライアントで設定されたリダイレクトされた URL と一致する。
- 認証 URL は次の形式になっている。
https://mydomain.auth.us-east-1.amazoncognito.com/login
重要: mydomain を、ユーザープールの設定に使用するドメイン名に置き換えます。API がホストされている正しい AWS リージョンを入力していることを確認します。
- [Client ID] (クライアント ID) が、ユーザープールのアプリクライアント ID である。
注: クライアントシークレットがユーザープールのアプリクライアントに関連付けられている場合は、[client secret] (クライアントシークレット) フィールドの [Authorization] (認証) タブで、クライアントシークレットを指定してください。クライアントシークレットがユーザープールのアプリクライアントに関連付けられていない場合は、[client secret] (クライアントシークレット) フィールドを空白のままにします。
- [Scope] (スコープ) は [openid] として設定されている。
注: openid スコープは、ユーザープールのアプリクライアントでも許可されている必要があります。
- [認証コードフロー] には、正しい Amazon Cognito ユーザープールトークンエンドポイントが入力されている。
Amazon Cognito ユーザープールのトークンエンドポイントの例
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
注: Postman は、必要なコンテンツタイプをトークンエンドポイントに渡さない可能性があります。その結果、405 エラーが発生する場合があります。ただし、暗黙的なフローを使用すると、504 エラーが表示されません。
関連情報
Amazon Cognito フェデレーティッド ID、Amazon Cognito ユーザープール、Amazon API Gateway による API アクセスの保護
Amazon Cognito JSON ウェブトークンの署名を復号して検証する方法を教えてください。
Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する