feat: 登出接口
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
package com.webgame.webgamebackend.common.dto.account;
|
||||
|
||||
import com.webgame.webgamebackend.common.dto.base.BaseVo;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 登出请求
|
||||
*/
|
||||
public record LogoutRequest(
|
||||
@NotNull(message = "刷新令牌不能为null")
|
||||
@NotBlank(message = "刷新令牌不能为空")
|
||||
String refreshToken
|
||||
) implements BaseVo {
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import com.webgame.webgamebackend.common.dto.ApiResponse;
|
||||
import com.webgame.webgamebackend.common.dto.account.LoginRequest;
|
||||
import com.webgame.webgamebackend.common.dto.account.LoginResponse;
|
||||
import com.webgame.webgamebackend.common.dto.account.LogoutRequest;
|
||||
import com.webgame.webgamebackend.common.dto.account.RefreshTokenRequest;
|
||||
import com.webgame.webgamebackend.common.dto.account.RegisterRequest;
|
||||
import com.webgame.webgamebackend.service.AccountService;
|
||||
@@ -55,4 +56,13 @@ public class AccountController {
|
||||
LoginResponse result = accountService.refresh(request.refreshToken());
|
||||
return ApiResponse.ok(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 登出,使 access token 和 refresh token 失效
|
||||
*/
|
||||
@PostMapping("/logout")
|
||||
public ApiResponse<Void> logout(@Valid @RequestBody LogoutRequest request) {
|
||||
accountService.logout(request.refreshToken());
|
||||
return ApiResponse.ok(null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,4 +32,11 @@ public interface AccountService {
|
||||
* @return 新的双 token(accessToken + refreshToken)
|
||||
*/
|
||||
LoginResponse refresh(String refreshToken);
|
||||
|
||||
/**
|
||||
* 登出,使 access token 和 refresh token 失效
|
||||
*
|
||||
* @param refreshToken 刷新令牌
|
||||
*/
|
||||
void logout(String refreshToken);
|
||||
}
|
||||
|
||||
@@ -89,6 +89,17 @@ public class AccountServiceImpl implements AccountService {
|
||||
return new LoginResponse(accessToken, refreshToken);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logout(String refreshToken) {
|
||||
// 获取当前登录用户ID(用于日志)
|
||||
String loginId = (String) StpUtil.getLoginId();
|
||||
// 登出 Sa-Token,使 access token 失效
|
||||
StpUtil.logout();
|
||||
// 撤销 refresh token,使其在 Redis 中删除
|
||||
refreshTokenService.revoke(refreshToken);
|
||||
log.info("用户已登出: userId={}", loginId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成6位随机数字,用于默认昵称
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user