一、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) { Listgranters = 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可以使用的授权类型,根据不同的授权要求,选择不同的授权类型来保证应用的安全、可靠和有效。