为什么出现oauth2.0
1 oauth1.0对手机客户端,移动设备等非server第三方的支持不好。其实oauth1.0也是可以支持手机客户端,移动设备等,也有相应的流程。但是oauth1.0是将多种流程合并成了一种,而事实证明,这种合并的流程体验性非常差
2 oauth1.0的三步认证过程比较繁琐和复杂,对第三方开发者增加了极大的开发难度
3 oauth1.0的加密需求过于复杂,第三方开发者使用oauth之前需要花费精力先实现oauth1.0的加密算法
4 oauth1.0的拓展性不够好
5 oauth1.0生成的access_token要求是永久有效的,这导致的问题是网站的安全性和破坏网站的架构
因此出现了oauth2.0
oauth2.0针对1.0的各种问题提供了解决方法:
1 oauth2.0提出了多种流程,各个客户端按照实际情况选择不同的流程来获取access_token。这样就解决了对移动设备等第三方的支持,也解决了拓展性的问题
2 oauth2.0删除了繁琐的加密算法。利用了https传输对认证的安全性进行了保证
3 oauth2.0的认证流程一般只有2步,对开发者来说,减轻了负担
4 oauth2.0提出了access_token的更新方案,获取access_token的同时也获取refresh_token, access_token是有过期时间的,refresh_token的过期时间较长,这样能随时使用refresh_token对access_token进行更新
oauth2.0的现状
oauth2.0截止到2011/8/31 为止已经发布更新了20个版本,下面是oauth2.0的ietf标准文档:
http://tools.ietf.org/html/draft-ietf-oauth-v2-20
oauth2.0得到了越来越多大公司的支持,比如microsoft,yahoo等,也在实际使用过程中不断得到优化和完善,oauth2.0已经成为了业界通用和使用的标准。
oauth2.0的实现
oauth2.0有许多种流程,分别适应不同的第三方应用,并且这些流程数目还在不断增加和完善中,一个网站可以实现一种或多种流程
比如最典型的6中流程有 :
User-Agent Flow 客户端运行于用户代理内(典型如web浏览器)。
Web Server Flow 客户端是web服务器程序的一部分,通过http request接入,这是OAuth 1.0提供的流程的简化版本。
Device Flow 适用于客户端在受限设备上执行操作,但是终端用户单独接入另一台电脑或者设备的浏览器
Username and Password Flow 这个流程的应用场景是,用户信任客户端处理身份凭据,但是仍然不希望客户端储存他们的用户名和密码,这个流程仅在用户高度信任客户端时才适用。
Client Credentials Flow 客户端适用它的身份凭据去获取access token,这个流程支持2-legged OAuth的场景。
Assertion Flow 客户端用assertion去换取access token,比如SAML assertion。
以开心网为例(开心网是实现了oauth2.0的第10个版本)
开心网实现了
Web Server Flow
User-Agent Flow
Username and Password Flow
三种方式
http://wiki.open.kaixin001.com/index.php?id=OAuth2.0%E6%96%87%E6%A1%A3
oauth2.0的客户端实现是非常方便的,开心网的说明文档也已经非常全了,这里就不多说了
下面说一下各个流程的步骤:
Web Server Flow:
web ServerFlow是把oauth1.0的三个步骤缩略为两个步骤
首先这个是适合有server的第三方使用的。
1客户端http请求authorize
2服务端接收到authorize请求,返回用户登陆框页面
3用户在客户端登陆
4服务器端将浏览器定位到callbackurl,并同时传递Authorization Code
5客户端使用https发送access_token
6服务器端收到access_token请求,验证Authorization Code---生成access_token, refresh_token,和过期时间--access_token和refresh_token和过期时间入库
7 返回access_token和refresh_token,过期时间
8 用户使用HTTPS+ access_token请求开放平台接口
User-Agent:
适合所有无server端配合的客户端
1客户端http请求authorize
2服务端接收到authorize请求,返回用户登陆框页面
3用户在客户端登陆
4服务器端将浏览器定位到callbackurl,并同时传递access_token和过期时间
这里面的access_token可以考虑放在缓存中而不是放在数据库中,一旦过期时间到就可以作废了
Username and Password Flow
适合所有情况
1 客户端https请求access_token(使用https是由于参数中带着开心网的用户名和密码信息)2 服务器端收到access_token请求---生成access_token, refresh_token,和过期时间--access_token和refresh_token和过期时间入库
3 json返回access_token, refresh_token,和过期时间
特别说明:
oauth2.0客户端得到access_token之后是使用https来调用请求的,这样做的目的主要是放重放和数据泄露
本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2011/08/31/2161259.html,如需转载请自行联系原作者