OAuth认证
为了安全地访问在线服务,用户需要在服务上进行身份验证,即要提供他们的身份的证明。对于一个要访问第三方服务的程序来说,安全问题甚至更复杂。不仅仅是用户需要在访问服务前要进行身份验证,而且程序也要进行身份验证来授权用户。在分享过程中不可避免的会考虑到用户账户安全性的问题,第三方程序不应该直接接触用户账户信息,但是没有账户信息,又如何取得SNS平台的数据呢?OAuth很好的解决了这个问题,从第三方发起认证过程,在webview或者浏览器中完成认证过程,获得access token来代替账户密码,从而可以获取平台数据。OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。
使用OAuth2有利于:
从用户手中得到授权访问那些需要他/她的账户的在线服务。
代替用户在一个在线服务上验证身份。
处理验证错误.
OAuth的基本概念,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。
OAuth 1.0已经在IETF尘埃落定,编号是RFC5894:http://tools.ietf.org/html/rfc5849,这也标志这OAuth已经正式成为互联网标准协议。OAuth 2.0也早已经开始讨论和建立的草案。OAuth在OAuth组织的主页: http://www.oauth.net/2/。
OAuth2.0的草案: http://tools.ietf.org/html/draft-ietf-oauth-v2-05
协议的创始人和推动者说OAuth 2.0的正式版会在今年年底正式发布,现在的草案还很不完善,有很多东西值得继续推敲。如果你订阅了OAuth的mailing list,你会发现每天都有关于OAuth 2.0的议题,每天都有各种有深度的讨论。但作为一个学习者,虽然2.0尚未发布,但是此时跟进学习的好处无疑是巨大的。有关于OAuth2.0的详细介绍,请参考 http://www.eoeandroid.com/thread-166759-1-1.html。在此不再多介绍什么了。
OAuth1认证基本步骤:
1、获取未授权的Request Token(temporary credentials)
2、请求用户授权Request Token
3、使用授权后的Request Token换取Access Token(token credentials)
4、使用 Access Token 访问或修改受保护资源
示意图(来自腾讯微博开发文档)
第一步,请求签名
所有的OAuth请求使用同样的算法来生成(signature base string)签名字符基串和签名。
base string是把http方法名,请求URL以及请求参数用&字符连起来后做URL Encode编码。具体来讲,base string由http方法名,之后是&,接着是过url编码(url-encoded)之后的url和访问路径及&。接下来,把所有的请求参数包括POST方法体中的参数,经过排序(按参数名进行文本排序,如果参数名有重复则再安参数值进行重复项目排序),使用%3D替代=号,并且使用%26作为每个参数之间的分隔符,拼接成一个字符串。
第二步,获取未授权的Request Token;
接口地址:
支持格式:OAuth HTTP 标准认证返回格式
HTTP请求方式:GET/POST
是否需要登录:否
请求参数:
返回参数:
注:有一些平台不需要输入scope参数,在开发时请参照开发文档。
第三步,请求用户授权Request Token;
接口地址:
支持格式:OAuth HTTP 标准认证返回格式
HTTP请求方式:GET/POST
是否需要登录:否
请求参数:
返回参数:
第四步,使用已经授权的Request Token换取Access Token,然后使用Access Token访问受限的资源了。
接口地址:
支持格式:OAuth HTTP 标准认证返回格式
HTTP请求方式:GET/POST
是否需要登录:否
请求参数:
返回参数:
OAuth 2.0
OAuth2.0和OAuth1.0的区别还是在于简化了认证过程,不需要从未授权的Request Token转化到授权Request Token,而是利用app key通过用户授权生成access token但是,与1.0的不同之处是access token有自身的有效期,且不同平台、不同级别的程序有着不同的有效期,在程序开发中一定记得判断access token是否过期,对于过期之后的处理方法主要是利用access token和refresh token重新生成access token或者重新利用app key向服务器发送请求生成access token。由于这个问题,与OAuth1.0基本一致不一样,各个平台OAuth2.0做了不一样的选择。
OAuth2.0服务支持以下获取Access Token的方式:
a. Authorization Code:Web Server Flow,适用于所有有Server端配合的应用。
b. Implicit Grant:User-Agent Flow,适用于所有无Server端配合的应用。
因为demo是无服务器的程式,所以我们采用Implicit Grant:User-Agent Flow的获取方式。
示意图(来自腾讯微博开发文档)
- 获取Access Token
为了获取Access Token,应用需要将用户浏览器(或手机/桌面应用中的浏览器组件)到OAuth2.0授权服务的“http://xxxxxxxxx/authorize”地址上,并带上以下参数:
若用户登录并接受授权,授权服务将重定向用户浏览器到“redirect_uri”,并在Fragment中追加如下参数:
下面以新浪微博的OAuth认证过程来详细解说:当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来这个就是用来代替用户的新浪账号和密码用的,在后面调用api时都需要。从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证了安全性。
新浪微博的OAuth认证 效果图如下:
总结一下,OAuth认证其实很简单,调用api也是根据各个平台进行些许的调整而已,在进行开发的过程更细心的一点应该没什么问题,如果你有问题,欢迎大家来交流。关于代码的问题,大家把平台上相关的SDK下载下来稍微研究一下就可以了。
开发文档地址:
新浪:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5
空间:http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E6%96%87%E6%A1%A3%E8%B5%84%E6%BA%90
腾讯:http://wiki.open.t.qq.com/index.php/%E9%A6%96%E9%A1%B5
人人:http://wiki.dev.renren.com/wiki/%E9%A6%96%E9%A1%B5
开心:http://open.kaixin001.com/document.php
豆瓣:http://www.douban.com/service/apidoc/
搜狐:http://open.t.sohu.com/en/%E9%A6%96%E9%A1%B5
网易:http://open.t.163.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5
参考链接:http://www.cnblogs.com/lingyun1120/archive/2012/07/11/2585767.html
novoda / oauth_for_android----这是一个为 Android 程序开发的 OAuth 库/应用, GitHub链接:https://github.com/novoda/oauth_for_android,可以自己下载来研究研究噶。