OAuth2.0系列五:OAuth2.0客户端凭证

凭证模式

OAuth2.0系列五:OAuth2.0客户端凭证_第1张图片

客户端通过客户端的id和secret申请授权,这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。

代码实战

第一步,创建maven应用client_server,pom文件如下:


        microservice-parent
        com.curise.microservice
        1.0-SNAPSHOT
    
    4.0.0

    client_server
    OAuth2.0客户端凭证模式

    
        
            org.springframework.boot
            spring-boot-starter-security
        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.springframework.security.oauth
            spring-security-oauth2
        

        
            org.projectlombok
            lombok
        

    

第二步,创建授权管理器

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                // 客户端id
                .withClient("app")
                // 客户端密钥
                .secret("123")
                // 权限
                .scopes("read","write")
                // 获取授权码后重定向地址
                .redirectUris("http://localhost:9000/callback")
                // 授权码和刷新token
                .authorizedGrantTypes("authorization_code","refresh_token")
                .and()
                .withClient("app1")
                .secret("1234")
                .scopes("read", "write")
                // 密码模式和刷新token
                .authorizedGrantTypes("password", "refresh_token")
                .and()
                .withClient("app2")
                .secret("1234")
                .scopes("read", "write")
                .redirectUris("http://localhost:9000/callback")
                // 令牌有效时间120s
                .accessTokenValiditySeconds(120)
                // 简化模式
                .authorizedGrantTypes("implicit")
                .and()
                .withClient("app3")
                .secret("1234")
                .scopes("read", "write")
                // 客户端凭证模式
                .authorizedGrantTypes("client_credentials");
    }
}

第三步,创建资源管理器

@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .requestMatchers()
                // /api/**请求需要OAuth鉴权
                .antMatchers("/api/**");
    }
}

第四步,创建配置文件

server.port=8080
security.user.name=root
security.user.password=root

第五步,创建Controller输出资源

@RestController
public class UserController {

    @GetMapping("/api/userList")
    public ResponseEntity> getUserInfo(){
        List users = new ArrayList<>();
        users.add(new UserInfo("test1", "[email protected]"));
        users.add(new UserInfo("test2", "[email protected]"));
        return ResponseEntity.ok(users);
    }

}

第六步,启动应用

第七步,申请令牌

OAuth2.0系列五:OAuth2.0客户端凭证_第2张图片

设置grant_type=client_credentials表示通过客户端凭证方式授权,直接返回令牌

第八步,获取用户信息

OAuth2.0系列五:OAuth2.0客户端凭证_第3张图片

因为这种方式授权不是针对一个用户的,而是针对第三方机构的,所以这里没有向前三种方式一样直接获取用户信息。

代码已经共享到GitHub,地址:https://github.com/WYA1993/microservice

你可能感兴趣的:(Oauth2.0)