一、客户端模式简介
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
这种模式直接根据client的id和密钥即可获取token,无需用户参与这种模式比较合适消费api的后端服务,比如拉取一组用户信息等,不支持refresh token,主要是没有必要。
(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
客户端发出的HTTP请求,包含以下参数:
granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。
scope:表示权限范围,可选项。
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
认证服务器必须以某种方式,验证客户端身份。
(B)认证服务器确认无误后,向客户端提供访问令牌。
认证服务器向客户端发送访问令牌,。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"example_parameter":"example_value"
}
二、Maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
三、代码实现
- 认证服务配置
/**
* 认证服务配置
*/
@Configuration
@EnableAuthorizationServer
@Slf4j
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private UserDetailsService userService;
@Autowired
private TokenStore tokenStore;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client") // 客户端ID
.scopes("app") // 允许的授权范围
.authorizedGrantTypes("client_credentials") // 设置验证方式
.secret(new BCryptPasswordEncoder().encode("123456")); //必须加密
.accessTokenValiditySeconds(10000) // token过期时间
.refreshTokenValiditySeconds(10000); // refresh过期时间;
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.authenticationManager(authenticationManager)
.userDetailsService(userService); //配置userService 这样每次认证的时候会去检验用户是否锁定,有效等
}
@Bean
public TokenStore tokenStore() {
// 使用内存的tokenStore
return new InMemoryTokenStore();
}
}
- 资源服务配置
/**
* 资源服务配置
*/
@Configuration
@EnableResourceServer()
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeRequests()
.antMatchers("/oauth/authorize","/login")
.permitAll()
.antMatchers(HttpMethod.OPTIONS)
.permitAll()
.antMatchers("/account/**").authenticated()
.and().httpBasic()
.and().csrf().disable();
}
}
其它代码同密码模式。
四、测试
-
令牌获取
-
接口访问