字符發行者端點 - Amazon Cognito

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

字符發行者端點

OAuth 2.0 權杖端點會向想要完成授權碼和用戶端憑證授予流程的應用程式/oauth2/token發出 JSON Web 權杖 (JWTs)。這些字符是使用使用者集區進行身分驗證的最終結果。它們包含有關使用者 (ID 字符)、使用者存取層級 (存取字符) 以及使用者保留登入工作階段 (重新整理字符) 的權利的資訊。依賴第三方程式庫的 OpenID Connect (OIDC) 會處理來自此端點的請求和回應承載。權杖提供可驗證的身分驗證、設定檔資訊,以及存取後端系統的機制。

您的使用者集區 OAuth 2.0 授權伺服器會從權杖端點發出 JSON Web 權杖 JWTs) 至下列工作階段類型:

  1. 已完成授權碼授予請求的使用者。成功兌換程式碼會傳回 ID、存取和重新整理權杖。

  2. 已完成用戶端憑證授予的機器對機器 (M2M) 工作階段。使用用戶端秘密成功授權傳回存取權杖。

  3. 先前已登入並收到重新整理字符的使用者。重新整理權杖身分驗證會傳回新的 ID 和存取權杖。

    注意

    在受管登入或透過聯合身分使用授權碼授予登入的使用者,一律可以從字符端點重新整理其字符。使用 API 操作登入,InitiateAuth並在使用者集區中啟用記住的裝置時,AdminInitiateAuth使用權杖端點重新整理權杖的使用者。如果記住的裝置處於作用中狀態,請使用應用程式用戶端的相關 API 或軟體開發套件字符重新整理操作來重新整理字符

當您將網域新增至使用者集區時,權杖端點會變為可公開使用。它會接受 HTTP POST 請求。為了應用程式安全,請將 PKCE 與您的授權碼登入事件搭配使用。PKCE 會驗證傳遞授權碼的使用者是經過驗證的相同使用者。如需 PKCE 的詳細資訊,請參閱 IETF RFC 7636

您可以在 進一步了解使用者集區應用程式用戶端及其授予類型、用戶端秘密、允許的範圍和用戶端 IDs使用應用程式用戶端的應用程式特定設定。您可以在 進一步了解 M2M 授權、用戶端憑證授予,以及具有存取權杖範圍的授權範圍、M2M 和具有資源伺服器的 APIs

若要從使用者存取權杖擷取有關使用者的資訊,請將其傳遞給您的 userInfo 端點GetUser API 請求。存取權杖必須包含這些請求的適當範圍,

對字符端點格式化 POST 請求

/oauth2/token 端點僅支援 HTTPS POST。此端點不是使用者互動的。在您的應用程式中使用 OpenID Connect (OIDC) 程式庫處理字符請求。

權杖端點支援 client_secret_basicclient_secret_post 身分驗證。如需 OIDC 規格的詳細資訊,請參閱用戶端身分驗證。如需 OpenID Connect 規格中權杖端點的詳細資訊,請參閱權杖端點

標頭中的請求參數

您可以在請求的 標頭中將下列參數傳遞至字符端點。

Authorization

如果有核發秘密給用戶端,則用戶端可在授權標頭中傳遞其 client_idclient_secret 做為 client_secret_basic HTTP 授權。您也可以在請求的內文中加入 client_idclient_secret 做為 client_secret_post 授權。

授權標頭字串是基本 Base64Encode(client_id:client_secret)。下列範例是djc98u3jiedmi283eu928具有用戶端秘密 的應用程式用戶端的授權標頭abcdef01234567890,使用字串 Base64-encoded版本djc98u3jiedmi283eu928:abcdef01234567890

Authorization: Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw
Content-Type

將此參數的值設為 'application/x-www-form-urlencoded'

內文中的請求參數

以下是您可以在請求內文中請求到字符端點的x-www-form-urlencoded格式參數。

grant_type

「必要」

您要請求的 OIDC 授予類型。

必須是 authorization_coderefresh_tokenclient_credentials。在以下條件下,您可以從字符端點請求自訂範圍的存取字符:

  • 您已在應用程式用戶端組態中啟用請求的範圍。

  • 您已使用用戶端秘密設定應用程式用戶端。

  • 您可以在應用程式用戶端中啟用用戶端憑證授予。

注意

字符端點只會在 grant_type為 時傳回重新整理字符authorization_code

client_id

「選用」。當您在 Authorization標頭中提供應用程式用戶端 ID 時,不需要。

使用者集區中應用程式用戶端的 ID。指定驗證您使用者的相同應用程式用戶端。

如果用戶端是公有且沒有秘密或授權client_secret中有 ,您必須提供此參數client_secret_post

client_secret

「選用」。當您在 Authorization 標頭中提供用戶端秘密,以及應用程式用戶端沒有秘密時,則不需要。

如果應用程式用戶端有一個client_secret_post授權的應用程式用戶端秘密。

scope

「選用」

可以是與您的應用程式用戶端相關聯之任何範圍的組合。Amazon Cognito 會忽略請求中對請求應用程式用戶端不允許的範圍。如果您未提供此請求參數,授權伺服器會傳回存取字符scope宣告,其中包含您在應用程式用戶端組態中啟用的所有授權範圍。您可以請求請求應用程式用戶端允許的任何範圍:標準範圍、資源伺服器的自訂範圍,以及aws.cognito.signin.user.admin使用者自助服務範圍。

redirect_uri

「選用」。client-credentials 授予不需要。

必須是在 /oauth2/authorize 中用來取得 authorization_code 的相同 redirect_uri

如果 grant_type是 ,您必須提供此參數authorization_code

refresh_token

「選用」。僅在使用者已有重新整理權杖,並希望取得新的 ID 和存取權杖時使用。

若要為使用者工作階段產生新的存取和 ID 字符,請將 的值設定為請求的應用程式用戶端發出的refresh_token有效重新整理字符。

當重新整理權杖輪換作用中時,傳回具有新 ID 和存取權杖的新重新整理權杖,否則僅傳回 ID 和存取權杖。如果原始存取字符繫結至 API 資源,則新的存取字符會在aud宣告中維護請求的 API URL。

code

「選用」。只有在授權碼授予中才需要。

授權碼授予的授權碼。如果您的授權請求包含 grant_type的 ,您必須提供此參數authorization_code

aws_client_metadata

「選用」

您要在產生權杖前 Lambda 觸發程序machine-to-machine(M2M) 授權流程中傳遞至 的資訊。您的應用程式可以收集工作階段的相關內容資訊,並在此參數中傳遞。當您aws_client_metadata以 URL 編碼的 JSON 格式傳遞時,Amazon Cognito 會在輸入事件中將其包含在觸發器 Lambda 函數中。您的權杖前觸發事件版本或全域 Lambda 觸發版本必須設定為第 3 版或更新版本。雖然 Amazon Cognito 接受授權碼和用戶端憑證 M2M 流程中對此端點的請求,但您的使用者集區只會從用戶端憑證請求傳遞aws_client_metadata至權杖產生前觸發。

code_verifier

選用。只有在您在初始授權請求中提供 code_challenge_methodcode_challenge 參數時才需要。

您的應用程式在 PKCE 的授權碼授予請求中計算 code_challenge 的產生程式碼驗證器。

將授權碼交換成權杖

以下請求會在使用授權碼授予進行身分驗證後成功產生 ID、存取和重新整理權杖。請求會以 Authorization標頭中的client_secret_basic格式傳遞用戶端秘密。

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token& Content-Type='application/x-www-form-urlencoded'& Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw grant_type=authorization_code& client_id=1example23456789& code=AUTHORIZATION_CODE& redirect_uri=com.myclientapp://myclient/redirect

回應會向使用者發出新的 ID、存取和重新整理權杖,以及額外的中繼資料。

HTTP/1.1 200 OK Content-Type: application/json { "access_token": "eyJra1example", "id_token": "eyJra2example", "refresh_token": "eyJj3example", "token_type": "Bearer", "expires_in": 3600 }

具有基本授權的用戶端憑證

來自 M2M 應用程式的下列請求會請求用戶端憑證授予。由於用戶端登入資料需要用戶端秘密,因此請求會使用衍生自應用程式用戶端 ID 和秘密的 Authorization 標頭進行授權。請求會產生具有兩個請求範圍的存取權杖。請求也包含提供 IP 地址資訊的用戶端中繼資料,以及向代表此授予的使用者發出的權杖。Amazon Cognito 會將用戶端中繼資料傳遞至權杖產生前 Lambda 觸發器。

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token > Content-Type='application/x-www-form-urlencoded'& Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw grant_type=client_credentials& client_id=1example23456789& scope=resourceServerIdentifier1%2Fscope1%20resourceServerIdentifier2%2Fscope2& &aws_client_metadata=%7B%22onBehalfOfToken%22%3A%22eyJra789ghiEXAMPLE%22,%20%22ClientIpAddress%22%3A%22192.0.2.252%22%7D

Amazon Cognito 會將下列輸入事件傳遞給權杖產生前 Lambda 觸發。

{ version: '3', triggerSource: 'TokenGeneration_ClientCredentials', region: 'us-east-1', userPoolId: 'us-east-1_EXAMPLE', userName: 'ClientCredentials', callerContext: { awsSdkVersion: 'aws-sdk-unknown-unknown', clientId: '1example23456789' }, request: { userAttributes: {}, groupConfiguration: null, scopes: [ 'resourceServerIdentifier1/scope1', 'resourceServerIdentifier2/scope2' ], clientMetadata: { 'onBehalfOfToken': 'eyJra789ghiEXAMPLE', 'ClientIpAddress': '192.0.2.252' } }, response: { claimsAndScopeOverrideDetails: null } }

回應會傳回存取字符。用戶端憑證授予適用於machine-to-machine(M2M) 授權,且僅傳回存取權杖。

HTTP/1.1 200 OK Content-Type: application/json { "access_token": "eyJra1example", "token_type": "Bearer", "expires_in": 3600 }

具有 POST 內文授權的用戶端憑證

下列 client-credentials 授予請求包含請求內文中的 client_secret 參數,且不包含 Authorization標頭。此請求使用client_secret_post授權語法。請求會產生具有請求範圍的存取權杖。請求也包含提供 IP 地址資訊的用戶端中繼資料,以及向代表此授予的使用者發出的權杖。Amazon Cognito 會將用戶端中繼資料傳遞至權杖產生前 Lambda 觸發器。

POST /oauth2/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded X-Amz-Target: AWSCognitoIdentityProviderService.Client credentials request User-Agent: USER_AGENT Accept: / Accept-Encoding: gzip, deflate, br Content-Length: 177 Referer: http://auth.example.com/oauth2/token Host: auth.example.com Connection: keep-alive grant_type=client_credentials& client_id=1example23456789& scope=my_resource_server_identifier%2Fmy_custom_scope& client_secret=9example87654321& aws_client_metadata=%7B%22onBehalfOfToken%22%3A%22eyJra789ghiEXAMPLE%22,%20%22ClientIpAddress%22%3A%22192.0.2.252%22%7D

Amazon Cognito 會將下列輸入事件傳遞給權杖產生前 Lambda 觸發。

{ version: '3', triggerSource: 'TokenGeneration_ClientCredentials', region: 'us-east-1', userPoolId: 'us-east-1_EXAMPLE', userName: 'ClientCredentials', callerContext: { awsSdkVersion: 'aws-sdk-unknown-unknown', clientId: '1example23456789' }, request: { userAttributes: {}, groupConfiguration: null, scopes: [ 'resourceServerIdentifier1/my_custom_scope' ], clientMetadata: { 'onBehalfOfToken': 'eyJra789ghiEXAMPLE', 'ClientIpAddress': '192.0.2.252' } }, response: { claimsAndScopeOverrideDetails: null } }

回應會傳回存取字符。用戶端憑證授予適用於machine-to-machine(M2M) 授權,且僅傳回存取權杖。

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Date: Tue, 05 Dec 2023 16:11:11 GMT x-amz-cognito-request-id: 829f4fe2-a1ee-476e-b834-5cd85c03373b { "access_token": "eyJra12345EXAMPLE", "expires_in": 3600, "token_type": "Bearer" }

使用 PKCE 授予授權碼

下列範例請求會使用 PKCE 完成授權請求,其中包含授權碼授予請求中的 code_challenge_methodcode_challenge 參數。

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token Content-Type='application/x-www-form-urlencoded'& Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw grant_type=authorization_code& client_id=1example23456789& code=AUTHORIZATION_CODE& code_verifier=CODE_VERIFIER& redirect_uri=com.myclientapp://myclient/redirect

回應會從應用程式成功的 PKCE 驗證傳回 ID、存取和重新整理權杖。

HTTP/1.1 200 OK Content-Type: application/json { "access_token": "eyJra1example", "id_token": "eyJra2example", "refresh_token": "eyJj3example", "token_type": "Bearer", "expires_in": 3600 }

無需重新整理權杖輪換的權杖重新整理

下列範例請求會將重新整理權杖提供給重新整理權杖輪換為非作用中的應用程式用戶端。由於應用程式用戶端具有用戶端秘密,因此請求會提供 Authorization標頭。

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token > Content-Type='application/x-www-form-urlencoded'& Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw grant_type=refresh_token& client_id=1example23456789& refresh_token=eyJj3example

回應會傳回新的 ID 和存取權杖。

HTTP/1.1 200 OK Content-Type: application/json { "access_token": "eyJra1example", "id_token": "eyJra2example", "token_type": "Bearer", "expires_in": 3600 }

使用重新整理權杖輪換進行權杖重新整理

下列範例請求提供重新整理權杖給啟用重新整理權杖輪換的應用程式用戶端。由於應用程式用戶端具有用戶端秘密,因此請求會提供 Authorization標頭。

POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token > Content-Type='application/x-www-form-urlencoded'& Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw grant_type=refresh_token& client_id=1example23456789& refresh_token=eyJj3example

回應會傳回新的 ID、存取和重新整理權杖。

HTTP/1.1 200 OK Content-Type: application/json { "access_token": "eyJra1example", "id_token": "eyJra2example", "refresh_token": "eyJj4example", "token_type": "Bearer", "expires_in": 3600 }

負向回應的範例

格式不正確的請求會從字符端點產生錯誤。以下是字符請求產生錯誤時回應內文的一般映射。

HTTP/1.1 400 Bad Request Content-Type: application/json;charset=UTF-8 { "error":"invalid_request|invalid_client|invalid_grant|unauthorized_client|unsupported_grant_type" }
invalid_request

請求遺漏必要參數、包含不支援的參數值 (非 unsupported_grant_type),或是格式不正確。例如,grant_typerefresh_token,但沒有包含 refresh_token

invalid_client

用戶端身分驗證失敗。例如,用戶端在授權標頭中包含 client_idclient_secret,但並沒有使用該 client_idclient_secret 的用戶端存在。

invalid_grant

重新整理權杖已撤銷。

授權碼已被使用或不存在。

應用程式用戶端不具有對所請求範圍中所有屬性的讀取存取權。例如,您的應用程式請求 email 範圍,且您的應用程式用戶端可以讀取 email 屬性,但不能讀取 email_verified

unauthorized_client

用戶端無權進行授權碼授予流程或重新整理權杖。

unsupported_grant_type

如果 grant_type 不是 authorization_coderefresh_tokenclient_credentials,就會傳回此值。