在我们的 rest api 中,当有人登录时,他的 jwt 刷新令牌在使用 bcrypt 加密后存储在数据库中,当用户想要获取新的访问令牌时,api 将通过比较来检查刷新令牌是否仍在数据库中来自标头和数据库的 jwt,但它始终返回 true
Nestjs + prisma + postgres
import * as bcrypt from 'bcrypt';
export function encryptData(data: string) {
return bcrypt.hashSync(data, bcrypt.genSaltSync());
}
export function compareData(data: string, hashed: string) {
return bcrypt.compareSync(data, hashed);
}
这是刷新令牌被推送到数据库
refreshTokens: Array<string>
async pushNewRefreshToken(refreshToken: string, userId: number) {
return this.prismaService.users.update({
data: {
refreshTokens: {
push: encryptData(refreshToken),
},
},
where: { userId },
});
}
这就是我们比较的地方
async checkRefreshToken(refreshToken: string, userId: number) {
const user = await this.getUserService.getUserById(userId);
if (user.refreshTokens) {
for (const token of user.refreshTokens) {
if (compareData(refreshToken, token)) {
Logger.log('Token match')
return true;
}
}
}
return false;
}
我试图注销所有内容,但我不明白为什么这不起作用
Bcrypt 的方法是异步的,它们返回
Promise
s。 Promise
是 truthy
,无论其结果如何,只需进行 !!promise
检查。需要await
promise 的结果才能知道是不是同一个token