2016-05-16 481 views
3

我試圖通過捲曲執行該命令TokenEndpoint:處理空指針異常

curl -X POST -k -vu clientapp:123456 http://localhost:8080/oauth/token -H "Accept: application/json" -d "grant_type=authorization_code&scope=read%20write&client_secret=123456&client_id=clientapp&code=appcode&redirect_uri=localhost:3000" 

反應是

* Adding handle: conn: 0x608860 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x608860) send_pipe: 1, recv_pipe: 0 
* About to connect() to localhost port 8080 (#0) 
* Trying ::1... 
* Connected to localhost (::1) port 8080 (#0) 
* Server auth using Basic with user 'clientapp' 
> POST /oauth/token HTTP/1.1 
> Authorization: Basic Y2xpZW50YXBwOjEyMzQ1Ng== 
> User-Agent: curl/7.30.0 
> Host: localhost:8080 
> Accept: application/json 
> Content-Length: 131 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 131 out of 131 bytes 
< HTTP/1.1 400 Bad Request 
< Date: Mon, 16 May 2016 01:02:09 GMT 
< Access-Control-Allow-Credentials: true 
< Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT,DELETE 
< Access-Control-Max-Age: 3600 
< Access-Control-Allow-Headers: Authorization,Content-Disposition,Content-Description,Content-Type,Accept, X-Requested-With, remember-me 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< X-Frame-Options: DENY 
< Cache-Control: no-store 
< Pragma: no-cache 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
* Server Jetty(9.2.14.v20151106) is not blacklisted 
< Server: Jetty(9.2.14.v20151106) 
< 
{"error":"invalid_grant","error_description":"Invalid authorization code: appcode"}* 

在檢查我的日誌,我已經收到請求從我的oauth2服務器代碼這個錯誤。

2016-05-16 09:26:43.826 INFO 9688 --- [tp1276746636-47] o.s.s.o.provider.endpoint.TokenEndpoint : Handling error: NullPointerException, null 

我的配置

@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfiguration extends 
     AuthorizationServerConfigurerAdapter { 

    @Value("${client.secret}") 
    private String clientSecret; 

    @Value("${client}") 
    private String clientId; 

    @Autowired 
    private TokenStore tokenStore; 

    @Autowired 
    private JdbcAuthorizationCodeServices jdbcAuthorizationCodeServices; 

    /** 
    * By default, 
    * it uses the JDBCUserDetails, we exposed our own authentication manager bean 
    */ 
    @Autowired 
    @Qualifier("authenticationManagerBean") 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private JdbcClientDetailsService jdbcClientDetailsService; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
      throws Exception { 
     endpoints 
       .tokenStore(this.tokenStore) 
       .authenticationManager(this.authenticationManager) 
       .authorizationCodeServices(this.jdbcAuthorizationCodeServices).userApprovalHandler(new DefaultUserApprovalHandler()); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security.allowFormAuthenticationForClients(); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.withClientDetails(jdbcClientDetailsService); 
       /*.inMemory() 
       .withClient(clientId) 
       .authorizedGrantTypes("password", "refresh_token") 
       .authorities("USER") 
       .scopes("read", "write") 
       .resourceIds(RESOURCE_ID) 
       .secret(clientSecret);*/ 
    } 

    @Bean 
    @Primary 
    public DefaultTokenServices tokenServices() { 
     DefaultTokenServices tokenServices = new DefaultTokenServices(); 
     tokenServices.setSupportRefreshToken(true); 
     tokenServices.setTokenStore(this.tokenStore); 
     return tokenServices; 
    } 
} 
+0

您需要包含* full *堆棧跟蹤。 – kryger

+0

它沒有扔整個堆棧跟蹤 – user962206

+0

我正在使用彈簧啓動 – user962206

回答

5

正如上面提到的,你需要打印出完整的堆棧跟蹤的要點。這樣做的最簡單方法是將自定義的異常轉換器注入到Auth服務器配置中。看下面的例子。

定義一個新的異常譯者:

@Bean 
    public WebResponseExceptionTranslator loggingExceptionTranslator() { 
     return new DefaultWebResponseExceptionTranslator() { 
      @Override 
      public ResponseEntity<OAuth2Exception> translate(Exception e) throws Exception { 
       // This is the line that prints the stack trace to the log. You can customise this to format the trace etc if you like 
       e.printStackTrace(); 

       // Carry on handling the exception 
       ResponseEntity<OAuth2Exception> responseEntity = super.translate(e); 
       HttpHeaders headers = new HttpHeaders(); 
       headers.setAll(responseEntity.getHeaders().toSingleValueMap()); 
       OAuth2Exception excBody = responseEntity.getBody(); 
       return new ResponseEntity<>(excBody, headers, responseEntity.getStatusCode()); 
      } 
     }; 
    } 

然後例外轉換添加到終點所以在配置它們的方法:

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints 
      // Your usual config here ..... 
      .exceptionTranslator(loggingExceptionTranslator()); 
} 

然後,您應該在日誌中看到一些有用的信息是將幫助您診斷問題。

+1

祝福你的靈魂 – zero01alpha