如何在設定 Amazon Cognito 使用者集區之後,從 API Gateway REST API 端點疑難排解 "401 Unauthorized" (401 未經授權) 錯誤?

2 分的閱讀內容
0

我在我的 Amazon API Gateway REST API 上將 Amazon Cognito 使用者集區設定為 COGNITO_USER_POOLS 授權者。現在我在 API 回應中收到 "401 Unauthorized" (401 未經授權) 錯誤。如何疑難排解這些錯誤?

解決方法

**注意:**API Gateway 傳回 401 Unauthorized (401 未經授權) 錯誤的原因有很多。下列程序顯示如何疑難排解僅與 COGNITO_USER_POOLS 授權者相關的 401 錯誤。

在 API 方法上檢查授權者的組態

1.    在 API Gateway 主控台API 窗格中,選擇 API 的名稱。

2.    在導覽窗格中,選擇您 API 下的授權者

3.    檢閱授權者的設定,並確認以下事項屬實:
使用者集區 ID 與權杖發行者相符。
API 已部署完成。
授權者在測試模式下運行。

如需詳細資訊,請參閱整合 REST API 與 Amazon Cognito 使用者集區

**注意:**如果在 API 方法上確認授權者的組態後無法調用 API,請檢查安全性權杖的有效性。

檢查安全性權杖的有效性

當您安全性權杖的有效性性時,請確認以下事項屬實:

  • 安全性權杖未過期。
  • 安全性權杖中的發行者與 API 上設定的 Amazon Cognito 使用者集區相符。
  • ID 權杖存取權杖字串值是有效的。
    **注意:**如果字串值有效,則可以解碼權杖。如果權杖無效,請確保在請求標頭中傳遞時,權杖中沒有新增任何空格。

重要事項:如果 API Gateway 方法上沒有設定其他範圍,請確保您使用的是有效的 ID 權杖。如果 API Gateway 方法上設定了其他範圍,請確認您使用的是有效的存取權杖。如需詳細資訊,請參閱整合 REST API 與 Amazon Cognito 使用者集區,以及在 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

使用 OAuth 2.0 授權模式直接使用 Amazon Cognito 權杖。當您設定 OAuth 2.0 授權模式時,請確認下列事項屬實:

  • 授與類型授權****程式碼隱含授權,遵循使用者集區的應用程式用戶端上的組態。
  • 回呼網址與使用者集區的應用程式用戶端上設定的重新導向網址相符。
  • 驗證網址的格式如下:
https://mydomain.auth.us-east-1.amazoncognito.com/login

**重要事項:**以您用於設定使用者集區的網域名稱取代 mydomain。確保您輸入託管您 API 的正確 AWS 區域。

  • 用戶端 ID是使用者集區的應用程式用戶端 ID。
    注意:如果用戶端密碼與使用者集區的應用程式用戶端有關聯,請確定您在用戶端密碼欄位的授權索引標籤中指定用戶端密碼。如果沒有用戶端密碼與使用者集區的應用程式用戶端相關聯,則將用戶端密碼欄位保留空白。
  • 範圍設定為 openid
    **注意:**使用者集區的應用程式用戶端也必須允許 openid 範圍。
  • 正確的 Amazon Cognito 使用者集區權杖端點輸入於授權代碼流程

Amazon Cognito 使用者集區權杖端點範例

https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

**注意:**Postman 可能不會將必要的內容類型傳遞至權杖端點,因而導致 405 錯誤。但是,使用隱含流程時,您不會收到 504 錯誤。


相關資訊

使用 Amazon Cognito 聯合身分識別、Amazon Cognito 使用者集區和Amazon API Gateway 確保 API 存取權

如何解碼和驗證 Amazon Cognito JSON Web 權杖的簽章?

使用 Amazon Cognito 使用者集區作為授權方來控制對 REST API 的存取

AWS 官方
AWS 官方已更新 2 年前