1、OAuth協議簡介php
OAuth受權在各社交網站中普遍使用,該協議使用戶不須要直接向第三方應用提供用戶名及密碼,而且使一個帳戶在多個網站中使用成爲可能,OAuth協議的細節描述可參考其官方網站:http://oauth.nethtml
目前OAuth 1.0已經出了final version,即RFC 5849,OAuth 2.0也已在起草中。java
這篇文章中,我想用比較通俗的語言來解釋OAuth協議。web
OAuth協議中包含了三個角色:
Service Provdier,即服務提供者,如新浪微博;
User,即普通用戶,如新浪微博用戶;
Consumer,即第三方應用,如本人開發的應用。瀏覽器
現有以下場景:User想利用Consumer來更新本身在Service Provider中的狀態,但此時Service Provider並不信任Consumer,且User也不想把賬號和密碼告訴Consumer,因而三者之間須要創建起信任關係。安全
Consumer首先要向Service Provider申請一對Consumer_Key和Consumer_Secret,以此取得Service Provider的信任。由於User是信任Service Provider的,因此User與Consumer間的信任關係須要藉助Service Provider來創建。服務器
Consumer用本身的Consumer_Key和Consumer_Secret向Service Provider請求到一對Request_Token和Request_Token_Secret,然後Consumer拿上這對RequestToken,領着User去見Service Provider。Service Provider見到本身發的RequestToken,便確認Consumer是值得信任的,因而把頭轉向User。若是Service Provider不記得User了,只要User向Service Provider提供用戶名和密碼,就能創建起信任關係。而後Service Provider對User說:「我很信任這個Consumer,你是否是也要信任他?」,若User確認,則Service Provider容許Consumer把User帶回去,併發給Consumer一個Verifier.session
回來之後,Consumer拿着RequestToken和Verifier又單獨去找Service Provider,取回來一對Access_Token和Access_Token_Secret,並長期保存。併發
至此,三方信任關係就創建起來了,Consumer每次在Service Provider中更新User的狀態時,只須要提供這對AccessToken,Service Provider便能肯定此Consumer能代替User進行相應的操做。app
在使用相關OAuth庫進行開發時,所須要的關鍵字在以上場景中都有體現,包括:
Consumer_Key, Consumer_Secret, Request_Token, Request_Token_Secret, Verifier, Access_Token, Access_Token_Secret
OAuth受權流程圖以下:
2、新浪微博開放平臺OAuth受權接口
新浪微博開放平臺文檔中聲明「注意因爲OAuth 1.0版有安全漏洞,咱們僅支持最新的1.0a協議」,其中OAuth 1.0a 就是目前的RFC 5849.
新浪微博OAuth受權機制說明可參考:
http://open.t.sina.com.cn/wiki/index.php/受權機制說明
爲了方便使用,新浪微博提供了網頁應用和桌面應用兩種OAuth受權方式。
關於OAuth受權的三個接口:
oauth/request_token:Consumer使用該接口向Service Provider索取RequestToken
oauth/authorize:Consumer帶上RequestToken,領着User,三者再此接口見面
oauth/access_token:Consumer拿着RequestToken和Verifier,在此接口向Service Provider索取AccessToken
3、Java平臺上的新浪微博OAuth受權
新浪微博開放平臺提供了一個功能強大的Java SDK,即weibo4j,下載頁面:
http://open.t.sina.com.cn/wiki/index.php/SDK#Java_SDK
此SDK改編自著名的twitter4j,封裝了OAuth等其餘經常使用的API,幷包含一些示例程序。
下載weibo4j並解壓,readme.txt文件內有該SDK的簡要說明,其中包括了OAuth受權的示例用法。爲了更方便的體驗OAuth受權,我將其中關於OAuth受權的示例提出,單獨建了一個名爲sinaoauth的web項目,點擊下載
下載sinaoauth後需修改相關內容:
一、在\WEB-INF\src\weibo4j\Configuration.java文件的65和66行填上本身申請的Consumer_Key和Consumer_Secret
二、若Web服務器的地址不是http://localhost:8080,則對\call.jsp文件的第9行中的url進行修改
修改完成後,將sinaoauth項目複製到Web服務器的webapps下運行,在瀏覽器中輸入:http://localhost:8080/sinaoauth/call.jsp 便可開始體驗新浪微博OAuth受權。
進一步對代碼進行分析,call.jsp和callback.jsp兩個jsp頁面負責與用戶的交互,call.jsp將User帶到Service Provider,而callback.jsp負責迎接從Service Provider返回的User,其中用到一個名爲weboauth的JavaBean,這是OAuth受權的核心控制部分,對應的java源文件是\WEB-INF\src\weibo4j\examples\WebOAuth.java
WebOAuth類中的request方法以下,該方法對應oauth/request_token接口,接收一個callbackurl參數,即User從Service Provider受權回來後的入口,返回從Service Provider獲取的RequestToken,並利用oauth/authorize接口構造受權地址。此後,在call.jsp裏將該RequestToken臨時存放於session中。
Java代碼
requstAccessToken方法以下,該方法對應oauth/access_token接口,接收存放在session中的RequestToken和從Service Provider帶回來的Verifier,並返回從Service Provider索取的AccessToken,該AccessToken應該被持久化存儲,而存放在session中的RequestToken則應失效。
Java代碼
update方法演示瞭如何利用AccessToken來更新User的狀態,代碼淺顯易懂。
Java代碼
在桌面應用中,相似Web應用的網頁跳轉沒法實現,新浪微博提供了PIN碼的機制,流程與以上描述相似,但須要用戶本身打開瀏覽器,而後將獲得的PIN碼輸入到應用中,在sinaoauth項目裏,能夠直接運行\WEB-INF\src\weibo4j\examples\OAuthUpdate.java進行體驗,此源文件內爲一個控制檯應用程序。
這篇文章從OAuth協議介紹寫到新浪微博OAuth受權的Java實現,但願能起到拋磚引玉的做用,讓不熟悉OAuth協議的朋友瞭解它,也給有意在Java平臺上開發新浪微博OAuth受權應用的朋友提供一個參考。一直認爲新浪微博的開放平臺作得頗有誠意,在廣大開發者和網友的支持下,路必定會越走越寬。