擴充套件 Spring Social 的服務提供商框架
上週,我向您介紹了 Spring Social 的服務提供商“連線”框架,並向您展示了它如何簡化使用者本地應用程式帳戶與其在軟體即服務 (SaaS) 提供商上的帳戶之間的連線建立。今天,我想向您展示如何擴充套件服務提供商框架,以處理與 Spring Social 不直接支援的提供商的連線。
為 Netflix 擴充套件 Spring Social
假設您正在開發一個電影評論網站,使用者可以在其中閱讀和釋出簡短的電影評論。通常,電影評論會顯示在主頁上,最新的條目排在最前面。但是,如果使用者將其帳戶與 Netflix 帳戶關聯,那麼您就可以向他們展示他們在 Netflix 影碟佇列中的電影評論。為了實現這一點,您希望利用 Spring Social 的服務提供商框架來連線您的使用者帳戶與他們的 Netflix 帳戶。Spring Social 1.0.0.M2 不包含 Netflix 服務提供商或 API 繫結,但可以輕鬆擴充套件以支援未直接支援的提供商。
在本文中,我將向您展示如何基於 Spring Social 的服務提供商框架,啟用與 Netflix 的連線。我們將首先開發一個 Netflix 服務提供商實現,然後構建一個簡單的 API 繫結來支援我們應用程式的需求。用於開發 Netflix 服務提供商的技術可以應用於擴充套件 Spring Social 以支援幾乎任何服務提供商。您可以檢視 GitHub 上的示例程式碼 來進行學習。
瞭解 Netflix 的授權 API
在我們開始開發 Netflix 服務提供商實現之前,我們需要做一些初步研究,以瞭解 Netflix 授權 API 的基本工作原理。
我們需要確定的第一件事是 Netflix 使用哪種授權協議。Netflix API 文件的 身份驗證概述 部分告訴我們,他們使用 OAuth,但並未明確說明使用的是哪個版本的 OAuth 規範。因此,需要進行一些偵探工作。
頁面向下滾動一點(在“那些討厭的 OAuth 引數”標題下),我們看到了關於客戶端金鑰、隨機數和時間戳的提及。這些都不是 OAuth 2 所適用的,所以 Netflix 必須是一個 OAuth 1 提供商。此外,oauth_version 引數設定為“1.0”的描述進一步證實了 Netflix 實現的是 OAuth 1。
現在我們知道 Netflix 使用 OAuth 1。但同樣重要的是要知道他們是實現了規範的 1.0 版本還是 1.0a 版本。服務提供商通常不會在其文件中明確說明這一點,而且在任何一種情況下 oauth_version 的值都應該是“1.0”。然而,有一些蛛絲馬跡表明使用了特定版本的 OAuth 規範。以下是一些表明 OAuth 1.0 正在使用的線索:
oauth_callback引數在授權 URL 上傳送,而不是在請求令牌請求中傳送。- 沒有驗證器的概念,並且不需要將
oauth_verifier引數傳送到訪問令牌 URL。
對於 OAuth 1.0a,請留意以下跡象:
oauth_callback引數在請求令牌請求中傳送,而不是在授權 URL 中傳送。- 在回撥中從提供商那裡收到驗證器,並且需要將
oauth_verifier引數傳送到訪問令牌 URL。
透過在 Netflix 文件中尋找這些線索,我們確定 Netflix 使用的是 OAuth 1.0(而不是 1.0a)。這個資訊很重要,在我們定義服務提供商實現時會很有用。
最後,我們需要知道請求令牌、授權和訪問令牌的 URL 是什麼。頁面再往下(在“發起受保護呼叫”標題下),您會找到細節,告知我們所需的 URL 如下:
- 請求令牌 URL: http://api.netflix.com/oauth/request_token
- 授權 URL: https://api-user.netflix.com/oauth/login
- 訪問令牌 URL: http://api.netflix.com/oauth/access_token
請特別注意請求令牌和訪問令牌 URL 中使用的協議。大多數提供商在這方面很靈活,建議您使用 HTTPS。然而,根據我與 Netflix 打交道的經驗,我發現如果您透過 HTTPS 請求請求令牌或訪問令牌,Netflix 會抱怨請求籤名無效。不過,授權 URL 在 HTTPS 上工作正常。
開發 Netflix 服務提供商實現
要建立新的服務提供商實現,我們需要擴充套件 AbstractOAuth1ServiceProvider 或 AbstractOAuth2ServiceProvider。這兩個類分別提供了 OAuth 1.0/1.0a 和 OAuth 2 的特定 OAuth 版本的基礎功能。由於 Netflix 是一個 OAuth 1.0 提供商,我們的 NetFlixServiceProvider 需要擴充套件 AbstractOAuth1ServiceProvider。
package org.springframework.social.movies.netflix;
import org.springframework.social.connect.oauth1.AbstractOAuth1ServiceProvider;
import org.springframework.social.connect.support.ConnectionRepository;
import org.springframework.social.oauth1.OAuth1Template;
public final class NetFlixServiceProvider extends AbstractOAuth1ServiceProvider<NetFlixApi> {
public NetFlixServiceProvider(String consumerKey, String consumerSecret, ConnectionRepository connectionRepository) {
super("netflix", connectionRepository, consumerKey, consumerSecret,
new OAuth…