首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NestJS & Passport:在用户密码更改时更改JWT令牌?

基础概念

NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用现代 JavaScript 或 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应编程)的元素。

Passport 是一个 Node.js 的中间件,用于认证。它提供了多种策略来验证用户的身份,例如本地策略、OAuth、OpenID Connect 等。

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。

相关优势

  • NestJS 提供了模块化、可测试性和可扩展性的优势。
  • Passport 提供了灵活且强大的认证机制。
  • JWT 提供了无状态、自包含的安全令牌,适合分布式系统。

类型

  • JWT 有三种类型:访问令牌(Access Token)、刷新令牌(Refresh Token)和 ID 令牌(ID Token)。

应用场景

  • NestJSPassport 结合使用,可以实现安全的用户认证和授权。
  • JWT 可以用于在客户端和服务器之间安全地传输信息。

问题:在用户密码更改时更改 JWT 令牌

当用户更改密码时,为了安全起见,应该使旧的 JWT 令牌失效。这可以通过以下几种方式实现:

方法一:使用刷新令牌

  1. 生成刷新令牌:在用户登录时,生成一个刷新令牌并存储在数据库中。
  2. 验证刷新令牌:当用户更改密码时,删除或使当前的刷新令牌失效。
  3. 重新生成 JWT:用户下次访问时,使用新的刷新令牌重新生成 JWT。
代码语言:txt
复制
// 示例代码
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { User } from './user.entity';

@Injectable()
export class AuthService {
  constructor(private jwtService: JwtService) {}

  async login(user: User) {
    const payload = { userId: user.id };
    const accessToken = this.jwtService.sign(payload);
    const refreshToken = this.generateRefreshToken(user.id);
    // 存储 refreshToken 到数据库
    return { accessToken, refreshToken };
  }

  async refreshToken(userId: string) {
    const user = await User.findOne(userId);
    if (!user) {
      throw new Error('User not found');
    }
    const payload = { userId: user.id };
    const accessToken = this.jwtService.sign(payload);
    const refreshToken = this.generateRefreshToken(user.id);
    // 更新数据库中的 refreshToken
    return { accessToken, refreshToken };
  }

  async changePassword(userId: string) {
    // 使当前的 refreshToken 失效
    // 删除或更新数据库中的 refreshToken
  }

  private generateRefreshToken(userId: string) {
    // 生成刷新令牌的逻辑
  }
}

方法二:使用黑名单

  1. 生成 JWT:在用户登录时,生成 JWT 并设置较短的有效期。
  2. 黑名单机制:当用户更改密码时,将旧的 JWT 加入黑名单。
  3. 验证 JWT:在每次请求时,检查 JWT 是否在黑名单中。
代码语言:txt
复制
// 示例代码
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { User } from './user.entity';

@Injectable()
export class AuthService {
  constructor(private jwtService: JwtService) {}

  async login(user: User) {
    const payload = { userId: user.id };
    const accessToken = this.jwtService.sign(payload);
    // 存储 accessToken 到黑名单(如果需要)
    return { accessToken };
  }

  async changePassword(userId: string) {
    // 将旧的 accessToken 加入黑名单
  }

  async verifyToken(token: string) {
    // 检查 token 是否在黑名单中
    // 如果在黑名单中,抛出异常
  }
}

参考链接

通过以上方法,可以在用户更改密码时有效地使旧的 JWT 令牌失效,从而提高系统的安全性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券