|
|
@@ -1,5 +1,6 @@
|
|
|
import { FastifyRequest, FastifyReply, FastifyInstance } from 'fastify'
|
|
|
import { UserService } from '../services/user.service'
|
|
|
+import { MemberTokenManagerService } from '../services/member-token-manager.service'
|
|
|
import {
|
|
|
ListUserQuery,
|
|
|
LoginBody,
|
|
|
@@ -12,9 +13,11 @@ import { UserRole } from '../entities/user.entity'
|
|
|
|
|
|
export class UserController {
|
|
|
private userService: UserService
|
|
|
+ private tokenManagerService: MemberTokenManagerService
|
|
|
|
|
|
constructor(app: FastifyInstance) {
|
|
|
this.userService = new UserService(app)
|
|
|
+ this.tokenManagerService = new MemberTokenManagerService(app)
|
|
|
}
|
|
|
|
|
|
async register(request: FastifyRequest<{ Body: RegisterBody }>, reply: FastifyReply) {
|
|
|
@@ -61,6 +64,9 @@ export class UserController {
|
|
|
return reply.code(401).send({ message: '用户名或密码错误' })
|
|
|
}
|
|
|
|
|
|
+ // 单点登录:使该用户的所有其他token失效
|
|
|
+ await this.tokenManagerService.invalidateUserTokens(user.id)
|
|
|
+
|
|
|
const token = await reply.jwtSign({ id: user.id, name: user.name, role: user.role })
|
|
|
|
|
|
return reply.send({
|
|
|
@@ -68,7 +74,8 @@ export class UserController {
|
|
|
id: user.id,
|
|
|
name: user.name
|
|
|
},
|
|
|
- token
|
|
|
+ token,
|
|
|
+ message: '登录成功,其他设备已自动下线'
|
|
|
})
|
|
|
} catch (error) {
|
|
|
return reply.code(500).send({ message: '登录失败' })
|
|
|
@@ -199,4 +206,21 @@ export class UserController {
|
|
|
return reply.code(500).send({ message: '获取子用户失败' })
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户登出
|
|
|
+ * 使当前token失效
|
|
|
+ */
|
|
|
+ async logout(request: FastifyRequest, reply: FastifyReply) {
|
|
|
+ try {
|
|
|
+ // 使当前用户的所有token失效(包括当前token)
|
|
|
+ await this.tokenManagerService.invalidateUserTokens(request.user.id)
|
|
|
+
|
|
|
+ return reply.send({
|
|
|
+ message: '登出成功,所有设备已下线'
|
|
|
+ })
|
|
|
+ } catch (error) {
|
|
|
+ return reply.code(500).send({ message: '登出失败' })
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|