網絡編程—oauth簡介及Demo

貌似如今一接觸到網絡客戶端編程,第一個要解決的問題就是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 allocinitWithKey:sinaAPPKEYsecret:sinaAPPSECRET];

這個永遠是固定的,把2個參數換成申請sns app時得到的。在以後永遠是這個。

建立一個request

加密方法也是固定的(若是一直使用Sha1),若是是第一次訪問,那麼是沒有token的,因此傳NULL就能夠。得到時間戳和隨機字符串的方法在OAMutableURLRequest類中。

OAHMAC_SHA1SignatureProvider *hmacSha1Provider = [[OAHMAC_SHA1SignatureProvider allocinit];

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 allocinitWithData:data

encoding:NSUTF8StringEncoding];

OAToken *token = [[OAToken allocinitWithHTTPResponseBody:responseBody];

這樣得到。

而後就是講如何區別POST和GET,並傳參。

GET好說,直接在URL後面拼接。

而POST,就像我以前說的2種方法

[hmacSha1Request setOAuthParameterName:key withValue:value];

[hmacSha1Request setParameters:[NSArray arrayWithObjects:[[OARequestParameter allocinitWithName: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,以豆瓣和新浪爲例:

相關文章
相關標籤/搜索