跟我总结OAuth2.0

          公司准备使用一种网页的安全认证来实现多个应用系统的单点登录,经过研究采用了现阶段比较流行的OAuth2.0 。下面是对OAuth2.0一些整理和总结以便以后的学习交流。

一、学习OAuth2.0我们先了解一下OAuth是什么?

        OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。看了Auth描述有何感想呢? 是不是很啰嗦哭 OK  其实用一句俗话来讲:OAuth是用来给客户端授权的,让客户端登录到系统中获得资源。(如果仅仅是为了登录的话,其实使用OAuth是没有必要的)。

二、OAuth历史及资料

       OAuth 2.0 是目前比较流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以标注为 2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系。具体可以到OAuth2官网http://oauth.net/2/查看,OAuth2协议规范可以参考http://tools.ietf.org/html/rfc6749。目前有好多参考实现供选择,可以到其官网查看下载。

文使用Apache Oltu,其之前的名字叫Apache Amber ,是Java版的参考实现。使用文档可参考https://cwiki.apache.org/confluence/display/OLTU/Documentation


如下图(1)所示OAuth2.0

跟我总结OAuth2.0_第1张图片

                                           图(1)

三、OAuth2分为四个角色:资源拥有者、资源服务器授权服务器客户端


下图(2)为OAuth2.0的角色及工作步骤

跟我总结OAuth2.0_第2张图片


                                                        图(2)

资源拥有者(user:能授权访问受保护资源的一个实体,可以是一个人。

资源服务器(resourceserver:存储受保护资源,客户端通过access token请求资源,资源服务器响应受保护资源给客户端。

授权服务器(authorizationserver:成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。

客户端(client :第三方应用,其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来/提交到服务器。“客户端”术语不代表任何特定实现(如应用运行在一台服务器、桌面、手机或其他设备)。

四、OAuth2协议工作流程

     

A、客户端从资源拥有者那请求授权。授权请求可以直接发给资源拥有者,或间接的通过授权服务器这种中介,后者更可取。

B、客户端收到一个授权许可,代表资源服务器提供的授权。

C、客户端使用它自己的私有证书及授权许可到授权服务器验证。

D、如果验证成功,则下发一个访问令牌。

E、客户端使用访问令牌向资源服务器请求受保护资源。

F、资源服务器会验证访问令牌的有效性,如果成功则下发受保护资源。

 

下图为详细OAuth2.0授权流程:


五、下面我们来讲解一个shiro+oauth2的实例

     5.1准备开发工具jar包,本人采用的开发工具是Eclipse4.5 数据库mysql5.5。

      shiro和oauth2包:

      跟我总结OAuth2.0_第3张图片


5.2 创建项目shiro-oauth2-client和shiro-oauth2-server


      5.2客户端项目

      web.xml配置文件

跟我总结OAuth2.0_第4张图片

spring-config-shiro.xml配置文件

跟我总结OAuth2.0_第5张图片

     跟我总结OAuth2.0_第6张图片

      

客户端请求后台源码


第一步:用户同意授权,获取code

客户端验证用户是否登录,没有登录发送请求到服务器登录引导页进行登录授权,并且返回code

http://localhost:8080/shiro-oauth2-server/authorize?client_id=c1ebe466-1cdc-4bd3-ab69-77c3561b9dee&response_type=code&redirect_uri=http://localhost:8080/shiro-oauth2-client/oauth2-login
若提示该链接无法访问,请检查参数是否填写错误\服务器【shiro-oauth2-server】是否启动\是否拥有scope参数对应的授权作用域权限。state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

跟我总结OAuth2.0_第7张图片

服务器端代码

跟我总结OAuth2.0_第8张图片

跟我总结OAuth2.0_第9张图片

下图为服务器登录授权页面:

跟我总结OAuth2.0_第10张图片

用户登录授权后页面将跳转至redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参redirect_uri?state=STATE

code说明  code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,10分钟未被使用自动过期。

参数说明:

跟我总结OAuth2.0_第11张图片

第二步:通过code获取AccessToKen

http://localhost:8080/shiro-oauth2-server/accessToken?client_secret=d8346ea2-6017-43ed-ad68-19c0f971738b&grant_type=authorization_code&redirect_uri=http://localhost:8080/shiro-oauth2-client/oauth2-login&code=87d84cbff66b6a0e27308ac543ca0b0a&client_id=c1ebe466-1cdc-4bd3-ab69-77c3561b9dee
提交请求使用post方式其中client_secret可以使用basic方式加入header中grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"code:表示上一步获得的授权码,必选项。
参数说明:
跟我总结OAuth2.0_第12张图片

返回值:

跟我总结OAuth2.0_第13张图片

参数说明:
跟我总结OAuth2.0_第14张图片

第三步:通过access_token获取用户资源

访问受资源服务端保护的资源(前面没有特别说明的服务端都是指授权服务端

http://localhost:8080/shiro-oauth2-server/userInfo?access_token=436fb3b1aa1ea7d46428da2f5439c39f
其中access_token网页授权接口调用凭证

下图为获取用户信息:



后台运行结果

跟我总结OAuth2.0_第15张图片

源码下载地址:http://download.csdn.net/detail/jbjwpzyl3611421/9488565

你可能感兴趣的:(java,OAuth)