

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 重新導向和授權端點
<a name="authorization-endpoint"></a>

`/oauth2/authorize` 端點是支援兩個重新導向目的地的重新導向端點。如果您在 URL 中包含 `identity_provider` 或 `idp_identifier` 參數，則會以無提示的方式將您的使用者重新導向到該身分提供者 (IdP) 的登入頁面。否則，它會使用您在請求中包含的相同 URL 參數重新導向至[登入端點](login-endpoint.md)。

授權端點會重新導向至受管登入或 IdP 登入頁面。此端點上的使用者工作階段目的地是使用者必須直接在瀏覽器中與之互動的網頁。

若要使用授權端點，請在 `/oauth2/authorize` 叫用使用者的瀏覽器，並搭配為使用者集區提供有關下列使用者集區詳細資訊的參數。
+ 您要登入的應用程式用戶端。
+ 您最後想要使用的回呼 URL。
+ 您將要在使用者存取權杖中請求的 OAuth 2.0 範圍。
+ 或者，您要用來登入的第三方 IdP。

您也可以提供 `state` 和 `nonce` 參數，讓 Amazon Cognito 用來驗證傳入宣告。

## GET `/oauth2/authorize`
<a name="get-authorize"></a>

`/oauth2/authorize` 端點僅支援 `HTTPS GET`。您的應用程式通常會在使用者的瀏覽器中啟動此請求。您只能透過 HTTPS 向 `/oauth2/authorize` 端點提出請求。

您可以在 [Authorization Endpoint](http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthorizationEndpoint) (授權端點) 進一步了解 OpenID Connect (OIDC) 標準中的授權端點定義。

### 請求參數
<a name="get-authorize-request-parameters"></a>

**`response_type`**  
必要.  
回應類型。必須是 `code` 或 `token`。  
`response_type` 為 `code` 的成功請求會傳回授權碼授與。授權碼授與是 Amazon Cognito 附加到您的重新導向 URL 的 `code` 參數。您的應用程式可以針對存取、ID 及重新整理權杖和 [權杖端點](token-endpoint.md) 交換代碼。作為安全最佳實務，並為您的使用者接收重新整理權杖，請在您的應用程式中使用授權碼授與。  
具有 `token` 之 `response_type` 的成功請求會傳回隱含授與。隱含授與是 Amazon Cognito 附加到您的重新導向 URL 的 ID 和存取權杖。隱含授與不太安全，因為它會向使用者公開權杖和潛在的識別資訊。您可以在應用程式用戶端的組態中停用對隱含授與的支援。

**`client_id`**  
必要.  
應用程式用戶端 ID。  
`client_id` 的值必須是您提出請求之使用者集區中應用程式用戶端的 ID。您的應用程式用戶端必須支援 Amazon Cognito 本機使用者或至少一個第三方 IdP 登入。

**`redirect_uri`**  
必要.  
Amazon Cognito 授權使用者之後，身分驗證伺服器會將瀏覽器重新引導至此 URL。  
重新導向統一資源識別符 (URI) 必須具有下列屬性：  
+ 必須是絕對 URI。
+ 您必須已預先以用戶端註冊此 URI。
+ 不得包含片段元件。
請參閱 [OAuth 2.0 - 重新導向端點](https://tools.ietf.org/html/rfc6749#section-3.1.2)。  
Amazon Cognito 需要您的重新導向 URI 使用 HTTPS，但 `http://localhost` 除外，您可以將其設定為回呼 URL 以供測試之用。  
Amazon Cognito 也支援應用程式回呼，例如 `myapp://example`。

**`state`**  
選用，建議。  
如果您的應用程式將 *state* 參數新增至請求，則當 `/oauth2/authorize` 端點重新導向您的使用者時，Amazon Cognito 會將其值傳回到您的應用程式。  
將此值新增至您的請求，以防禦 [CSRF](https://en.wikipedia.org/wiki/Cross-site_request_forgery) 攻擊。  
您無法將 `state` 參數的值設定為 URL 編碼的 JSON 字串。若要在`state`參數中傳遞符合此格式的字串，請將字串編碼為 base64，然後在應用程式中將其解碼。

**`identity_provider`**  
選用。  
新增此參數以略過受管登入，並將您的使用者重新導向至提供者登入頁面。*identity\$1provider* 參數的值是身分提供者 (IdP) 在使用者集區中顯示的名稱。  
+ 對於社交提供者，您可以使用 *identity\$1provider* 值 `Facebook`、`LoginWithAmazon`、 `Google`和 `SignInWithApple`。
+ 對於 Amazon Cognito 使用者集區，請使用值 `COGNITO`。
+ 對於 SAML 2.0 和 OpenID Connect(OIDC) 身分提供者 (IdPs)，請使用您在使用者集區中指派給 IdP 的名稱。

**`idp_identifier`**  
選用。  
新增此參數以透過 *identity\$1provider* 名稱的替代名稱重新導向至供應商。您可以從 Amazon Cognito 主控台的**社交和外部提供者**選單輸入 SAML 2.0 和 OIDC IdPs 的識別符。

**`scope`**  
選用。  
可以合併任何系統預留範圍或與用戶端相關聯的自訂範圍。範圍必須以空格隔開。系統預留範圍為 `openid`、`email`、`phone`、`profile` 和 `aws.cognito.signin.user.admin`。所使用的任何範圍都必須與用戶端建立關聯，否則在執行時間會將其忽略。  
如果用戶端沒有請求任何範圍，則身分驗證伺服器會使用與用戶端相關聯的所有範圍。  
只有在請求 `openid` 範圍時，才會傳回 ID 權杖。只有在請求 `aws.cognito.signin.user.admin` 範圍時，才能對 Amazon Cognito 使用者集區使用存取權杖。只有在也同時請求 `phone` 範圍時，才能請求 `email`、`profile` 和 `openid` 範圍。這些範圍需要有進入 ID 權杖中的宣告。

**`code_challenge_method`**  
選用。  
您用來產生挑戰的雜湊通訊協定。[PKCE RFC](https://tools.ietf.org/html/rfc7636) 定義兩種方法：S256 和一般，但是 Amazon Cognito 身分驗證伺服器只支援 S256。

**`code_challenge`**  
選用。  
您從 產生的金鑰碼交換 (PKCE) 挑戰證明`code_verifier`。如需詳細資訊，請參閱[在授權碼授予中使用 PKCE](using-pkce-in-authorization-code.md)。  
僅當您指定 `code_challenge_method` 參數時才需要。

**`nonce`**  
選用。  
可新增至請求的隨機值。您提供的 nonce 值包含在 Amazon Cognito 發出的 ID 權杖中。為了防止重播攻擊，您的應用程式可以檢查 ID 權杖中的 `nonce` 宣告並將其與您產生的權杖進行比較。如需 `nonce` 宣告的詳細資訊，請參閱 *OpenID Connect standard* (OpenID Connect 標準) 中的 [ID token validation](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation) (ID 權杖驗證)。

**`lang`**  
選用。  
您要顯示使用者互動頁面的語言。受管登入頁面可以當地語系化，但託管 UI （傳統） 頁面無法。如需詳細資訊，請參閱[受管登入當地語系化](cognito-user-pools-managed-login.md#managed-login-localization)。

**`login_hint`**  
選用。  
您要傳遞給授權伺服器的使用者名稱提示。您可以從使用者收集使用者名稱、電子郵件地址或電話號碼，並允許目的地提供者預先填入使用者的登入名稱。當您將`login_hint`參數和沒有 `idp_identifier`或 `identity_provider` 參數提交至`oauth2/authorize`端點時，受管登入會以您的提示值填入使用者名稱欄位。您也可以將此參數傳遞至 ，[登入端點](login-endpoint.md)並自動填入使用者名稱值。  
當您的授權請求調用重新導向至 OIDC IdPs時，Amazon Cognito 會將 `login_hint` 參數新增至該第三方授權方的請求。您無法將登入提示轉送至 SAML、Apple、Login with Amazon、Google 或 Facebook (Meta) IdPs。

**`prompt`**  
選用。  
OIDC 參數，可控制現有工作階段的身分驗證行為。僅適用於受管登入品牌版本，不適用於傳統託管 UI。如需 OIDC 規格的詳細資訊，請參閱[身分驗證請求](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest)。值 `none`和 `login` 會影響使用者集區身分驗證行為。  
使用者透過第三方供應商選取身分驗證時，Amazon Cognito 會將 `prompt` 以外的所有值轉送`none`到您的 IdPs。當使用者存取的 URL 包含 `identity_provider`或 `idp_identifier` 參數，或當授權伺服器將他們重新導向至 ，[登入端點](login-endpoint.md)並從可用的按鈕中選取 和 IdP 時，就會發生這種情況。  
**提示參數值**    
`prompt=none`  
對於具有有效驗證工作階段的使用者，Amazon Cognito 會無提示地繼續身分驗證。使用此提示，使用者可以在使用者集區中的不同應用程式用戶端之間進行無提示驗證。如果使用者尚未驗證，授權伺服器會傳回`login_required`錯誤。  
`prompt=login`  
Amazon Cognito 要求使用者重新驗證，即使他們有現有的工作階段。當您想要再次驗證使用者的身分時，請傳送此值。具有現有工作階段的已驗證使用者可以返回登入，而不會使該工作階段失效。當具有現有工作階段的使用者再次登入時，Amazon Cognito 會為其指派新的工作階段 Cookie。此參數也可以轉送到您的 IdPs。接受此參數的 IdPs也會向使用者請求新的身分驗證嘗試。  
`prompt=select_account`  
此值不會影響本機登入，且必須在重新導向至 IdPs請求中提交。當包含在授權請求中時，此參數會`prompt=select_account`新增至 IdP 重新導向目的地的 URL 路徑。當 IdPs支援此參數時，他們會請求使用者選取要登入的帳戶。  
`prompt=consent`  
此值不會影響本機登入，且必須在重新導向至 IdPs請求中提交。當包含在授權請求中時，此參數會`prompt=consent`新增至 IdP 重新導向目的地的 URL 路徑。當 IdPs支援此參數時，他們會在重新導向回您的使用者集區之前請求使用者同意。
當您從請求中省略 `prompt` 參數時，受管登入會遵循預設行為：使用者必須登入，除非其瀏覽器具有有效的受管登入工作階段 Cookie。您可以結合 的多個值`prompt`與空格字元分隔符號，例如 `prompt=login consent`。

**`resource`**  
選用。  
您要繫結至`aud`宣告中存取權杖之資源的識別符。當您包含此參數時，Amazon Cognito 會驗證該值是否為 URL，並將產生的存取字符的對象設定為請求的資源。您可以使用 URL 格式的識別符或您選擇的 URL 來請求使用者集區[資源伺服器](cognito-user-pools-define-resource-servers.md)。此參數的值必須以 `https://`、 `http://localhost`或自訂 URL 結構描述開頭，例如 `myapp://`。  
資源繫結在 [RFC 8707 ](https://www.rfc-editor.org/rfc/rfc8707.html)中定義。如需資源伺服器和資源繫結的詳細資訊，請參閱[資源繫結](cognito-user-pools-define-resource-servers.md#cognito-user-pools-resource-binding)。

## 範例：授權碼授予
<a name="sample-authorization-code-grant"></a>

這是授權碼授予的範例請求。

下列請求會啟動工作階段，以擷取您的使用者在`redirect_uri`目的地傳送到您應用程式的授權碼。此工作階段會請求使用者屬性的範圍，以及存取 Amazon Cognito 自助式 API 操作的範圍。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=openid+profile+aws.cognito.signin.user.admin
```

Amazon Cognito 身分驗證伺服器會附上授權碼和狀態，重新引導回應用程式。授權碼的有效時間為五分鐘。

```
HTTP/1.1 302 Found
Location: https://www.example.com?code=a1b2c3d4-5678-90ab-cdef-EXAMPLE11111&state=abcdefg
```

## 範例：使用 PKCE 授權碼授予
<a name="sample-authorization-code-grant-with-pkce"></a>

此範例流程會使用 [PKCE](using-pkce-in-authorization-code.md#using-pkce-in-authorization-code.title) 執行授權碼授予。

此請求會新增`code_challenge`參數。若要完成交換字符的程式碼，您必須在對`/oauth2/token`端點的請求中包含 `code_verifier` 參數。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=aws.cognito.signin.user.admin&
code_challenge_method=S256&
code_challenge=a1b2c3d4...
```

授權伺服器會使用授權碼和狀態重新導向回您的應用程式。您的應用程式會處理授權碼，並將其交換為字符。

```
HTTP/1.1 302 Found
Location: https://www.example.com?code=a1b2c3d4-5678-90ab-cdef-EXAMPLE11111&state=abcdefg
```

## 範例： 需要使用 重新驗證 `prompt=login`
<a name="sample-authorization-code-with-prompt-login"></a>

下列請求會新增`prompt=login`參數，要求使用者再次驗證，即使他們有現有的工作階段。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=openid+profile+aws.cognito.signin.user.admin&
prompt=login
```

授權伺服器會重新導向至[登入端點](login-endpoint.md)，需要重新驗證。

```
HTTP/1.1 302 Found Location: https://mydomain.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&state=abcdefg&scope=openid+profile+aws.cognito.signin.user.admin&prompt=login
```

## 範例：使用 進行無提示身分驗證 `prompt=none`
<a name="sample-authorization-code-with-prompt-none"></a>

下列請求會新增`prompt=none`參數，以無提示方式檢查使用者是否有有效的工作階段。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=openid+profile+aws.cognito.signin.user.admin&
prompt=none
```

當沒有有效的工作階段時，授權伺服器會將錯誤傳回至重新導向 URI

```
HTTP/1.1 302 Found Location: https://www.example.com?error=login_required&state=abcdefg
```

當有效的工作階段存在時，授權伺服器會傳回授權碼。

```
HTTP/1.1 302 Found Location: https://www.example.com?code=AUTHORIZATION_CODE&state=abcdefg
```

## 範例：具有資源繫結的授權碼授予
<a name="sample-authorization-code-with-resource-binding"></a>

下列請求新增 `resource` 參數，將存取權杖繫結至特定資源伺服器。產生的存取權杖會建立目標 API 的條件，以驗證其是否為已驗證使用者請求的目標對象。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=code&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=solar-system-data-api.example.com/asteroids.add&
resource=https://solar-system-data-api.example.com
```

授權伺服器會傳回授權碼，導致具有 `aud`宣告的存取權杖`https://solar-system-data-api.example.com`。

```
HTTP/1.1 302 Found Location: https://www.example.com?code=AUTHORIZATION_CODE&state=abcdefg
```

## 範例：無`openid`範圍的字符 （隱含） 授予
<a name="sample-token-grant-without-openid-scope"></a>

此範例流程會產生隱含授予，並將 JWTs 直接傳回至使用者的工作階段。

請求是針對來自授權伺服器的隱含授予。它會請求存取字符中的範圍，以授權使用者設定檔自助式操作。

```
GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize?
response_type=token&
client_id=1example23456789&
redirect_uri=https://www.example.com&
state=abcdefg&
scope=aws.cognito.signin.user.admin
```

授權伺服器只會使用存取字符重新導向回您的應用程式。由於未請求 `openid` 範圍，Amazon Cognito 不會傳回 ID 權杖。此外，Amazon Cognito 不會在此流程中傳回重新整理權杖。

```
HTTP/1.1 302 Found
Location: https://example.com/callback#access_token=eyJra456defEXAMPLE&token_type=bearer&expires_in=3600&state=STATE
```

## 範例：具有`openid`範圍的字符 （隱含） 授予
<a name="sample-token-grant-with-openid-scope"></a>

此範例流程會產生隱含授予，並將字符傳回至使用者的瀏覽器。

請求是針對來自授權伺服器的隱含授予。它會請求存取字符中的範圍，以授權存取使用者屬性和自助式操作。

```
GET
https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? 
response_type=token& 
client_id=1example23456789& 
redirect_uri=https://www.example.com& 
state=abcdefg&
scope=aws.cognito.signin.user.admin+openid+profile
```

授權伺服器會使用存取字符和 ID 字符 （因為包含`openid`範圍） 重新導向回您的應用程式：

```
HTTP/1.1 302 Found
Location: https://www.example.com#id_token=eyJra67890EXAMPLE&access_token=eyJra12345EXAMPLE&token_type=bearer&expires_in=3600&state=abcdefg
```

## 負向回應的範例
<a name="get-authorize-negative"></a>

Amazon Cognito 可能會拒絕您的請求。負面請求隨附 HTTP 錯誤代碼和描述，您可以用來更正請求參數。以下是負面回應的範例。
+ 如果 `client_id`和 `redirect_uri` 有效，但請求參數格式不正確，身分驗證伺服器會將錯誤重新導向至用戶端的 ，`redirect_uri`並在 URL 參數中附加錯誤訊息。以下是格式不正確的範例。
  + 請求不包含`response_type`參數。
  + 授權請求提供`code_challenge`參數，但不提供`code_challenge_method`參數。
  + `code_challenge_method` 參數的值不是 `S256`。

  以下是對格式不正確之範例請求的回應。

  ```
  HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request
  ```
+ 如果用戶端在 `token`中請求 `code`或 `response_type`，但沒有這些請求的許可，Amazon Cognito 授權伺服器會傳回`unauthorized_client`用戶端的 `redirect_uri`，如下所示：

  ```
  HTTP 1.1 302 Found Location: https://client_redirect_uri?error=unauthorized_client
  ```
+  如果用戶端請求的範圍不明、範圍格式不正確或無效，Amazon Cognito 授權伺服器會將 `invalid_scope` 傳回用戶端的 `redirect_uri`，如下所示：

  ```
  HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_scope
  ```
+ 如果伺服器中有任何非預期的錯誤，身分驗證伺服器`server_error`會傳回用戶端的 `redirect_uri`。由於 HTTP 500 錯誤不會傳送到用戶端，因此錯誤不會顯示在使用者的瀏覽器中。授權伺服器會傳回下列錯誤。

  ```
  HTTP 1.1 302 Found Location: https://client_redirect_uri?error=server_error
  ```
+ 當 Amazon Cognito 透過聯合身分驗證第三方 IdPs 時，Amazon Cognito 可能會遇到連線問題，如下所示：
  + 如果在向 IdP 請求權杖時，發生連線逾時，身分驗證伺服器則會如下所示，將錯誤重新導向至用戶端的 `redirect_uri`：

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Timeout+occurred+in+calling+IdP+token+endpoint
    ```
  + 如果在呼叫`jwks_uri`端點進行 ID 字符驗證時發生連線逾時，身分驗證伺服器會以錯誤重新導向至用戶端的 `redirect_uri` ，如下所示：

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=error_description=Timeout+in+calling+jwks+uri
    ```
+ 透過聯合第三方 IdPs時，供應商可能會傳回錯誤回應。這可能是由於組態錯誤或其他原因，例如：
  + 如果從其他供應商收到錯誤回應，身分驗證伺服器則會如下所示，將錯誤重新導向至用戶端的 `redirect_uri`：

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=[IdP name]+Error+-+[status code]+error getting token
    ```
  + 如果從 Google 收到錯誤回應，身分驗證伺服器則會如下所示，將錯誤重新導向至用戶端的 `redirect_uri`：

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Google+Error+-+[status code]+[Google-provided error code]
    ```
+ 當 Amazon Cognito 在連線至外部 IdP 時遇到通訊例外狀況時，身分驗證伺服器會使用下列`redirect_uri`任一訊息，將錯誤重新導向至用戶端的 ：
  + 

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Connection+reset
    ```
  + 

    ```
    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Read+timed+out
    ```