Oauth那点事

搞OAuth认证也是好久之前的事了,那时公司为了整合人人,sina,qq,开心,豆瓣,就把这个任务交给了我,随着几天的学习,也弄出了个所以然,特此记录!;

一.什么是OAuth认证:

自己百度,谷歌去!

二.为什么要用OAuth认证:

同上,本站不提供说明!

三.怎样使用OAuth认证:

首先我们来看一张图片:

这张图片来源于新浪微博,图片中详细地描述了Oauth认证的几个流程:

1.申请应用获取apiKey和secretKey

2.利用此apiKey和secretKey向新浪服务器发出请求得到未授权的requestToken

3.利用该未授权的requestToken将用户重定向到授权页面

4.用户同意授权之后获取accessToken

5.利用已经授权的accessToken请求受保护的资源.

ok,熟悉了基本的流程之后就来说说具体是怎么操作的,在此之前有个概念需要熟悉一下什么是签名,签名有何作用.

所谓Oauth认证里面的签名就是对你所提交的参数处理得到一个 base string 然后对此进行一定的算法之后得到签名值值,当这个值提交后,服务器端也会结合请求的参数计算得到一个服务器上面的base string 然后再根据相同的算法计算得到一个签名,当所提交的签名与服务器上面的签名一致的时候则本次请求被认为是合法的,否则不能通过.计算签名的算法有好多种,如新浪和QQ,豆瓣都一样的HMAC-SHA1算法,如人人网的md5算法,其实无论哪种算法计算签名的步骤都是差不多的,首先根据要请求的参数形成一个base string,然后通过HMAC-SHA1或MD5等其他之类的算法计算得到签名.我在计算签名的过程中经常犯的错误就是得到base string,不是少写了参数就是忘了附加请求方法,要不然就是编码问题,有时候找了半天也没有发觉.

1.怎样获取requestToken

以新浪为例:

首先来请求requestToken,我们必须先算出base string,根据新浪计算签名的方法如下

httpMethod + "&" +   url_encode(  base_uri ) + "&" +   sorted_query_params.each  { | k, v |       url_encode ( k ) + "%3D" +       url_encode ( v )   }.join("%26")

含义是:请求的方法如:GET,POST,DELETE等加上&在加上经过url编码之后的请求地址如这里要请求requestToken的地址:http://api.t.sina.com.cn/oauth/request_token 接着将要提交的参数(不包括签名)根据自然顺序(首字母大小写顺序)排序,排序之后以参数名key+"%3D"+参数值value的形式将所有参数中间以"%26"连接的形式拼合在一起这样就得到了一个base string,接着就是计算签名值,计算签名的方法各种语言里面基本都包含了,没有的话可以自己去查,我是用java里面的

 Mac mac = Mac.getInstance("HmacSHA1");

来计算的。得到签名之后,将所有的参数以http headers形式请求,之后我们就能带到未授权的requestToken

2.引导用户授权

得到requestToken之后还必须引导用户去授权,即允许你的应用去修改用户的信息,这里我摘录了新浪api文档上的一段内容:

这一步主要是发送你获取的oauth_token,并且获得用户的授权。一般来说,WEB应用会简单的重定向到相应的页面,桌面应用程序会给出URL并要求用户自行验证.

新浪微博开放平台的验证URL是http://api.t.sina.com.cn/oauth/authorize 。要求必须以oauth作为参数,一般来说请求格式如下:

http://api.t.sina.com.cn/oauth/authorize?oauth_token=8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc

如果用户没有登录新浪微博,则会要求用户登录。否则将会出现一个页面,用户可以在此页面上一键同意或者拒绝对此应用授权。用户授权后,web应用页面将会重定向至你指定的oauth_callback,如果是桌面应用,将会显示PIN码,用户需要将PIN码输入你的应用中来完成授权过程。

如果使用了callback,那么oauth_callback应该已经接到返回的信息,其中包含oauth_token和oauth_verifier。

这是我们的测试结果图:

这里就是授权页面,用户输入账号和密码授权之后就会得到一个oauth_token和oauth_verifier。

利用这个就可以去换取accessToken了。换取accessToken的流程也基本差不多,就是去计算签名请求服务器.得到accessToken之后大家就可以去获取你关心的数据啦!

网上也有一些开源的库大家可以调用直接来oauth认证,搜索下就可以发现了。好啦,有朋友不明白的可以给我邮件!最后祝大家快乐!

 

posted @ 2011-08-15 10:53  leepood  阅读(432)  评论(2)    收藏  举报