您的位置:

authorizedgranttypes 的详细阐述

一、authorizedgranttypes定义

在OAuth2.0框架中,authorizedgranttypes是一个用来定义Client可以使用哪种授权类型的参数,授权类型包括:authorization_code、implicit、password、client_credentials、refresh_token。

具体来说:client_id和client_secret是client验证授权的基础,但是,client只授权自己的用户。使用不同的授权类型,client能够在用户授权之前获取access_token,并且在之后使用它。因此,根据不同的业务需求,对授权类型的选择需要慎重考虑,以确保安全、可靠、有效

二、授权类型的分类

下面将对五种不同的授权类型进行详细阐述:

1. authorization code授权类型

授权码类似于一次性密码,用于获取access token的中间步骤。

使用授权码类型进行授权的基本方式:用户访问客户端的应用程序;应用程序将用户重定向到认证服务器;用户输入其凭据;认证服务器将用户重定向到应用程序,并提供授权码;应用程序将授权码与简化令牌请求一起发送给认证服务器;认证服务器将访问令牌发送回应用程序。

2. implicit授权类型

Implicit类型是一种简化的授权,它给客户端访问使用者数据的权限,跳过了请求令牌的那个过程。相比之下,口令和授权码的类型需要向服务器申请一个令牌,该令牌可以用于授权和访问受保护的资源。这种方式比授权码安全性低,除非请求是HTTPs即可避免音译攻击。

3. password授权类型

通过用户名和密码认证信息向认证服务器处获取访问令牌的方式。

当资源所有者知道你的Client并信任你时,您才应该采用这种授权类型,因此,请在服务器之间禁用此授权类型。

4. client credentials授权类型

client credentials授权类型允许客户端获得访问资源者受保护资源的权限,而无需资源所有者的授权。在应用程序调用模式中,客户端是传统的应用程序,没有用户交互界面或IAM情境。

5. refresh token授权类型

当access token即将过期时,可能会使用授权中提供的refresh token来获得新的access token。

三、Smallbee公司的实例

下面是Smallbee公司的一个应用实例,这个应用程序选择了两个授权类型,即authorization_code和client_credentials,用于获取授权和使用API resources证书。

    @Bean
    public ClientDetailsService JdbcClientDetailsService() {
        return new JdbcClientDetailsService(dataSource);
    }
    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(JdbcClientDetailsService());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .tokenServices(tokenServices())// 配置 TokenServices 参数
                .authenticationManager(authenticationManager)// 用于支持 password 授权类型
                .userDetailsService(userDetailsService);// 配置 UserDetailsService
        endpoints.tokenGranter(tokenGranter(endpoints));
    }
    
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.allowFormAuthenticationForClients();
    }
    
    // 配置 tokenServices 参数
    @Bean
    public AuthorizationServerTokenServices tokenServices() {
        DefaultTokenServices services = new DefaultTokenServices();
        services.setAccessTokenValiditySeconds(access_token_expiration_time);
        services.setRefreshTokenValiditySeconds(refresh_token_expiration_time);
        services.setTokenStore(tokenStore());
        services.setSupportRefreshToken(refresh_token_enabled);
        services.setClientDetailsService(JdbcClientDetailsService());
        return services;
    }
    
    // 配置授权类型和确切可用的 token 信息
    @Bean
    public TokenGranter tokenGranter(final AuthorizationServerEndpointsConfigurer endpoints) {
        List granters = new ArrayList
   ();
        granters.add(new AuthorizationCodeTokenGranter(endpoints.getTokenServices(), endpoints.getAuthorizationCodeServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));
        granters.add(new ImplicitTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));
        granters.add(new RefreshTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));
        granters.add(new ClientCredentialsTokenGranter(endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));
        granters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, endpoints.getTokenServices(), endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));
        return new CompositeTokenGranter(granters);
    }

    

四、结语

authorizedgranttypes是OAuth2.0框架中一个非常重要的参数,它定义了Client可以使用的授权类型,根据不同的授权要求,选择不同的授权类型来保证应用的安全、可靠和有效。