從 ClientLogin 移至 OAuth 2.0

Ikai Lan,YouTube Developer Relations – June 2013

YouTube API 使用 OAuth 2.0 授權使用者要求。常常會詢問是否增加 ClientLogin 驗證的支援,或是日後在 YouTube API 中的類似功能。不過,我們已自 2012 年 4 月 20 日起開始淘汰 ClientLogin,因此沒有新增這類機制的計畫。

基於多種原因,我們相信為 YouTube 使用者提供支援 OAuth 2.0 授權的多種流程比 ClientLogin 來得好。這些流程支援電腦版應用程式、僅限網頁版的應用程式、原生行動應用程式,甚至是在沒有複雜輸入機制的電視 (例如電視) 上執行的應用程式,而 ClientLogin 並不是如此。此外,我們發現 ClientLogin 為許多開發人員造成更多困擾,我們在網誌文章 (ClientLogin #FAIL) 中說明瞭部分問題。

將 OAuth 2.0 用於伺服器端的獨立指令碼

許多開發人員會使用 ClientLogin 來授權在沒有瀏覽器的伺服器上執行指令列指令碼。使用 OAuth 2.0 幾乎必然都會涉及瀏覽器,不過,處理使用 Google Play Services 透過 GoogleAuthUtil. 擷取憑證的 Android 應用程式時除外

僅限網頁流程中,如果網站想要代表使用者發出經過驗證的 API 呼叫,必須將使用者重新導向至 google.com 驗證頁面,其中說明應用程式嘗試存取的內容。接著,網路應用程式會收到一個憑證,用來進行 API 呼叫。以便使用者隨時透過 connected apps and sites 網頁撤銷應用程式的存取權。

我們的 Python 程式碼範例示範如何透過指令列指令碼啟動瀏覽器,並透過終端機視窗發出 API 呼叫、建立本機伺服器來在授權重新導向後監聽程式碼,以及自動儲存憑證供日後 API 呼叫使用。以下為實際使用的影片:

使用的符記為 ASCII 字串。如果是 offline 權杖,則可可攜式。使用擷取的權杖後,您就可以在電腦上執行指令碼,然後在沒有 GUI 的遠端伺服器上複製並使用程式碼,前提是程式碼會使用相同的用戶端 ID 和密鑰將 OAuth 2.0 用戶端執行個體化。除了 Python 以外,其他程式設計語言的 Google API 用戶端程式庫也提供了用於管理憑證的輔助方法,可在用戶端之間共用,甚至在用戶端標頭或網址參數中直接用於較低層級的 HTTP 程式庫。

以下列舉幾種使用離線權杖的伺服器端指令碼:

  • 透過 Daemon 監控新影片的目錄,並自動上傳到 YouTube
  • Cron 工作每天都會更新內容,以更新播放清單
  • 這個指令碼可透過 YouTube Analytics API 監控影片資料,並在特定事件發生時通知頻道管理員,例如匯總觀看時間超過限制。請注意,在這種情況下,OAuth 2.0 是唯一支援的授權方法,因為 Analytics (分析) API 不支援 ClientLogin。

如要進一步瞭解如何產生可用於伺服器端程序的離線權杖,請參閱長效存取憑證一節。

用戶端 ID 和用戶端密鑰最佳做法

任何共用相同用戶端 ID 和密鑰配對的程式碼都可以使用同一個存取憑證。建議您限制用戶端 ID 和用戶端密鑰的存取權,以便存取在貴機構機器和裝置上執行的程式碼。

請勿在用戶端行動應用程式程式碼中加入用戶端 ID 和用戶端密鑰。所有透過行動裝置進行 OAuth 2.0 驗證的開發人員都應使用「已安裝的應用程式」用戶端 ID。該用戶端會要求提供額外資訊,以驗證該要求是否確實來自您團隊推出的應用程式。

在 Android 裝置上,您的應用程式會使用套件名稱和簽署憑證雜湊進行辨識,而不是使用用戶端 ID 和用戶端密鑰。iOS 裝置會使用軟體包 ID 和應用程式商店 ID。如需擷取這項資訊的官方說明文件,請參閱 Google API Console 說明網頁

服務帳戶無法搭配 YouTube API 使用

服務帳戶無法用來執行 YouTube Data API 呼叫,因為服務帳戶需要相關聯的 YouTube 頻道,因此您無法將新的或現有的頻道與服務帳戶建立關聯。如果您使用服務帳戶呼叫 YouTube Data API,API 伺服器就會傳回錯誤 (錯誤類型設為 unauthorized,原因設為 youtubeSignupRequired)。

YouTube API 的離線/長期使用權限

OAuth 2.0 具有短期憑證和長期憑證。針對一次性作業,短期的存取權杖是最佳選擇。這些權杖會在取得授權後不久失效。對於長時間執行的工作,您可能需要取得重新整理權杖,以用來擷取短期的存取權杖。

如要確保您的應用程式收到長效的更新憑證,而不是短存取憑證,請在建立用戶端 ID 時使用「已安裝的應用程式」流程,並在「已安裝的應用程式類型」值中選取 Other

建議您針對此用途使用「已安裝的應用程式」流程。如果需要在網路應用程式中長期存取 YouTube API,只要在初始授權要求或用戶端設定中將 access_type 參數設為 offline,並將 approval_prompt 參數設為 force 即可。部分用戶端程式庫會管理擷取和更新存取憑證。如果您有興趣自行撰寫自訂授權碼,可發布 Google 程式碼網誌上的網誌文章做為程式碼的基礎。

在手機、平板電腦和其他裝置上使用 OAuth 2.0

編寫 Android 應用程式時,開發人員可以利用 Google Play services 來處理授權詳細資料。Google Play 服務提供所有 Google API 的標準授權流程,包括 YouTube 平台的 API。與使用 ClientLogin 的自訂驗證相比,這種做法能為您的 Android 應用程式使用者提供更優質的使用者體驗。

在 iOS 裝置上,Google 提供以下兩個選項:

如果裝置的用途是做為「第二個螢幕」的裝置,或者不需要使用簡單輸入機制的電視 (例如電視),則建議您使用 OAuth 2.0 裝置。需要授權要求時,裝置專用的 OAuth 2.0 會向使用者顯示專屬代碼。此時,系統會要求使用者透過其他裝置 (例如筆記型電腦或手機) 瀏覽至 http://google.com/device,然後輸入專屬代碼。此應用程式會顯示如下的畫面:

當使用者在其他裝置上輸入存取碼時,應用程式會定期輪詢,以確認是否已輸入代碼。完成後,它就會擷取憑證,以便進行 API 呼叫。如想瞭解實際使用狀況,請參考這部示範影片,這項功能可在任何已啟用網路的裝置上執行。這項 API 本身適用於平台,因此對於沒有網頁轉譯功能的裝置非常實用。我們已張貼 Python 的範例程式碼做為示範。

摘要

OAuth 2.0 授權為需要 YouTube 授權的開發人員提供了彈性。ClientLogin

如果您對 OAuth 2.0 或本文中的任何範例有任何疑問,歡迎透過 StackOverflow 上的 youtube-api 標記提問。