一、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可以使用的授權類型,根據不同的授權要求,選擇不同的授權類型來保證應用的安全、可靠和有效。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237058.html