SpringBoot--实战开发--OAuth2.0客户端模式(五十一)

一、客户端模式简介

  客户端模式(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依赖


    org.springframework.cloud
    spring-cloud-starter-oauth2

三、代码实现

  1. 认证服务配置
/**
 * 认证服务配置
 */
@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();
    }
}

  1. 资源服务配置
/**
 * 资源服务配置
 */
@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();
    }
}

其它代码同密码模式。

四、测试

  1. 令牌获取


    令牌获取

    令牌获取

    令牌获取
  2. 接口访问


    接口访问

你可能感兴趣的:(SpringBoot--实战开发--OAuth2.0客户端模式(五十一))