Spring 使用@FrameworkEndpoint 安全Oauth2 注销
Spring Security Oauth2 logout using @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 幕后安全保护,我不知道该端点如何以及在何处受到保护。我不明白的是:为什么客户端应该再次进行身份验证,因为它已经获得了 access_token
它已经过身份验证?这对我来说似乎很奇怪。
现在,当我对客户端进行身份验证时,Postman 会自动替换 Authorization
header 值并将其设置为基本身份验证。类似于:Basic Y2hpY293YS11aXNlcnZpY2U6Y2aXNlcnZpY2U=
需要一些帮助...谢谢
这实际上是有道理的,因为已经登录的人可以使用提供的令牌注销。浏览器应用程序肯定会传递 client_id 和密码。
甚至我也有同样的问题并且已经在 SO 上发布了同样的问题。好吧.. 一种出路是您使用 client_id 和秘密进行基本身份验证,重要的是传递另一个 header 称为 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);
}
}
我正在尝试通过撤销 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 幕后安全保护,我不知道该端点如何以及在何处受到保护。我不明白的是:为什么客户端应该再次进行身份验证,因为它已经获得了 access_token
它已经过身份验证?这对我来说似乎很奇怪。
现在,当我对客户端进行身份验证时,Postman 会自动替换 Authorization
header 值并将其设置为基本身份验证。类似于:Basic Y2hpY293YS11aXNlcnZpY2U6Y2aXNlcnZpY2U=
需要一些帮助...谢谢
这实际上是有道理的,因为已经登录的人可以使用提供的令牌注销。浏览器应用程序肯定会传递 client_id 和密码。
甚至我也有同样的问题并且已经在 SO 上发布了同样的问题。好吧.. 一种出路是您使用 client_id 和秘密进行基本身份验证,重要的是传递另一个 header 称为 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);
}
}