搭配 Google Data API 使用 OAuth

Google Data API 團隊 Eric Bidelman
2008 年 9 月

簡介

對開發人員來說,這是令人振奮的時代。我們發現網路上開始採用許多開放標準,而如您所知,Google 一向非常支持標準,並致力於促進開放原始碼社群發展。

最近,所有 Google Data API 都採用了 OAuth,這項開放式通訊協定旨在標準化桌上型電腦和網路應用程式存取使用者私人資料的方式。OAuth 提供標準且安全的方式來執行 API 驗證。程式設計師的職責是盡可能重複使用程式碼。OAuth 可協助開發人員減少重複編寫的程式碼量,並輕鬆建立可與多個服務搭配使用的工具,這些服務來自各種不同的供應商。

觀眾

本文假設您已熟悉一或多個 Google Data API,但不一定瞭解 OAuth 背後的概念。 如果您是新手,或是對 OAuth 感到好奇,這就是您要找的內容。本文將說明這些概念的基本原理。我還會討論 Google OAuth 實作的詳細資料。

本文也適用於熟悉使用 AuthSub 的開發人員,特別是以進階安全模式註冊的開發人員。 在課程中,我會盡量強調這兩種通訊協定的相似之處差異。如果您有使用 AuthSub 的應用程式,可以參考這項資訊遷移至 OAuth,這是更開放的現代通訊協定。


術語簡介

瞭解 OAuth 的關鍵在於瞭解相關術語。OAuth 規格和 Google 的網頁應用程式 OAuth 驗證說明文件大量使用特定定義,因此請先瞭解這些定義在 Google OAuth 實作中的意義。

  1. 「OAuth 舞蹈」

    我非正式使用的詞彙,用來描述完整的 OAuth 驗證/授權程序。

  2. (OAuth) 要求權杖

    初始權杖,可讓 Google 瞭解您的應用程式正在要求存取其中一個 Google Data API。OAuth 流程的第二個步驟是讓使用者手動授予資料存取權。如果這個步驟成功,要求權杖就會獲得授權。

  3. (OAuth) 存取權杖

    最後一個步驟是將授權要求權杖換成存取權杖。應用程式取得這個權杖後,使用者就不必再次執行 OAuth 流程,除非權杖遭到撤銷。

    與 AuthSub 相似:
    OAuth 存取權杖與安全的 AuthSub 工作階段權杖相同。

  4. (OAuth) 端點

    這些 URI 是驗證應用程式及取得存取權杖時的必要項目。共有三個,分別對應 OAuth 程序的每個步驟。 Google 的 OAuth 端點如下:

    取得要求權杖:https://www.google.com/accounts/OAuthGetRequestToken
    授權要求權杖:https://www.google.com/accounts/OAuthAuthorizeToken
    升級為存取權杖:https://www.google.com/accounts/OAuthGetAccessToken

    與 AuthSub 相似:
    將授權要求權杖換成存取權杖,分別類似於在 https://www.google.com/accounts/AuthSubRequestTokenhttps://www.google.com/accounts/AuthSubSessionToken 將單次使用的 AuthSub 權杖升級為長期有效的會期權杖。 不同之處在於 AuthSub 沒有初始要求權杖的概念。使用者會改為從AuthSubRequestToken授權頁面啟動權杖程序。

  5. (OAuth) 服務供應商

    如果是 Google Data API,這個供應商就是 Google。一般而言,服務供應商是指提供 OAuth 端點的網站或網路服務。 MySpace 也是 OAuth 服務供應商的例子。

  6. (OAuth) 消費者

    要求存取使用者資料的程式 (即您的應用程式)。OAuth 通訊協定十分靈活,可支援各種不同類型的用戶端 (網頁、已安裝、桌機、行動裝置)。

注意:雖然 OAuth 通訊協定支援桌面/已安裝的應用程式使用案例,但 Google 僅支援網頁應用程式的 OAuth。

開始使用

註冊

開始使用 Google Data API 的 OAuth 之前,請先完成少量設定。由於所有 OAuth 要求都必須經過數位簽署,因此您必須先向 Google 註冊網域並上傳公開憑證。如要進一步瞭解如何執行這項操作,請參閱「註冊網頁式應用程式」和「產生金鑰和憑證以搭配註冊模式使用」。

簽署要求

網域註冊完成後,即可開始簽署要求。OAuth 最難的概念之一,就是如何正確建構 oauth_signature 和簽章基底字串的概念。基礎字串是您使用私密金鑰簽署的資料 (使用 RSA_SHA1)。結果是您為 oauth_signature 設定的值。

要求範例

GET 使用者的 Google 日曆清單 http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime

基本字串格式 base_string = http-method&base-http-request-url&normalized-string-of-oauth_parameters
基本字串範例 GET&http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull&oauth_consumer_key%3Dexample.com%26oauth_nonce%3D4572616e48616d6d%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D137131200%26oauth_token%3D1%252Fab3cd9j4ks73hf7g%26oauth_version%3D1.0%26orderby%3Dstarttime
HTTP 要求範例
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: OAuth oauth_token="1%2Fab3cd9j4ks73hf7g", oauth_signature_method="RSA-SHA1", oauth_signature="wOJIO9AvZbTSMK%2FPY%3D...", oauth_consumer_key="example.com", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d", oauth_version="1.0"

注意:這僅為代表性範例。oauth_signature會長很多。

基本字串注意事項:

  • orderby=starttime 查詢參數會與其餘 oauth_* 參數一起,依字典順序的位元組值排序。
  • 這個字串也不會包含「?」字元。
  • base-http-request-url 部分只包含網址編碼的基準網址:http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull
  • oauth_token 採用雙層網址編碼。

Authorization 標頭注意事項:

  • oauth_* 參數在 Authorization 標頭中的順序沒有影響。
  • 標頭不包含 orderby=starttime,因為基本字串包含該字元。該查詢參數會保留在要求網址中。

如要進一步瞭解如何使用 OAuth 簽署要求,請參閱「簽署 OAuth 要求」。

與 AuthSub 的差異:
做為比較,以下是使用安全 AuthSub 的相同範例:

基本字串格式 base_string = http-method http-request-URL timestamp nonce
基本字串範例
GET http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull%3Forderby%3Dstarttime 137131200 4572616e48616d6d
HTTP 要求範例
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: AuthSub token="GD32CMCL25aZ-v____8B" data="GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime 137131200 4572616e48616d6d" sig="MCwCFrV93K4agg==..." sigalg="rsa-sha1"

如要進一步瞭解如何使用 AuthSub 簽署要求,請參閱「簽署 AuthSub 要求」。

OAuth Playground 工具

目的

部分使用者認為 OAuth 的學習曲線較陡峭。與 Google 的其他驗證 API 相比,我同意這項說法。當您擴充應用程式,使用其他 (非 Google) 服務時,OAuth 的優勢就會顯現出來。撰寫一段適用於不同服務供應商及其 API 的驗證程式碼,聽起來很不錯。 現在學習這個通訊協定,日後一定會感謝自己。

OAuth Playground 是我建立的工具,可協助開發人員解決 OAuth 相關問題。您可以使用 Playground 偵錯問題、檢查自己的實作項目,或試用 Google Data API。

有什麼作用?

  1. 說明 OAuth 驗證流程:擷取要求權杖、授權權杖,並將其升級為存取權杖。
  2. 顯示每個要求的正確簽章基底字串。
  3. 針對每項要求顯示正確的 Authorization 標頭。
  4. 示範如何使用 oauth_token 與已驗證的 Google 數位摘要互動。您可以GET/POST/PUT/DELETE資料。
  5. 直接在瀏覽器中查看已驗證的動態消息。
  6. 可測試您自己的 oauth_consumer_key (已註冊的網域) 和私密金鑰。
  7. 瞭解 oauth_token可用的 Google 產品動態饋給服務。

試跑

步驟 1:選擇範圍

首先,請選擇一或多個範圍,決定要使用的 API。在本示範中,我要求取得的權杖將適用於 Blogger Google 聯絡人。

與 AuthSub 相似:
AuthSub 也需要 scope 參數,才能控管權杖可存取的資料範圍。Google 已按照 OAuth 規格的建議,實作這個參數。

步驟 2:修改 OAuth 參數和設定

目前請勿修改「修改 OAuth 參數」方塊中的任何設定。之後,您可以將 oauth_consumer_key 變更為已註冊的網域,然後按一下「使用自己的私密金鑰」輸入私密金鑰,藉此使用自己的私密金鑰進行測試。請只使用「測試」私密金鑰。

注意:只有 oauth_signature_methodoauth_consumer_key 欄位可在此編輯。系統會自動為你生成 oauth_timestampoauth_nonceoauth_token

除了 RSA-SHA1,您也可以選擇使用 HMAC-SHA1 做為 oauth_signature_method。在這種情況下,Playground 會顯示其他方塊,您必須輸入自己的oauth_consumer_key和消費者密鑰。如要查看這些值,請前往已註冊網域的 https://www.google.com/accounts/ManageDomains 頁面。

與 AuthSub 的差異:
在安全 AuthSub 中,沒有可明確設定網域名稱的參數。 網域會納入 next 網址參數。 OAuth 中有這類參數:oauth_consumer_key。將其設為註冊網域。

步驟 3 至 5:取得存取權杖

取得 OAuth 存取權杖的步驟有三項。第一步是擷取要求權杖。這樣 Google 就能知道您的應用程式正在啟動 OAuth 流程。

首先,按一下「取得權杖」方塊中的「要求權杖」按鈕。

系統會自動填入特定欄位的資料。

  • 「簽章基礎字串」會顯示用於建立 oauth_signature 參數的基礎字串正確格式。
  • 「授權標頭」會顯示要求的對應 Authorization 標頭。
  • 「修改 OAuth 參數」方塊,其中填入要求中傳送的 oauth_nonceoauth_timestamp 值。
  • oauth_token 輸入內容已填入回應主體中傳回的對應值。Playground 也會顯示我們目前擁有的 oauth_token 類型。目前是要求權杖。

接著,按一下「取得權杖」方塊中的「授權」按鈕。

在這個授權頁面中,按一下「授予存取權」按鈕,授權要求權杖,然後重新導向至 OAuth Playground。

與 AuthSub 相似:
這個授權頁面與 AuthSub 相同。

與 AuthSub 的差異:
AuthSub 的 next 網址參數類似於 oauth_callback 參數。 不同之處在於 OAuth 中的 oauth_callback 為選用項目。使用者按一下「授予存取權」按鈕後,要求權杖就會獲得授權,且權杖升級至 https://www.google.com/accounts/OAuthGetAccessToken 的作業可以非同步執行。

提示:如果您要編寫網路應用程式,建議指定 oauth_callback 網址,因為這樣能提供更優質的使用者體驗。

最後,按一下「取得權杖」方塊中的「存取權杖」按鈕。

這項動作會升級授權要求權杖 (如紅色「存取權杖」標籤所示)。

如要擷取新權杖,請按一下「重新開始」,重新啟動 OAuth 流程。

現在我們可以做一些有趣的事!

使用存取權杖

現在您可以查詢動態消息、插入、更新或刪除資料。執行最後三種 HTTP 方法時,請務必謹慎操作,因為您要處理的是實際資料!

提示:如要查看存取權杖可用的動態消息,請按一下「available feeds」(可用動態消息) 按鈕。

以下是範例查詢:GET http://www.blogger.com/feeds/1982051675575479214/posts/default?max-results=3

這個範例會傳回特定網誌最多三則貼文。您也可以點選語法醒目顯示區域下方的「在瀏覽器中查看」連結,直接在瀏覽器中查看傳回的動態消息/項目。

範例:如何更新貼文

  1. 在要更新的貼文中找出含有 rel="edit"<link> 元素。如下所示:
    <link rel="edit" href="http://www.blogger.com/feeds/1982051675575479214/posts/default/8138973184593279875"/>

    href 網址貼到「輸入 Google 資料動態饋給」輸入欄位。

  2. 按一下語法醒目顯示面板頂端的「查看純文字」,複製現有項目的 XML。請只複製回應內文,不要複製標頭。
  3. 將 HTTP 方法下拉式選單變更為 PUT
  4. 按一下該下拉式選單下方的「輸入貼文資料」,然後將 <entry> XML 貼到彈出式視窗中。
  5. 按一下「執行」按鈕。

伺服器會傳回 200 OK

提示:與其手動複製 edit 連結,不如取消勾選「語法醒目顯示?」核取方塊。查詢後,您就能點選 XML 回應主體中的連結。

結論

AtomPub/Atom 發布通訊協定 (Google Data API 的基礎通訊協定) 和 OAuth 等技術有助於推動網路發展。越來越多網站開始採用這些標準,開發人員將是贏家。建立殺手級應用程式不再是難事。

如果您對 OAuth Playground 或搭配 Google API 使用 OAuth 有任何疑問或意見,請前往 G Suite API 和 Marketplace API 支援論壇

資源