角色:User (資源擁有者)、Consumer (應用)、Service Provider (Google 等)
| 術語 | 說明 |
|---|---|
| Consumer Key | Consumer 在 SP 的唯一識別 |
| Consumer Secret | 驗證 Consumer 擁有 Key 的共享密鑰 |
| Request Token | 暫時憑證,用於換取 Access Token |
| Access Token | 長效憑證,用於存取受保護資源 |
| Token Secret | 驗證 Consumer 擁有 Token 的共享密鑰 |
https://www.google.com/accounts/ManageDomains 註冊網域www.example.com) 與 Consumer Secret
3. 產生自簽 X.509 憑證,上傳公鑰給 Google (用於 RSA-SHA1 簽名驗證)
// 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; // 長效憑證
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。
本文基於 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)。