公司准备使用一种网页的安全认证来实现多个应用系统的单点登录,经过研究采用了现阶段比较流行的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
图(1)
三、OAuth2分为四个角色:资源拥有者、资源服务器、授权服务器、客户端
下图(2)为OAuth2.0的角色及工作步骤
图(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包:
5.2 创建项目shiro-oauth2-client和shiro-oauth2-server
5.2客户端项目
web.xml配置文件
spring-config-shiro.xml配置文件
客户端请求后台源码
第一步:用户同意授权,获取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:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
服务器端代码
下图为服务器登录授权页面:
用户登录授权后页面将跳转至redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参redirect_uri?state=STATE
code说明 : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,10分钟未被使用自动过期。
参数说明:
第二步:通过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:表示上一步获得的授权码,必选项。
参数说明:
返回值:
参数说明:
第三步:通过access_token获取用户资源
访问受资源服务端保护的资源(前面没有特别说明的服务端都是指授权服务端)
http://localhost:8080/shiro-oauth2-server/userInfo?access_token=436fb3b1aa1ea7d46428da2f5439c39f
其中access_token:网页授权接口调用凭证。
下图为获取用户信息:
后台运行结果
源码下载地址:http://download.csdn.net/detail/jbjwpzyl3611421/9488565