本頁內容適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
資源擁有者密碼 (或「密碼」) 授權類型大多用於高度信任應用程式的情況。在此設定中,使用者會向用戶端應用程式提供資源伺服器憑證 (使用者名稱/密碼),應用程式則會將憑證傳送至 Apigee,提出存取權杖要求。身分識別伺服器會驗證憑證,如果憑證有效,Apigee 會繼續產生存取權杖,並傳回給應用程式。
關於這個主題
本主題將概略說明 OAuth 2.0 資源擁有者密碼授權類型流程,並討論如何在 Apigee 上實作這項流程。
實用範例
- 使用密碼授權類型:說明如何建立權杖要求、為密碼授權類型設定 OAuthV2 政策,以及如何在 Apigee 中為政策設定端點。
- oauth-validate-key-secret:GitHub 中的範例 Proxy,可部署至 Apigee 並試用。這是以密碼授權類型為例的端對端範例。這項範例會示範最佳做法,也就是先驗證用戶端應用程式的憑證 (金鑰/密鑰),再將使用者的憑證傳送至身分識別提供者。
影片
影片: 觀看這部影片,瞭解如何導入密碼授權類型。
用途
這種授權類型適用於高度信任或具備權限的應用程式,因為使用者必須將資源伺服器憑證提供給應用程式。通常,應用程式會提供登入畫面,供使用者輸入憑證。
流程圖
下圖說明資源擁有者密碼授權類型流程,其中 Apigee 是授權伺服器。
提示:如要查看放大版圖表,請在圖表上按一下滑鼠右鍵,然後在新分頁中開啟,或是儲存圖表並在圖片檢視器中開啟。

密碼授權類型流程中的步驟
以下摘要說明導入密碼授權類型時的必要步驟,其中 Apigee 會做為授權伺服器。
先決條件:用戶端應用程式必須向 Apigee 註冊,才能取得用戶端 ID 和用戶端密鑰。詳情請參閱「註冊用戶端應用程式」。
1. 使用者啟動流程並輸入憑證
當應用程式需要存取使用者的受保護資源時 (例如使用者點按應用程式中的按鈕),系統會將使用者重新導向至登入表單。
2. 應用程式向 Apigee 要求存取權杖
應用程式會將存取權杖要求 (包括使用者憑證) 傳送至 Apigee 的 GenerateAccessToken 端點。
以下是 POST 要求範例,其中包含這個授權類型所需的參數:
$ curl -i \ -X POST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Authorization: Basic c3FIOG9vSGV4VHo4QzAySVg5T1JvNnJoZ3ExaVNyQWw6WjRsanRKZG5lQk9qUE1BVQ' \ -d 'grant_type=password&username=the-user-name&password=the-users-password' \ https://docs-test.apigee.net/oauth/token
或者,您也可以使用 curl 的 -u 選項,以執行下列指令,為您建立採用 Base64 編碼的 Basic Authentication 標頭。
$ curl -i \ -X POST \ -H 'Content-Type: application/x-www-form-urlencoded' \ -u sqH8ooHexTz8C02IX9ORo6rhgq1iSrAl:Z4ljtJdneBOjPMAU \ -d 'grant_type=password&username=the-user-name&password=the-users-password' \ https://docs-test.apigee.net/oauth/token
(每個指令都應位於同一行)。
使用者憑證會包含在表單參數中,而用戶端憑證則會編碼在 HTTP 基本驗證標頭中。如要詳細瞭解這項 API 呼叫,包括必要的基本驗證標頭詳細資料,請參閱「取得 OAuth 2.0 權杖」的密碼授權部分。
3. Apigee 會驗證用戶端應用程式
將使用者的使用者名稱和密碼傳送給身分識別提供者之前,Edge 必須確認發出要求的用戶端應用程式是有效且受信任的應用程式。其中一種做法是在 API 呼叫中使用 API 金鑰驗證。在某些情況下,您可能希望同時驗證用戶端金鑰和密鑰。GitHub 上的 api-platform-samples 存放區提供範例 Proxy,說明這項替代技術。
4. Apigee 會處理登入憑證
驗證用戶端應用程式後,您可以使用服務呼叫或 JavaScript 政策呼叫身分識別服務,並傳送使用者的憑證。舉例來說,這可能是 LDAP 服務,或是您想用來驗證憑證的任何服務。如要進一步瞭解這些政策,請參閱「擷取變數政策」和「JavaScript 政策」。
如果身分識別服務驗證憑證並傳回 200 回應,Apigee 會繼續處理要求;否則,Apigee 會停止處理,並向用戶端應用程式傳回錯誤。
5. 執行 OAuthV2 政策
如果憑證有效,下一個處理步驟是執行為密碼授權類型設定的 OAuthV2 政策。以下為範例。<UserName> 和 <PassWord> 元素為必填,您可以從使用 ExtractVariables 政策儲存的流程變數中擷取這些元素。如要詳細瞭解這項政策,請參閱 OAuthV2 政策。
<OAuthV2 name="GetAccessToken"> <Operation>GenerateAccessToken</Operation> <ExpiresIn>360000000</ExpiresIn> <SupportedGrantTypes> <GrantType>password</GrantType> </SupportedGrantTypes> <GrantType>request.queryparam.grant_type</GrantType> <UserName>login</UserName> <PassWord>password</PassWord> <GenerateResponse/> </OAuthV2>
如果這項政策成功,系統會產生回應並傳回給用戶端,其中包含存取權杖。回覆內容為 JSON 格式。舉例來說,請注意,access_token 是其中一個元素:
{ "issued_at": "1420258685042", "scope": "READ", "application_name": "ce1e94a2-9c3e-42fa-a2c6-1ee01815476b", "refresh_token_issued_at": "1420258685042", "status": "approved", "refresh_token_status": "approved", "api_product_list": "[PremiumWeatherAPI]", "expires_in": "1799", "developer.email": "tesla@weathersample.com", "organization_id": "0", "token_type": "BearerToken", "refresh_token": "IFl7jlijYuexu6XVSSjLMJq8SVXGOAAq", "client_id": "5jUAdGv9pBouF0wOH5keAVI35GBtx3dT", "access_token": "I6daIgMSiUgYX1K2qgQWPi37ztS6", "organization_name": "docs", "refresh_token_expires_in": "0", "refresh_count": "0" }
6. 用戶端呼叫受保護的 API
現在,只要有有效的存取代碼,用戶端就能呼叫受保護的 API。在這個情境中,要求會傳送至 Apigee (Proxy),而 Apigee 負責驗證存取權杖,然後再將 API 呼叫傳送至目標資源伺服器。存取權杖會傳送至授權標頭。例如:
$ curl -H "Authorization: Bearer I6daIgMSiUgYX1K2qgQWPi37ztS6 " http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282