貌似如今一接觸到網絡客戶端編程,第一個要解決的問題就是oauth/xauth,那麼就先從這個提及。 算法
再好的某個sns網站的庫,我感受都沒有本身封裝的用的順,因此如下的代碼主要介紹google code上的oauth庫,並對各大網站作一些簡單的介紹。 編程
oauth與xauth的具體原理就很少說了,純理論,xauth至關於oauth的簡化版,省去了oauth中的前2步(3個api中的前2個,獲取未受權的token及跳轉到網站登陸)。 api
先主要介紹幾個類: 網絡
OAAsynchronousDataFetcher,OADataFetcher 這2個類是關於nsurlconnection的封裝。 app
OAConsumer其實就是將app key和app secret作的MVC中的M 異步
OAToken與OAConsumer相似,只不過是token相關的(oauth認證中未受權,已受權的token) ide
OAHMAC_SHA1SignatureProvider 加密算法 網站
OARequestParameter 主要是在http方法爲POST的時候添加POST參數用的,我通常用[hmacSha1Request setOAuthParameterName:key withValue:value];代替 google
OAAsynchronousDataFetcher,OADataFetcher我建議使用異步的,由於作url取消,ssl認證都必須使用異步的(以前同步的能夠用私有api,如今被蘋果乾掉了)。 加密
下面主要介紹一下如何使用這些類
OAConsumer *consumer = [[OAConsumer alloc] initWithKey:sinaAPPKEYsecret:sinaAPPSECRET];
這個永遠是固定的,把2個參數換成申請sns app時得到的。在以後永遠是這個。
建立一個request
加密方法也是固定的(若是一直使用Sha1),若是是第一次訪問,那麼是沒有token的,因此傳NULL就能夠。得到時間戳和隨機字符串的方法在OAMutableURLRequest類中。
OAHMAC_SHA1SignatureProvider *hmacSha1Provider = [[OAHMAC_SHA1SignatureProvider alloc] init];
OAMutableURLRequest *hmacSha1Request = [[OAMutableURLRequest alloc]initWithURL:[NSURL URLWithString:RequestURL]
consumer:consumer
token:NULL
realm:NULL
signatureProvider:hmacSha1Provider
nonce:[self _generateNonce]
timestamp:[self _generateTimestamp]];
發送請求
OAAsynchronousDataFetcher *loginFetcher =
[[OAAsynchronousDataFetcher alloc] initWithRequest:request
delegate:self
didFinishSelector:@selector(requestTokenTicket:finishedWithData:)
didFailSelector:@selector(requestTokenTicket:failedWithError:)];
[loginFetcher start];
這時就能夠等待selector返回數據,而後token就能夠
NSString *responseBody = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
OAToken *token = [[OAToken alloc] initWithHTTPResponseBody:responseBody];
這樣得到。
而後就是講如何區別POST和GET,並傳參。
GET好說,直接在URL後面拼接。
而POST,就像我以前說的2種方法
[hmacSha1Request setOAuthParameterName:key withValue:value];
和
[hmacSha1Request setParameters:[NSArray arrayWithObjects:[[OARequestParameter alloc] initWithName:key value:value],nil]];
上傳圖片的時候會遇到「圖片不參數加密」相似的提示,那麼這時候你就只要先生成request,以後把pic data setHTTPBody一下就能夠了。(pic data我是用的模擬http的方法,不知直接傳data有用不)
如今區別一下各大sns認證的不一樣(主要在於回調URL)
douban,sina的回調URL是在得到了未受權的token以後,跳轉到網頁的URL以get的方式傳過去的oauth_callback。
sina特有oauth_verifier,該加的時候別忘了加上,不然會提示加密錯誤。
而twitter則在第一次獲取未受權的token的request上添加POST參數oauth_callback
最後附上oauth的認證流程demo,以豆瓣和新浪爲例: