Выход из Spring Security Oauth2 с использованием @FrameworkEndpoint - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выйти, отозвав access_token следующим образом:

@FrameworkEndpoint
public class SecurityLogoutController {
  @Autowired
  private ConsumerTokenServices                 consumerTokenServices;

  @DeleteMapping( "/oauth/token" )
  public ResponseEntity<Void> logout( WebRequest request ) {
    String bearer = "bearer";
    String authorizationHeader = request.getHeader( HttpHeaders.AUTHORIZATION );
    log.info( "authorization header: {}", authorizationHeader );
    if ( authorizationHeader != null && StringUtils.containsIgnoreCase( authorizationHeader, bearer ) ) {
        String accessTokenID = authorizationHeader.substring( bearer.length() + 1 );
        log.info( "access_token: {}", accessTokenID );
        consumerTokenServices.revokeToken( accessTokenID );
    }
    return ...;
  }
}

Но каждый раз, когда я отправляю этот запрос на удаление почтальону, я получаю такой ответ:

{
 "timestamp": "2018-05-30T01:09:11.710+0000",
 "status": 401,
 "error": "Unauthorized",
 "message": "Unauthorized",
 "path": "/oauth/token"
}

Конечная точка защищена Spring Security за сценой, и я не знаю, как и где эта конечная точка защищена.Что я не понимаю, так это то, почему клиент должен снова проходить аутентификацию, поскольку для получения access_token он был аутентифицирован?Это кажется странным для меня.

Теперь, когда я проверяю подлинность клиента, Почтальон автоматически заменяет значение заголовка Authorization и устанавливает его для обычной проверки подлинности.Что-то вроде: Basic Y2hpY293YS11aXNlcnZpY2U6Y2aXNlcnZpY2U=

Нужна помощь ... Спасибо

1 Ответ

0 голосов
/ 30 мая 2018

Это действительно имеет смысл, потому что выход из системы может быть выполнен с помощью предоставленного токена тем, кто уже вошел в систему. Приложение браузера наверняка будет иметь client_id и секретный ключ для передачи.

Даже у меня такая же проблема и я выложил то же самое на SO.Хорошо ... один выход - вы выполняете базовую аутентификацию с помощью client_id и secret и, что важно, передаете другой заголовок с именем AUTH-TOKEN (или что-то еще) со значением фактического токена, который вы хотите удалить.Вот код

@RequestMapping(method = RequestMethod.DELETE, value = "/oauth/token")
@ResponseBody
public void revokeToken(HttpServletRequest request) {
    String authorization = request.getHeader("AUTH-TOKEN");
    if (authorization != null && authorization.contains("Bearer")) {
                String tokenId = authorization.substring("Bearer".length() + 1);
                System.out.println("tokenId : " + tokenId);
                tokenServices.revokeToken(tokenId);
                //tokenStore.removeRefreshToken(token);   
     }
} 
...