首页 > 解决方案 > Spring Security Oauth2 使用 @FrameworkEndpoint 注销

问题描述

我试图通过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 ...;
  }
}

但是每次我用 Postman 发送这个删除请求时,我都会收到这样的回复:

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

端点在幕后受到 Spring Security 的保护,我不知道该端点是如何以及在何处受到保护的。我不明白的是:为什么客户端应该再次进行身份验证,因为access_token它已经过身份验证?这对我来说似乎很奇怪。

现在,当我对客户端进行身份验证时,Postman 会自动替换Authorization标头值并将其设置为基本身份验证。就像是:Basic Y2hpY293YS11aXNlcnZpY2U6Y2aXNlcnZpY2U=

需要一些帮助...谢谢

标签: spring-bootspring-securityoauth-2.0logoutspring-security-oauth2

解决方案


这实际上是有道理的,因为已经登录的人可以使用提供的令牌完成注销。浏览器应用程序肯定会传递 client_id 和 secret。

即使我有同样的问题并且在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);   
     }
} 

推荐阅读