Oauth2
1.Oauth2认证
1.1、简介
第三方认证技术方案主要是解决认证协议的通用标准问题,因为要实现跨系统认证,各系统之间要遵循一定的接口协议。
Oauth协议为用户资源的授权提供了安全、开放、简易的标准。同时任何三方都可以使用Oauth认证服务。
下面分析一个Oauth2认证的例子:网站使用微信认证过程。
1.2、授权模式
2.SpringSecurity Oauth2
2.1、授权服务器
2.2、SpringSecurity Oauth2架构
流程:
- 用户访问,此时没有Token。Oauth2RestTemplate会报错,这个报错信息会被 Oauth2ClientContextFilter捕获并重定向到认证服务器。
- 认证服务器通过Authorization Endpoint进行授权,并通过AuthorizationServerTokenServices生 成授权码并返回给客户端。
- 客户端拿到授权码去认证服务器通过Token Endpoint调用AuthorizationServerTokenServices生成 Token并返回给客户端
- 客户端拿到Token去资源服务器访问资源,一般会通过Oauth2AuthenticationManager调用 ResourceServerTokenServices进行校验。校验通过可以获取资源。
2.3、授权码模式
1、引入依赖
1 | <dependency> |
2、登录实现类
1 |
|
3、配置spring security
1 | // 拦截器:使用aop横切进去,所以不改变原来的代码 |
4、配置授权服务器
1 | /** |
5、配置资源服务器
1 | /** |
6、测试
- 获取授权码:http://localhost:8080/oauth/authorize?response_type=code&client_id=client&redirect_uri=http://www.baidu.com&scope=all
登录后出现下面的框:
获取访问令牌:
grant_type :授权类型,填写authorization_code,表示授权码模式
code :授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请。
client_id :客户端标识
redirect_uri :申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致。
scope :授权范围。 认证失败服务端返回 401 Unauthorized访问资源:根据token去资源服务器获取资源。
或者:
2.4、密码模式
1、修改SecurityConfig,增加AuthenticationManager。
1 | // 开启WebSecurity模式 |
2、修改AuthorizationServerConfig配置
1 |
|
3、获取令牌
通过PostMan测试,需要配置支持get请求和表单验证
3、基于redis存储Token
1、引入依赖
1 | <dependency> |
2、编写redis配置类
1 |
|
3、在授权服务器配置中指定令牌的存储策略为Redis(以密码模式为例)
1 | /** |