一、oauth中的角色
client:使用API的客户端(如Android 、IOS、web app)
OAuth2.0 Provider:
- Authorization Server:认证服务器,进行认证和授权
- Resource Server:资源服务器,被授权访问的资源
Resource Owner:用户
二、Authorization Server
一般情况下,创建两个配置类,一个继承AuthorizationServerConfigurerAdapter,一个继承WebSecurityConfigurerAdapter,再去复写里面的方法。
@EnableAuthorizationServer:
声明一个认证服务器,当使用此注解后,应用启动后将自动生成几个Endpoint。(注:其实实现一个认证服务器就是这么简单,加一个注解就搞定,当然要真正用到生产环境还是需要进行一些配置和复写工作的。)
- /oauth/authorize:验证
- /oauth/token:获取token
- /oauth/confirm_access:用户授权
- /oauth/error:认证失败
- /oauth/check_token:资源服务器用来校验token
- /oauth/token_key:如果jwt模式则可以用此来从认证服务器获取公钥
以上这些endpoint都在源码里的endpoint包里面。
继承AuthorizationServerConfigurerAdapter:
AuthorizationServerConfigurerAdapter实现了AuthorizationServerConfigurer。AuthorizationServerConfigurer包含三种配置:ClientDetailsServiceConfigurer、AuthorizationServerSecurityConfigurer、AuthorizationServerEndpointsConfigurer。
1、ClientDetailsServiceConfigurer:
client客户端信息的读取及配置,这里的实现有多种:in-memory、JdbcClientDetailsService、jwt等。
client信息包括:clientId、secret、scope、authorizedGrantTypes、authorities。
scope:表示权限范围,可选项,用户授权页面时进行选择
Authorities:授予client的权限
authorizedGrantTypes:四种授权方式
- Authorization Code:用在服务端应用之间
- Implicit:用在移动app或者web app(这些app是在用户的设备上的,如在手机上调起微信来进行认证授权)
- Client Credentials:用在应用API访问。
- Resource Owner Password Credentials:应用直接都是受信任的(都是由一家公司开发的)
此处scopes和authorities的区别:
- scopes是client权限,至少授予一个scope的权限,否则报错。
- authorities是用户权限
client信息读取:调用JdbcClientDetailsService,此处需要传入响应的DataSource。
2、AuthorizationServerSecurityConfigurer
声明安全约束,哪些允许访问,哪些不允许访问
3、AuthorizationServerEndpointsConfigurer
声明授权和token的端点以及token的服务的一些配置信息,比如采用什么存储方式、token有效期等等。
授权类型:默认情况下,支持除了密码外的所有授权类型,相关授权类型的一些类;
(1)authenticationManager:直接注入一个AuthenticationManager,自动开启密码授权类型
(2)userDetailsService:如果注入UserDetailsService,那么将会自动刷新token授权类型,会判断用户是否还是存活的
(3)authorizationCodeServices:AuthorizationCodeServices的实例,auth code 授权类型的服务
(4)implicitGrantService:imlpicit grant
(5)tokenGranter:
endpoint的URL的配置:
(1)AuthorizationServerEndpointsConfigurer的pathMapping()方法,有两个参数,第一个是默认的URL路径,第二个是自定义的路径
(2)WebSecurityConfigurer的实例,可以配置哪些路径不需要保护,哪些需要保护。默认全都保护。
4、如何管理Token
AuthorizationServerTokenServices:声明必要的关于token的操作
- 当token创建后,保存起来,以便之后的接受访问令牌的资源可以引用它。
- 访问令牌用来加载认证。
接口的实现有很多种,DefaultTokenServices是其默认实现,它使用了默认的InMemoryTokenStore,不会持久化token。
token的存储方式有三种:
- InMemoryTokenStore:存放于内存中,不会持久化
- JdbcTokenStore:存放数据库中
- JWT:json web token
三、Resource Server:保护资源,需要令牌才能访问
在配置类上加上注解@EnableResourceServer即启动。使用ResourceServerConfigurer进行配置:
(1)tokenServices:ResourceServerTokenServices的实例,声明了token的服务
(2)resourceId:资源Id,由auth Server验证。
(3)其它一些扩展点,比如可以从请求中提取token的tokenExtractor
(4)一些自定义的资源保护配置,通过HttpSecurity来设置
如何访问资源服务器中的API?
如果资源服务器和授权服务器在同一个应用程序中,并且您使用DefaultTokenServices,那么您不必太考虑这一点,因为它实现所有必要的接口,因此它是自动一致的。如果您的资源服务器是一个单独的应用程序,那么您必须确保您匹配授权服务器的功能,并提供知道如何正确解码令牌的ResourceServerTokenServices。与授权服务器一样,您可以经常使用DefaultTokenServices,并且选项大多通过TokenStore(后端存储或本地编码)表示。
(1)在校验request中的token时,使用RemoteTokenServices去调用AuthServer中的/auth/check_token。
(2)共享数据库,使用Jdbc存储和校验token,避免再去访问AuthServer。
(3)使用JWT签名的方式,资源服务器自己直接进行校验,不借助任何中间媒介。