为什么出现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标准文档:

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

三种方式



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来调用请求的,这样做的目的主要是放重放和数据泄露 


作者:yjf512(轩脉刃)

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明