1、Oauth2通过管理和验证令牌将受保护的资源暴露出去。
2、OAuth2提供者其实是分成授权服务和资源服务两个角色,可以在一个应用程序或多个应用程序中,也可以有选择的给授权服务配置多个资源服务。
运行流程:
- 用户打开客户端以后,客户端要求用户给予授权
- 用户同意给予客户端授权
- 用户端使用获取的授权向认证服务器申请令牌。
- 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
- 客户端使用令牌,向资源服务器申请获取资源。
- 资源服务器确认令牌无误,同意向客户端开发资源。
3、获取令牌的请求是由Spring MVC的控制器来处理的,访问受保护的资源是通过标准的spring请求过滤器来处理的。
4、url
- /oauth/authrize 用于授权服务请求
- /oauth/token 用于获取访问令牌
- /oauth/confirm_access 用户发送确认授权到这里
- /oauth/error 用户呈现授权服务器授权出错的请求
5、OAuth2AuthenticationProcessingFilter 用于加载请求提供的一个授权了的访问令牌是否有效
6、配置授权服务器:
OAuth客户端通过将终端用户导向一个可以输入证书/口令的授权验证页面来获取授权码,然后讲授权码传递给授权服务器,服务器验证后重定向页面
@EnableAuthorizationServer
继承AuthorizationServerConfigurerAdapter类(实现AuthorizationServerConfigure接口)
- ClientDetailsServiceConfigurer:定义了客户端细节服务,可以用来定义一个基于内存的或者jdbc的客户端信息服务。
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
}
客户端对象的重要属性:
clientid(客户端id)、secret(客户端的私密信息)、scope(客户端的作用域)、authorizedGrantTypes(授权给客户端使用的权限类型)authorities(授权给客户端的权限)
- AuthorizationServerSecurityConfigurer:在令牌端点上定义了安全约束。
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
}
- AuthorizationServerEndpointsConfigurer:定义了授权和令牌端点和令牌服务
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
}
AuthorizationServerTokenServices:
注意:创建一个令牌时必须保存权限信息,这样后续令牌才可以引用它。访问令牌用于加载创建令牌时的授权信息。
DefaultTokenServices实现类使用随机值创建令牌,并处理永久令牌(TokenStore类处理)以外的所有令牌。
令牌存储方式:
InMemoryTokenStore(默认)对于一个单服务器场景非常使用 JdbcTokenStore:适用于服务器共享数据库或者同一个服务器有多个实例或授权服务器资源服务器有多个组件
JwkTokenStore:可以加密所有令牌授权访问的数据,不需要在后台存储。但是不能方便的撤销一个已授权的令牌,撤销授权的操作在刷新令牌中进行。而且存储的令牌数据会越来越大,因为令牌里面存储了大量的数据证书信息。
授权类型:
AuthenticationManager 密码授予
AuthorizationCodeServices 授权码服务
7、授权码模式:
- 用户访问客户端,客户端将用户导向认证服务器。
client_id(必选项,客户端id)
response_type(必选项,授权类型,此处固定值code)
redirect_uri(可选项,重定向uri)
scope(可选性,申请的权限范围)
state(客户端当前状态,可以为任意值,服务器会返回该值)
- 用户选择是否给予客户端授权。
授权码code有效期很短,客户端只能使用改码一次,否则会被授权服务器拒绝。该授权码与客户端ID和重定向URI是一一对应关系。
假设用户给予授权,认证服务器将用户导向重定向URI,同时附上一个授权码code。
- 客户端收到授权码,附上之前的重定向URI,向认证服务器申请令牌。
grant_type:使用的授权模式,必选项,此处固定值“authorization_code”
code:上一步的授权码,必选项
redirect_uri:上一步的重定向uri,必选项
client_id:客户端ID,必选项
- 认证服务器核对授权码和重定向URI,确认无误后,向客户端发送访问令牌和更新令牌。
access_token:访问令牌,必选项
token_type:令牌类型
expires_in:过期时间,单位为秒
refresh_token:表示更新令牌,用来获取下一次的访问令牌
scope:表示权限范围,如果与客户端申请的范围一致,此项可以省略