實作密碼授權類型

本頁內容適用於 ApigeeApigee 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