logout
This commit is contained in:
parent
699897b071
commit
388f2869fd
@ -9,12 +9,16 @@ import {
|
|||||||
UseInterceptors,
|
UseInterceptors,
|
||||||
BadRequestException,
|
BadRequestException,
|
||||||
Query,
|
Query,
|
||||||
UnauthorizedException,
|
|
||||||
} from '@nestjs/common'
|
} from '@nestjs/common'
|
||||||
import type { Response } from 'express'
|
import type { Response } from 'express'
|
||||||
import { Cookies } from 'src/common/decorators/cookies.decorator'
|
import { Cookies } from 'src/common/decorators/cookies.decorator'
|
||||||
import { MeService } from './me.service'
|
import { MeService } from './me.service'
|
||||||
import { ApiTags, ApiOperation, ApiUnauthorizedResponse } from '@nestjs/swagger'
|
import {
|
||||||
|
ApiTags,
|
||||||
|
ApiOperation,
|
||||||
|
ApiUnauthorizedResponse,
|
||||||
|
ApiCookieAuth,
|
||||||
|
} from '@nestjs/swagger'
|
||||||
import { User } from 'src/common/decorators/user.decorator'
|
import { User } from 'src/common/decorators/user.decorator'
|
||||||
import { NeedAuth } from 'src/common/decorators/need-auth.decorator'
|
import { NeedAuth } from 'src/common/decorators/need-auth.decorator'
|
||||||
import { PasswordInterceptor } from 'src/common/interceptors/password.interceptor'
|
import { PasswordInterceptor } from 'src/common/interceptors/password.interceptor'
|
||||||
@ -43,6 +47,14 @@ export class MeController {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Delete('token')
|
||||||
|
@ApiOperation({ summary: '退出登录' })
|
||||||
|
@NeedAuth()
|
||||||
|
async logout(@Res({ passthrough: true }) res: Response) {
|
||||||
|
res.clearCookie('refreshToken')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
@Patch()
|
@Patch()
|
||||||
@ApiOperation({ summary: '修改用户信息(用户名等)' })
|
@ApiOperation({ summary: '修改用户信息(用户名等)' })
|
||||||
@UseInterceptors(PasswordInterceptor)
|
@UseInterceptors(PasswordInterceptor)
|
||||||
@ -95,14 +107,12 @@ export class MeController {
|
|||||||
|
|
||||||
@Put('token')
|
@Put('token')
|
||||||
@ApiOperation({ summary: '刷新token' })
|
@ApiOperation({ summary: '刷新token' })
|
||||||
|
@ApiCookieAuth()
|
||||||
@ApiUnauthorizedResponse({ description: 'Unauthorized' })
|
@ApiUnauthorizedResponse({ description: 'Unauthorized' })
|
||||||
async updateAccessToken(
|
async updateAccessToken(
|
||||||
@Res({ passthrough: true }) res: Response,
|
@Res({ passthrough: true }) res: Response,
|
||||||
@Cookies('refreshToken') refreshToken: string,
|
@Cookies('refreshToken') refreshToken: string,
|
||||||
) {
|
) {
|
||||||
if (!refreshToken) {
|
|
||||||
throw new UnauthorizedException('no refresh token')
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
return this.meService.updateAccessToken(refreshToken)
|
return this.meService.updateAccessToken(refreshToken)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -66,7 +66,10 @@ export class MeService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateAccessToken(refreshToken: string) {
|
async updateAccessToken(refreshToken: string | undefined) {
|
||||||
|
if (!refreshToken) {
|
||||||
|
throw new UnauthorizedException('没有令牌,请重新登录')
|
||||||
|
}
|
||||||
const { userId, iat } = this.jwtService.verify<TokenContnet>(refreshToken, {
|
const { userId, iat } = this.jwtService.verify<TokenContnet>(refreshToken, {
|
||||||
secret: this.secureConfig.jwt_refresh_secret,
|
secret: this.secureConfig.jwt_refresh_secret,
|
||||||
})
|
})
|
||||||
@ -75,15 +78,16 @@ export class MeService {
|
|||||||
})
|
})
|
||||||
// TODO:不使用updatedAt,而是自定义的一个refreshTime字段
|
// TODO:不使用updatedAt,而是自定义的一个refreshTime字段
|
||||||
if (iat * 1000 < user.updatedAt.getTime()) {
|
if (iat * 1000 < user.updatedAt.getTime()) {
|
||||||
throw new UnauthorizedException('token失效,请重新登录')
|
throw new UnauthorizedException('令牌失效,请重新登录')
|
||||||
}
|
}
|
||||||
return this.jwtService.sign(
|
const accessToken = this.jwtService.sign(
|
||||||
{ userId },
|
{ userId },
|
||||||
{
|
{
|
||||||
secret: this.secureConfig.jwt_access_secret,
|
secret: this.secureConfig.jwt_access_secret,
|
||||||
expiresIn: this.secureConfig.refreshIn,
|
expiresIn: this.secureConfig.expiresIn,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
return accessToken
|
||||||
}
|
}
|
||||||
|
|
||||||
private async checkPassword(pwd: string, hashPwd: string) {
|
private async checkPassword(pwd: string, hashPwd: string) {
|
||||||
|
Loading…
Reference in New Issue
Block a user