2016-04-23 10 views
0

認可サーバーとリソースサーバーが1つあります。私は認可サーバーでアクセストークンを作成していて、oauth2のRemoteTokenServicesを使用してリソースサーバーで使用しようとしていますが、内部では/ oauth/check_tokenにアクセスしてトークンの存在と期限切れのみを確認します。しかし、access_tokenに対してロール/スコープを指定したエンドポイントに対するロール/スコープはチェックしません。oauth/check_tokenは、エンドポイントに関連付けられたロール/スコープを確認しません。

@FrameworkEndpoint 
public class CheckTokenEndpoint { 
@RequestMapping(value = "/oauth/check_token") 
@ResponseBody 
public Map<String, ?> checkToken(@RequestParam("token") String value) { 

    OAuth2AccessToken token = resourceServerTokenServices.readAccessToken(value); 
    if (token == null) { 
     throw new InvalidTokenException("Token was not recognised"); 
    } 

    if (token.isExpired()) { 
     throw new InvalidTokenException("Token has expired"); 
    } 

    OAuth2Authentication authentication = resourceServerTokenServices.loadAuthentication(token.getValue()); 

    Map<String, ?> response = accessTokenConverter.convertAccessToken(token, authentication); 

    return response; 
    } 
} 

上記のコードスニペットはCheckTokenEndpoint.javaのものです。 ロール/スコープベースの認可も達成する方法はありますか?

+0

@DaveSyer:ここでお手伝いできますか? – Dhairyashil

+0

私は現時点で同様の問題に取り組んでいます。私はxmlベースの設定をしています。私は明日私の所見を掲載する(同様の問題を抱えている人には役に立つかもしれない) – Raf

答えて

0

誰がXMLベースの構成を使用してJWTトークンの実装と同様の問題に遭遇した場合、私はそれを次のよう

ああおよびXMLベースの設定をすることができます使用して春のOAuth2を実装する方法についての私の詳細な記事を解決しましたあなたは肝炎カスタム要求

  • を持ってJWTトークンを使用しているhere

    いくつかの仮定

    1. を見つけることがeは今度はあなたがXMLベースの設定にCheckTokenEndpoint

    詳しく見て使用している

  • (JwtAccessTokenConvertorを使用せずにAccessTokenConvertor & TokenEnhancerインタフェースを実装して自由に感じる)TokenEnhancerインタフェースを実装JwtAccessTokenConvertorのカスタム実装を提供しましたsource code

    private AccessTokenConverter accessTokenConverter = new DefaultAccessTokenConverter(); 
    

    そしてDefaultAccessTokenConvertorsource codeを見に従う明らかに、それはデです基本的に私の場合は、次の契約

    Map<String, ?> convertAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication); 
    OAuth2AccessToken extractAccessToken(String value, Map<String, ?> map); 
    OAuth2Authentication extractAuthentication(Map<String, ?> map); 
    

    を持ってAccessTokenConvertorインタフェースの実装を故障、私は/oauth/token_checkエンドポイントに渡すトークン値が(RSA鍵ペアで)署名されていることを意味し、JWTのトークンを使用JWTとTokenCheckEndpointは、トークンがデシベル(oauth_access_token表)にある場合、それらは必ずしもデシベル

  • に格納されていないとして、これはJWTの実装には適用されませんように

    • チェックなど、いくつかのチェックを行います
    • チェックその有効JWTことthのトーク​​ントークンの署名が正しく、それはその私がすることに加えて

    を知らない

  • その他のチェックを有効期限が切れていないことを
  • チェックを改ざんされていないことを電子最初の場所
  • チェック上記のように、私は、の範囲(すなわち、基本的な役割とそれに関連する権限)はデータベース内で同じです(トークンが発行されてから役割が変更されていないことを確認してください)。

    私のデバッグに基づいて、/oauth/check_tokenエンドポイントがヒットした場合、extractAccessTokenに続いてextractAuthenticationメソッドが呼び出されます(少なくともJWT実装では)。

    Iはをオーバーライドし、それにカスタムクレーム(即ち範囲)を追加する私のJWTトークンを高めるために(順番にAccessTokenConvertor & TokenEnhancerインターフェースを実装する)JwtAccessTokenConvertorを拡張したので

    @Component 
    public class MyJwtAccessTokenConvertor extends JwtAccessTokenConverter { 
         @Override 
         public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { 
           DefaultOAuth2AccessToken result = new DefaultOAuth2AccessToken(accessToken); 
           //enhance the token with custom claims (i.e. user role scope) 
           //then return it 
           return result; 
          } 
    
        @Override 
        public OAuth2AccessToken extractAccessToken(String value, Map<String, ?> map) { 
          OAuth2AccessToken mytoken = tokenConverter.extractAccessToken(value, map); 
    
          /* validate the custom claims of token i.e. user role scopes 
          * and if any issue throw an exception 
          */ 
    
          return token; 
         } 
        } 
    
    下に示すように
    方法を向上させます

    extractAccessTokenメソッドでは、JWTアクセストークンに必要なユーザーロールスコープがあることを簡単に検証できます。違反が検出された場合はInvalidTokenExceptionを投げます(カスタム例外もあります)。

  • 関連する問題