gpt4 book ai didi

node.js - 刷新 token API 错误 "secretOrPrivateKey must have a value"

转载 作者:行者123 更新时间:2023-12-02 18:10:16 26 4
gpt4 key购买 nike

当用户登录 API 生成一个 token 以便他可以访问其他端点,但 token 将在 60 秒后过期,我创建了一个函数来使用旧 token (存储在数据库中)生成一个新的有效 token ), 但是当我要生成一个新的有效 token 时,我得到了 secretOrPrivateKey must have a value error

函数refreshToken使用函数login生成一个新的token

嵌套错误:

secretOrPrivateKey must have a value
Error: secretOrPrivateKey must have a value
at Object.module.exports [as sign] (C:\Users\talis\nova api\myflakes_api\node_modules\jsonwebtoken\sign.js:107:20)
at JwtService.sign (C:\Users\talis\nova api\myflakes_api\node_modules\@nestjs\jwt\dist\jwt.service.js:28:20)
at AuthService.login (C:\Users\talis\nova api\myflakes_api\src\auth\auth.service.ts:18:39)
at TokenService.refreshToken (C:\Users\talis\nova api\myflakes_api\src\token\token.service.ts:39:37)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at TokenController.refreshToken (C:\Users\talis\nova api\myflakes_api\src\token\token.controller.ts:12:16)
at C:\Users\talis\nova api\myflakes_api\node_modules\@nestjs\core\router\router-execution-context.js:46:28
at C:\Users\talis\nova api\myflakes_api\node_modules\@nestjs\core\router\router-proxy.js:9:17

我的代码:

文件 token.service.ts 中的函数 refreshToken

async refreshToken(oldToken: string) {
let objToken = await this.tokenRepository.findOne({hash: oldToken})
if (objToken) {
let user = await this.userService.findOneOrFail({email:objToken.email})
return this.authService.login(user)
} else {
return new UnauthorizedException(MessagesHelper.TOKEN_INVALID)
}
}

文件auth.service.ts中的函数登录

async login(user: UsersEntity) {
const payload = { email: user.email, sub: user.idUser }
const token = this.jwtService.sign(payload) // here!!!
this.tokenService.save(token, user.email)
return {
token: token
};
}

错误发生在 const token = this.jwtService.sign(payload)

这是文件 jwt.strategy.ts

import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
import { jwtConstants } from "../constants";
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}

async validate(payload: { sub: any; email: any; }) {
return { id: payload.sub, email: payload.email}
}
}

这里是 local.strategy.ts

import { Injectable, UnauthorizedException } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { Strategy } from "passport-local";
import { MessagesHelper } from "src/helpers/messages.helper";
import { AuthService } from "../auth.service";

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super({ usernameField: 'email' });
}

async validate(email: string, password: string): Promise<any> {
const user = await this.authService.validateUser(email, password);
if(!user)
throw new UnauthorizedException(MessagesHelper.PASSWORD_OR_EMAIL_INVALID)

return user;
}
}

这是 JwtModule.register 所在的 AuthModule

@Module({
imports: [
ConfigModule.forRoot(),
UsersModule,
PassportModule,
TokenModule,
JwtModule.register({
secret: jwtConstants.secret,
signOptions: { expiresIn: '60s' },
}),
],
controllers: [AuthController],
providers: [AuthService, LocalStrategy, JwtStrategy],
exports: [JwtModule, AuthService]
})
export class AuthModule {}

伙计们,我尝试使用图像,但我是新用户,我仍然没有声誉,抱歉。

最佳答案

做什么 @Micael Levi评论中提到的对我有用,所以它是:

const token = this.jwtService.sign(payload, jwtConstants.secret)

为了将来引用,尽管我的环境变量被定义了,但我还是遇到了这个问题(process.env.SECRET_KEY 未定义是其他类似问题中常见的问题)。所以我修复我的方法是:

return {
access_token: this.jwtService.sign(payload, { secret: process.env.JWT_SEC }),
};

关于node.js - 刷新 token API 错误 "secretOrPrivateKey must have a value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72503661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com