OAuth2简单介绍
OAuth 2 是一个授权框架,它通过一些协议约定,可以使第三方应用程序对服务器的资源、用户信息有一定的访问权限。OAuth 2 通过将用户身份验证委派给用户帐户的服务方以及通过服务方提供方授权给客户端,从而客户端可以访问用户帐户信息。具体的介绍参考OAuth2官网,协议规范可参考http://tools.ietf.org/html/rfc6749
-
OAuth角色
OAuth2.0协议流程图如下:资源所有者: 能够授予对受保护资源的访问权限的实体。 当资源所有者是一个人时,它被称为最终用户。 资源服务器:托管受保护资源的服务器,能够接受并使用访问令牌响应受保护的资源请求。 客户端:代表受保护的资源请求的应用程序资源所有者及其授权。 授权服务器:服务器校验客户端身份成功后向客户端发出访问令牌(accessToken)
解释说明,这里用微信登录举例,可参考微信官方文档:
1.客户端从资源拥有者那请求授权,如某app需要用微信登录;
2.用户点击同意登录之后,app得到一个授权许可,会返回一个code参数;
3.app拿着code去请求授权服务器验证;
4.身份验证成功后,授权服务器会返回一个资源访问令牌(accessToken)给app;
5.app使用accessToken去资源服务器去请求需要的资源(如,微信用户的名称,头像,性别等)
6.资源服务器在身份验证成功后返回相应的资源给客户端
Oltu介绍
Apache Oltu是Java中的OAuth协议实现,对常用的方法、需要用到的工具进行封装,使用方法可参考:https://cwiki.apache.org/confluence/display/OLTU/Documentation
运行演示及其说明
- 将server端和client分别打成war包放入tomcat运行后,在浏览输入 http://localhost:9080/oauth2-client/ 则会出现如下界面:
- 点击登录,则会跳转到如下界面
同时,观察控制台,可看出浏览器一共发了两次请求 - 输入账号密码
【用户名:admin 密码:123456 】 即可登录成功
观察控制台, 浏览器又发了两次请求 - UML时序图及解释说明
说明:
1. 用户点击【点击登录】时,由于在shiro的配置,会被OAuth2AuthenticationFilter进行拦截,由于身份认证没有通过,则会重定向到shiro配置的loginUrl(这里配置的是server端的地址)进行登录;
2. 当用户输入账号密码后,点击【登录并授权】,则会带上client_id等参数去服务器进行身份验证;
3. 服务器将验证客户端身份验证的结果会通过回调地址redirect_uri通知客户端,如果验证成功,则会给客户返回一个code(每次都不同);
4. 客户拿着code去交换访问令牌(access_token);
5. 当服务器校验客户端的code合法,则会将access_token返回;
6. 客户端拿着access_token去访问受保护的资源。
代码部分
说明:由于springboot整合JSP,所以需要打成war放在外部的tomcat进行运行,具体做法:springboot打成war包放入外部tomcat运行
篇幅所限,完整代码已上传至GitHub:https://github.com/AmVilCres/others
-
服务端目录结构
-
ShirServerConfig类
@Configuration
public class ShiroServerConfig {
// 注意: /r/n前不能有空格
private static final String CRLF = "\r\n";
private static final String MD5 = "md5";
@Bean(name="hashedCredMatcher")
public HashedCredentialsMatcher createHashCredentialsMatcher() {
RetryLimitHashedCredentialsMatcher hcm = new RetryLimitHashedCredentialsMatcher();
hcm.setHashAlgorithmName(MD5);
hcm.setStoredCredentialsHexEncoded(true);
hcm.setCacheManager(createEhcacheManager());
return hcm;
}
@Bean(name