2017-11-16 21 views
0

私は、春のクラウド、oauth、JWTでマイクロサービスアプリケーションを構築しています。私のOauth2サーバーはJWTトークンを生成しますが、私はゲートウェイでトークンを検証しようとしていますが(ZUULを使用して実装されています)、エラーが発生しています春のJWT署名検証に失敗しました

私は何が間違っているのか、 私は、認証サーバとゲートウェイサーバの両方にキー12345AsDfGに署名に使用している春4.3、春のブート1.5.8、春の雲Dalston.SR4

org.springframework.security.jwt.crypto.sign.InvalidSignatureException: Calculated signature did not match actual value 
    at org.springframework.security.jwt.crypto.sign.MacSigner.verify(MacSigner.java:62) ~[spring-security-jwt-1.0.8.RELEASE.jar:na] 
    at org.springframework.security.jwt.JwtImpl.verifySignature(JwtHelper.java:287) ~[spring-security-jwt-1.0.8.RELEASE.jar:na] 
    at org.springframework.security.jwt.JwtHelper.decodeAndVerify(JwtHelper.java:77) ~[spring-security-jwt-1.0.8.RELEASE.jar:na] 
    at com.debopam.gateway.filter.CustomPostZuulFilter.run(CustomPostZuulFilter.java:57) ~[classes/:na] 
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112) [zuul-core-1.3.0.jar:1.3.0] 
    at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) [zuul-core-1.3.0.jar:1.3.0] 
    at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) [zuul-core-1.3.0.jar:1.3.0] 
    at com.netflix.zuul.FilterProcessor.postRoute(FilterProcessor.java:92) [zuul-core-1.3.0.jar:1.3.0] 
    at com.netflix.zuul.ZuulRunner.postRoute(ZuulRunner.java:87) [zuul-core-1.3.0.jar:1.3.0] 

を使用しています。

以下

は、コードスニペットゲートウェイアプリケーションで 認証サーバ

@Configuration 
public class JWTTokenStoreConfig { 

    @Autowired 
    private ServiceConfig serviceConfig; 

    @Bean 
    public TokenStore tokenStore() { 
     return new JwtTokenStore(jwtAccessTokenConverter()); 
    } 

    @Bean 
    @Primary 
    public DefaultTokenServices tokenServices() { 
     DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); 
     defaultTokenServices.setTokenStore(tokenStore()); 
     defaultTokenServices.setSupportRefreshToken(true); 
     defaultTokenServices.setAccessTokenValiditySeconds(60*30); 
     return defaultTokenServices; 
    } 


    @Bean 
    public JwtAccessTokenConverter jwtAccessTokenConverter() { 
     JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
     converter.setSigningKey(serviceConfig.getJwtSigningKey()); 
     return converter; 
    } 

    @Bean 
    public TokenEnhancer jwtTokenEnhancer() { 
     return new JWTTokenEnhancer(); 
    } 
} 


@Configuration 
public class JWTOAuth2Config extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private TokenStore tokenStore; 

    @Autowired 
    private DefaultTokenServices tokenServices; 

    @Autowired 
    private JwtAccessTokenConverter jwtAccessTokenConverter; 

    @Autowired 
    private TokenEnhancer jwtTokenEnhancer; 


    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
    { 
     //oauthServer.checkTokenAccess("permitAll()");  

     oauthServer 
     .tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')") 
     .checkTokenAccess("permitAll()"); 
    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); 
     tokenEnhancerChain.setTokenEnhancers(Arrays.asList(jwtTokenEnhancer, jwtAccessTokenConverter)); 

     endpoints.tokenStore(tokenStore)        //JWT 
       .accessTokenConverter(jwtAccessTokenConverter)  //JWT 
       .tokenEnhancer(tokenEnhancerChain)     //JWT 
       .authenticationManager(authenticationManager) 
       .userDetailsService(userDetailsService); 


    } 



    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 

     clients.inMemory() 
       .withClient("uiapp") 
       .secret("secret") 
       .authorizedGrantTypes("refresh_token", "password", "client_credentials") 
       .scopes("webclient", "mobileclient"); 
    } 
} 

です、私はトークン

@Override 
public Object run() { 
    RequestContext ctx = RequestContext.getCurrentContext(); 
    try { 
     InputStream is = ctx.getResponseDataStream(); 
     String responseBody = IOUtils.toString(is); 

     if (StringUtils.hasText(responseBody) 
       && responseBody.contains("access_token")) { 
      Map<String, Object> responseMap = objectMapper.readValue(
        responseBody, new TypeReference<Map<String, Object>>() {}); 
      String accesToken = responseMap.get("access_token").toString(); 

      Jwt jwt = JwtHelper.decodeAndVerify(accesToken, new MacSigner(serviceConfig.getJwtSigningKey())); 

      System.out.println(jwt.getClaims()); 
      //System.out.println(jwt.getBody()); 

     } 
     ctx.setResponseBody(responseBody); 
    } catch (Exception e) { 
     logger.error("Error occured in zuul post filter", e); 
    } 
    return null; 
} 
+0

私は春のoauthで他の実装とテストを調べましたが、何も見つかりませんでした。私はそれをデバッグします。到着時に正しい形式のトークンですか?それは生産されたものと同じですか?鍵は両端で同じですか? – MarianP

+0

申し訳ありませんが、サービス間に重要な不一致がありました。 – Debopam

答えて

0

を確認するためのコードの下に使用しています署名鍵の不一致がありましたサービス間。

関連する問題