我在我的 Amazon API Gateway REST API 上將 Amazon Cognito 使用者集區設定為 COGNITO_USER_POOLS 授權者。我在 API 回應中收到「401 Unauthorized」錯誤。
解決方法
**注意:**API Gateway 傳回 401 Unauthorized 錯誤的原因有很多。下列程序顯示如何疑難排解僅與 COGNITO_USER_POOLS 授權者相關的 401 錯誤。
在 API 方法上檢查授權者的組態
請完成下列步驟:
- 開啟 API Gateway console (API Gateway 主控台)。
- 在導覽窗格中,選擇 API,然後選擇您的 API。
- 在導覽窗格中,選擇您 API 下的 Authorizers (授權者)。
- 檢閱授權者的組態,並確認以下事項屬實:
使用者集區 ID 與權杖發行者相符。
您已部署 API。
授權者在 ID 權杖的測試模式下運作。
**注意:**此功能無法用於測試存取權杖。
如需詳細資訊,請參閱整合 REST API 與 Amazon Cognito 使用者集區。
**注意:**如果在確認授權者的組態後無法調用 API,請檢查安全性權杖的有效性。
檢查安全性權杖的有效性
若要檢查安全性權杖的有效性,請確認以下事項屬實:
- 安全性權杖未過期。
- 安全性權杖中的發行者與 API 上設定的 Amazon Cognito 使用者集區相符。
- ID 權杖和存取權杖字串值是有效的。
**注意:**如果字串值有效,則可以解碼權杖。若權杖無效,請檢視您的權杖。確保權杖在通過請求標頭時沒有額外的空格。
重要:如果您未在 API Gateway 方法上設定任何範圍,請確定您使用有效的 ID 權杖。如果在 API Gateway 方法上設定了額外範圍,請確定您使用有效的存取權杖。如需更多資訊,請參閱如何在 Amazon Cognito 中使用自訂範圍授予對 API Gateway API 的存取權?
安全性權杖承載範例:
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 授權模式。如需更多資訊,請參閱 Postman 網站上的 Postman 中的 API 驗證與授權。
當您設定 OAuth 2.0 授權模式時,請確認下列事項屬實:
- Grant type (授與類型) 選項設定為 Authorization code (授權碼) 或 Authorization implicit (隱含授權)。
- 回呼網址與使用者集區的應用程式用戶端上設定的重新導向網址相符。
- 驗證網址格式如下:https://mydomain.auth.us-east-1.amazoncognito.com/login
**注意:**將 mydomain 替換為您用來設定使用者集區的網域名稱。確保您輸入託管您 API 的正確 AWS 區域。
- 用戶端 ID是使用者集區的應用程式用戶端 ID。
注意:如果您在使用者集區的應用程式用戶端上關聯了用戶端密碼,請在 Authorization (授權) 索引標籤中指定密碼。若使用者集區應用程式用戶端未關聯任何密碼,則將用戶端密碼欄位保留空白。
- Scope (範圍) 設定為 Openid。
**注意:**您必須允許使用者集區應用程式用戶端的 Openid 範圍。
- 在 Authorization code flow (授權碼流程),請輸入正確的 Amazon Cognito 使用者集區權杖端點。
Amazon Cognito 使用者集區權杖端點範例:
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
**注意:**如果權杖端點不支援該內容類型,Postman 將無法傳遞所需內容,並導致 405 錯誤。為避免此問題,請使用隱含流程。如需更多資訊,請參閱 OAuth 2.0 授權方式。
相關資訊
使用 Amazon Cognito 聯合身分識別、Amazon Cognito 使用者集區和 API Gateway 確保 API 存取權
如何解碼和驗證 Amazon Cognito JSON Web 權杖的簽章?
使用 Amazon Cognito 使用者集區作為授權者來控制對 REST API 的存取