貌似如今一接触到网络客户端编程,第一个要解决的问题就是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,以豆瓣和新浪为例: