OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749。
auth2.0的功用:首先说一下为什么需要auth2.0,auth2.0是开放平台互联协议,可以这样理解,A是行业中的小生,两手空空;B是行业大佬,财大气粗,有一大批人(用户群);这个时候A需要借用B的用户群信息来构建自己的项目中的某项功能,但是出于资源的保护和各方面原因,B不相信A,不会让A接入自己的信任体系里面,A是无法直接获取B那边用户群的用户名和密码的,同时A又想借用B拥有的用户群信息来完善自己项目中的某些功能,这个时候就需要auth2.0来做中介,通过一些业务流程来实现A在没有B的用户群的直接信息(账户和密码),可以间接的获取到B那边的用户群的其他信息(除了用户名和密码,如用户昵称等等),至于信息的开发程度,那得看B了。说白了就是如何使得A在没有B的用户群的密码和账号的情况下获取B的用户群的其他的信息,auth2.0就是解决这样的问题。
其实很多拥有大的资源信息的网站或者公司都有自己的开发平台的,用来开放自己的一些资源信息,通过比如说auth2.0等一些折中的手段来达到拥有大的资源信息的网站或者公司和开发者的共赢的局面,因为拥有大的资源信息的网站或者公司的可以根据开发者开发出来的应用的类型来定向的判断用户类型,这样之后,拥有大的资源信息的网站或者公司就可以根据用户是什么类型的,定向的推送广告,做大数据分析,与此同时,开发者也能达到开发出自己完整的应用的目的,真正的共赢。
其实auth2.0工作有几种模式:简化模式,密码模式,客户端模式,授权码模式,其中授权码模式是使用最多的,这里我就分析一下授权码模式,qq开放互联平台就是使用这种模式,如下图:
首先明确一下角色,user-gent:用户(或者可以说是用户浏览器);client:第三方网站或者应用;authorization server:认证服务器,它不是被第三方网站或者应用所拥有的,是放在原来的所有者(如腾讯)那里的;resource owner:资源(如腾讯的qq用户群,为腾讯所拥有)存放的地方,它是可以和authorization server互通的;总共有四个对象。
流程是这样运转的:
步骤A:先是user-agent访问client,client需要确定user-agent是谁,但是client没有user-agent的用户和密码,无法验证验证用户,所以将user-agent通过A步骤将重定向(导向)到authorization-server那里(如果是client是通过qq来验证用户,这个时候用户就会发现自己的浏览器跳到qq登录的界面),同时重定向过程中也会附带一些信息,方便后面的操作,这个步骤最重要的信息就是redirect url和client identifier这两个参数
步骤B(user authentication):用户在登录界面就会输入用户名和密码给authorization server,authorization server发现用户名和密码正确,发现确实有这个用户存在,就会要用户是否授权给client给访问他的个人信息
步骤C:得到了用户的允许之后,authorization server就会根据步骤A得到redirect url将用户重定向到client那里,同时携带authorization code和一些其他的信息给client,这之前的步骤对用户来都是可见的,后面的步骤对用户不可见;
步骤D:这个时候用户就来到了client这界面了,这个时候client就会获取authorization code,如果有这个参数,代表用户已经授权了,client就携带authorization code和redirect url访问authentication server,向其索要访问用户信息的access token
步骤E:如果authorization code没有是有效的,authorization server就会将access token发给client,同时access token是有期限的
步骤F:cleint就会携带得到的access token去访问resource owner,由于resource owner和authorization server是互通的,所以resource owner可以验证access token是否有效或者过期,如果有效和没有过期,那么就会允许client访问之前那个用户的一些信息了。
另附一篇OAuth 2.0详解:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html