本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
字符發行者端點
OAuth 2.0 權杖端點/oauth2/token
發出 JSON Web 權杖 (JWTs)。這些字符是使用使用者集區進行身分驗證的最終結果。其中包含有關使用者 (ID 字符)、使用者存取層級 (存取字符) 以及使用者保留登入工作階段 (重新整理字符) 的權利的資訊。依賴第三方程式庫的 OpenID Connect (OIDC) 會處理來自此端點的請求和回應承載。字符提供可驗證的身分驗證證明、設定檔資訊,以及存取後端系統的機制。
您的使用者集區 OAuth 2.0 授權伺服器會從權杖端點發出 JSON Web 權杖 JWTs) 至下列工作階段類型:
-
已完成授權碼授予請求的使用者。成功兌換程式碼會傳回 ID、存取和重新整理權杖。
-
已完成用戶端憑證授予的機器對機器 (M2M) 工作階段。使用用戶端秘密成功授權傳回存取權杖。
-
先前已登入並收到重新整理字符的使用者。重新整理權杖身分驗證會傳回新的 ID 和存取權杖。
注意
在受管登入或透過聯合身分使用授權碼授予登入的使用者,一律可以從字符端點重新整理其字符。使用 API 操作登入,
InitiateAuth
並在使用者集區中未啟用記住的裝置時,AdminInitiateAuth
使用權杖端點重新整理權杖的使用者。如果記住的裝置處於作用中狀態,請使用應用程式用戶端的相關 API 或 SDK 字符重新整理操作來重新整理字符。
當您將網域新增至使用者集區時,權杖端點會變為可公開使用。它會接受 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_basic
和 client_secret_post
身分驗證。如需 OIDC 規格的詳細資訊,請參閱用戶端身分驗證
標頭中的請求參數
您可以在請求的 標頭中將下列參數傳遞至字符端點。
Authorization
-
如果有核發秘密給用戶端,則用戶端可在授權標頭中傳遞其
client_id
和client_secret
做為client_secret_basic
HTTP 授權。您也可以在請求的內文中加入client_id
和client_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_code
、refresh_token
或client_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 和存取權杖。
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_method
和code_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_method
和 code_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_type
是refresh_token
,但沒有包含refresh_token
。 invalid_client
-
用戶端身分驗證失敗。例如,用戶端在授權標頭中包含
client_id
和client_secret
,但並沒有使用該client_id
和client_secret
的用戶端存在。 invalid_grant
-
重新整理權杖已撤銷。
授權碼已被使用或不存在。
應用程式用戶端不具有對所請求範圍中所有屬性的讀取存取權。例如,您的應用程式請求
email
範圍,且您的應用程式用戶端可以讀取email
屬性,但不能讀取email_verified
。 unauthorized_client
-
用戶端無權進行授權碼授予流程或重新整理權杖。
unsupported_grant_type
-
如果
grant_type
不是authorization_code
、refresh_token
或client_credentials
,就會傳回此值。