更新重新導向 URI:使用 Microsoft Entra 系統管理中心內的應用程式資訊清單編輯器,將重新導向 URI 的 type 設定為 spa。
spa 重新導向類型可與隱含流程回溯相容。 目前使用隱含流程來取得權杖的應用程式可移至 spa 重新導向 URI 類型,而不會發生問題,並可繼續使用隱含流程。 儘管有這種回溯相容性,但建議您搭配 PKCE for SPA 使用驗證碼流程。
如果您嘗試使用授權碼流程,但未針對您的重新導向 URI 設定 CORS,則將會在主控台中看到此錯誤:
HTTP
access to XMLHttpRequest at 'https://login.microsoftonline.com/common/v2.0/oauth2/token' from origin 'yourApp.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
// Line breaks for legibility only
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&response_mode=query
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&state=12345
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256
使用 fragment 作為回應模式,會導致從重新導向讀取代碼的 Web 應用程式發生問題。 瀏覽器不會將片段傳遞給 Web 伺服器。 在這些情況下,應用程式應該使用 form_post 回應模式,以確保所有資料都會傳送至伺服器。
成功回應
此範例顯示使用 response_mode=fragment 的成功回應:
HTTP
GET https://login.microsoftonline.com/common/oauth2/nativeclient#
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&id_token=eYj...
&state=12345
// Line breaks for legibility only
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=11112222-bbbb-3333-cccc-4444dddd5555
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
&client_secret=sampleCredentia1s // NOTE: Only required for web apps. This secret needs to be URL-Encoded.
您在您應用程式的應用程式註冊入口網站中建立的應用程式密碼。 請勿在原生應用程式或單頁應用程式中使用應用程式密碼,因為 client_secret 無法可靠地儲存在裝置或網頁上。 Web Apps 和 Web API 都需要應用程式密碼,其能夠將 client_secret 安全地儲存在伺服器端。 如同這裡的所有參數,用戶端密碼必須先以 URL 編碼,才能傳送。 此步驟是透過 SDK 所完成。 如需有關 URI 編碼的詳細資訊,請參閱 URI 一般語法規格。 在授權標頭中,也支援根據 RFC 6749 提供認證的基本驗證模式。
使用憑證認證來要求存取權杖
HTTP
// Line breaks for legibility only
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
{
"error": "invalid_scope",
"error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333\r\nCorrelation ID: aaaa0000-bb11-2222-33cc-444444dddddd\r\nTimestamp: 2016-01-09 02:02:12Z",
"error_codes": [
70011
],
"timestamp": "2016-01-09 02:02:12Z",
"trace_id": "0000aaaa-11bb-cccc-dd22-eeeeee333333",
"correlation_id": "aaaa0000-bb11-2222-33cc-444444dddddd"
}
參數
描述
error
可用於將錯誤分類的錯誤碼字串,並回應錯誤。
error_description
協助開發人員識別驗證錯誤原因的特定錯誤訊息。
error_codes
有助於診斷的 STS 特定錯誤碼清單。
timestamp
發生錯誤的時間。
trace_id
有助於診斷的要求唯一識別碼。
correlation_id
有助於跨元件診斷的要求唯一識別碼。
權杖端點錯誤的錯誤碼
錯誤碼
描述
用戶端動作
invalid_request
通訊協定錯誤,例如遺漏必要的參數。
修正要求或應用程式註冊,然後重新提交要求。
invalid_grant
授權碼或 PKCE 代碼驗證器無效或已過期。
嘗試向 /authorize 端點提出新的要求,並確認 code_verifier 參數正確。
unauthorized_client
未授權驗證用戶端使用此授權授與類型。
此錯誤通常發生在用戶端應用程式未在 Microsoft Entra ID 中進行註冊時,或未新增至使用者的 Microsoft Entra 租用戶時。 應用程式可以對使用者提示關於安裝應用程式並其新增至 Microsoft Entra ID 的指示。
invalid_client
用戶端驗證失敗。
用戶端認證無效。 若要修正,應用程式系統管理員會更新認證。
unsupported_grant_type
授權伺服器不支援授權授與類型。
變更要求中的授與類型。 這種類型的錯誤應該只會在開發期間發生,並且會在初始測試期間偵測出來。
invalid_resource
目標資源因不存在、Microsoft Entra ID 找不到或未正確設定而無效。
此代碼表示在資源存在的情況下,尚未在租用戶中加以設定。 應用程式可以對使用者提示關於安裝應用程式並其新增至 Microsoft Entra ID 的指示。
// Line breaks for legibility only
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
&grant_type=refresh_token
&client_secret=sampleCredentia1s // NOTE: Only required for web apps. This secret needs to be URL-Encoded
以空格分隔的範圍清單。 在此階段中要求的範圍必須相當於或為原始 authorization_code 要求階段所要求的範圍子集。 如果這個要求中指定的範圍遍及多個資源伺服器,Microsoft 身分識別平台就會傳回第一個範圍中所指定資源的權杖。 如需詳細資訊,請參閱 Microsoft 身分識別平台中的權限和同意。
refresh_token
必要
您在流程中第二個階段取得的 refresh_token。
client_secret
Web 應用程式的必要參數
您在您應用程式的應用程式註冊入口網站中建立的應用程式密碼。 此參數不應用於原生應用程式中,因為 client_secret 無法可靠地儲存在裝置上。 Web Apps 和 Web API 都需要應用程式密碼,其能夠將 client_secret 安全地儲存在伺服器端。 此密碼必須經過 URL 編碼。 如需詳細資訊,請參閱 URI 一般語法規格。
未簽署的 JSON Web Token。 應用程式可以將此權杖的區段解碼,以索取已登入使用者的相關資訊。 應用程式可以快取並顯示值,但不應依賴這些值來取得任何授權或安全性界限。 如需有關 id_token 的詳細資訊,請參閱 Microsoft 身分識別平台識別碼權杖。 注意:只在要求 openid 範圍時提供。
警告
請勿在程式碼中,嘗試驗證或讀取任何您未擁有的 API 的權杖 (包括此範例中的權杖)。 Microsoft 服務的權杖可以使用不會驗證為 JWT 的特殊格式,且可能為取用者 (Microsoft 帳戶) 使用者進行加密。 雖然讀取權杖是很實用的偵錯與學習工具,但請勿在程式碼中依賴此功能的相依性,或是假設並非用於您所控制 API 的權杖相關內容。
回覆錯誤
JSON
{
"error": "invalid_scope",
"error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333\r\nCorrelation ID: aaaa0000-bb11-2222-33cc-444444dddddd\r\nTimestamp: 2016-01-09 02:02:12Z",
"error_codes": [
70011
],
"timestamp": "2016-01-09 02:02:12Z",
"trace_id": "0000aaaa-11bb-cccc-dd22-eeeeee333333",
"correlation_id": "aaaa0000-bb11-2222-33cc-444444dddddd"
}