首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 OAuth 1.0 協議的 Java 應用開發:整合 Google Data API 完整實作

     編輯:Java 相關知識

OAuth 核心價值

  • 安全:Consumer 無需接觸用戶帳號密碼
  • 開放:任何服務提供者 (SP) 可實作,任何 Consumer 可接入
  • 簡單:標準化流程,豐富客戶端庫支援

OAuth 1.0 三角關係與流程

OAuth Solution

角色:User (資源擁有者)、Consumer (應用)、Service Provider (Google 等)

OAuth 授權流程

七步驟授權流程

  1. Consumer 向 SP 請求 Unauthorized Request Token
  2. SP 驗證 Consumer 簽名,回傳 Request Token + Token Secret
  3. 3. Consumer 導向用戶至 SP 授權頁 (User 登入並點擊 Allow) 4. SP 導回 Consumer Callback URL (攜帶授權後的 Request Token) 5. Consumer 用授權後的 Request Token 換取 Access Token 6. SP 回傳 Access Token + Token Secret 7. Consumer 攜帶 Access Token 簽名請求受保護資源

關鍵術語

術語說明
Consumer KeyConsumer 在 SP 的唯一識別
Consumer Secret驗證 Consumer 擁有 Key 的共享密鑰
Request Token暫時憑證,用於換取 Access Token
Access Token長效憑證,用於存取受保護資源
Token Secret驗證 Consumer 擁有 Token 的共享密鑰

實作準備:Google OAuth 設定

  1. 登入 https://www.google.com/accounts/ManageDomains 註冊網域
  2. 2. 取得 OAuth Consumer Key (如 www.example.com) 與 Consumer Secret 3. 產生自簽 X.509 憑證,上傳公鑰給 Google (用於 RSA-SHA1 簽名驗證)

Java 程式碼實作 (Google Code OAuth Library)

// 1. 定義 SP 端點
OAuthServiceProvider provider = new OAuthServiceProvider(
    "https://www.google.com/accounts/OAuthGetRequestToken",
    "https://www.google.com/accounts/OAuthAuthorizeToken",
    "https://www.google.com/accounts/OAuthGetAccessToken");

// 2. 建立 Consumer
OAuthConsumer consumer = new OAuthConsumer(null,
    "www.example.com",           // Consumer Key
    "hIsGkM+T4+90fKNesTtJq8Gs",  // Consumer Secret
    provider);

// 3. 設定 RSA-SHA1 簽名與私鑰
consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.RSA_SHA1);
consumer.setProperty(RSA_SHA1.PRIVATE_KEY, privateKey); // PKCS#8 格式

// 4. 取得 Access Token (桌面應用模式)
OAuthAccessor accessor = new OAuthAccessor(consumer);
OAuthClient client = new OAuthClient(new HttpClient4());

// 請求 Request Token,指定 scope (Calendar)
Collection<Map.Entry> params = OAuth.newList("scope", "https://www.google.com/calendar/feeds/");
client.getRequestTokenResponse(accessor, null, params);

// 導向用戶授權 (開啟瀏覽器)
String authUrl = OAuth.addParameters(provider.userAuthorizationURL, OAuth.OAUTH_TOKEN, accessor.requestToken);
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + authUrl);
System.in.read(); // 等待用戶完成授權

// 換取 Access Token
client.getAccessToken(accessor, null, null);
String accessToken = accessor.accessToken; // 長效憑證

使用 Access Token 呼叫 Google Calendar API

GoogleService service = new GoogleService("cl", "oauth-sample-app");
OAuthSigner signer = new OAuthRsaSha1Signer(privateKey);

OAuthParameters params = new OAuthParameters();
params.setOAuthConsumerKey("www.example.com");
params.setOAuthToken(accessToken);
service.setOAuthCredentials(params, signer);

// 取得所有行事曆
URL feedUrl = new URL("https://www.google.com/calendar/feeds/default/allcalendars/full");
Feed<CalendarEntry> result = service.getFeed(feedUrl, Feed.class);

for (CalendarEntry entry : result.getEntries()) {
    System.out.println(entry.getTitle().getPlainText());
}

完整桌面應用類別結構

DesktopClient.java  // 封裝 OAuth 流程:取 Request Token → 開啟瀏覽器 → 等待 → 取 Access Token
GoogleOAuthExample.java // 主程式:載入私鑰、建立 Consumer/Client、呼叫 Calendar API

完整代碼見原文 List 1。

驗證授權狀態

用戶可至 https://www.google.com/accounts/IssuedAuthTokens 查看/撤銷已授權的 Consumer。

Google 授權管理頁面

遷移至 OAuth 2.0 提醒

本文基於 OAuth 1.0 (RFC 5849)。Google 等大型 SP 已全面轉向 OAuth 2.0 (Bearer Token, HTTPS 傳輸,無簽名複雜度)。新專案請直接使用 OAuth 2.0 庫 (如 Google OAuth Client Library for Java、Spring Security OAuth、Apache Oltu)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved