2014-09-20 86 views
1

如果我理解的oauth2規範正確,我應該能夠添加自定義的內容,如一個USER_ID到的oauth2訪問令牌。服務器然後可以解碼訪問令牌並將一個用戶域對象添加到SecurityContextHolder。如何將內容添加到Spring oauth2訪問令牌?

(當然,我可以添加USER_ID到每一個REST API方法,但是這將意味着大量的重構)從閱讀中,我想我需要實現或者擴展TokenEnhancer手動

眼下。由於我使用的是JavaScript客戶端,也許 我應該擴展JwtAccessTokenConverter?我在這條正確的道路上嗎?

回答

1

第一,爲什麼你需要廣告用戶id的訪問令牌,而你可以存儲範圍或additional_information您的數據,讓我描述使用範圍:

如果你的客戶需要獲得與訪問的特定數據令牌你可以爲範圍PARAM發送到auth服務器,然後當訪問重定向到托克重新導向網址,你會得到你把範圍PARAM數據,這是之前和驗證後用於用戶的儲存統計。

如果您希望此用戶ID爲別人而不是存儲狀態,我建議,使驗證服務器提供用戶的詳細信息,並通過OAuth與訪問令牌將其固定在端點的東西。

我不建議把任何數據生成訪問令牌的,因爲它可以在弱令牌的複雜性,也因此不建議您在令牌客戶端進行解碼。

+0

謝謝你的答案。我的想法是,服務器(終點)解碼訪問令牌,並與USER_ID的幫助下將用戶添加到SecurityContextHolder的 – jack 2014-09-21 12:07:33

+0

檢查訪問令牌表的SQL它包含已經USER_NAME這樣你就可以從數據庫直接,明白了沒有需要解碼它。如果你的終端有這個數據庫不能訪問,可以auth服務器暴露基於訪問令牌的用戶配置文件,該請求由OAuth的固定上也做的端點。 – 2014-09-22 14:47:16

0
@Bean 
public TokenEnhancer tokenEnhancer() { 
    return new TokenEnhancer() { 
     @Override 
     public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { 
      DefaultOAuth2AccessToken newToken = new DefaultOAuth2AccessToken(oAuth2AccessToken); 
      Map<String, Object> addInfo = new HashMap<>(); 
      // add here what u need 
      addInfo.put("putName", oAuth2Authentication.getName()); 
      newToken.setAdditionalInformation(addInfo); 
      return newToken; 
     } 
    }; 
} 

,並在AuthorizationServerConfiguration:

@Autowired 
private TokenEnhancer tokenEnhancer; 
... 
@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
     throws Exception { 
    endpoints 
      .tokenStore(this.tokenStore) 
      .authenticationManager(this.authenticationManager) 
      .userDetailsService(this.userDetailsService) 
      .tokenEnhancer(this.tokenEnhancer); 
} 
+0

如果你添加一個你的答案的小解釋,以便我們理解你在做什麼,那將是非常好的。 – sotoz 2017-05-14 17:18:51

相關問題