jwtservice.sign 如何录入用户ID和用户名 在策略中如何解析出来
时间: 2024-03-20 16:38:39 浏览: 104
在JWTServie的sign()方法中,可以通过传递一个包含用户ID和用户名的payload对象,将这些信息添加到JWT中。例如,可以按照以下方式使用JWTServie的sign()方法生成JWT:
```
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(private readonly jwtService: JwtService) {}
async login(user: any) {
const payload = { userId: user.id, username: user.username };
return {
access_token: this.jwtService.sign(payload),
};
}
}
```
在这个例子中,当用户登录时,会生成一个包含用户ID和用户名的payload对象。然后,使用JWTServie的sign()方法,将这个payload对象加密成一个JWT字符串,并将其作为登录成功后返回给客户端的access_token属性。当客户端在后续的请求中携带这个access_token时,服务器就可以解密出其中的用户ID和用户名,用于进行身份验证。
在JWT验证策略中,可以通过解码JWT的payload,获取其中的userId和username属性,用于进行身份验证。例如,可以按照以下方式进行验证:
```
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { AuthService } from './auth.service';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: 'secret-key',
});
}
async validate(payload: any) {
return { userId: payload.userId, username: payload.username };
}
}
```
在这个例子中,使用Passport-JWT库的Strategy和PassportStrategy类,实现了一个JWT验证策略。在构造函数中,使用ExtractJwt.fromAuthHeaderAsBearerToken()方法从请求头中提取JWT字符串,并使用secret-key作为加密密钥。在validate()方法中,解析出JWT的payload,并将其中的userId和username属性返回。这样,在后续的请求中,就可以从请求对象的user属性中获取到这些信息,用于进行用户身份验证。
阅读全文