首页
学习
活动
专区
工具
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 令牌失效,从而提高系统的安全性。

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

相关·内容

Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权

当前比较流程的是JWT 认证,也叫令牌认证,今天我们探讨一下在 Nest.js 中如何实现。...认证流程客户端将首先使用用户名和密码进行身份认证认证成功,服务端会签发一个 JWT 返回给客户端该 JWT 在后续请求的授权头中作为 Bearer Token 发送,以实现身份认证JWT 认证策略 1、...安装依赖 pnpm add @nestjs/passport passport-jwt @nestjs/jwt 2、 在 auth 模块中新建 jwt.strategy.ts 文件,用来处理认证流程...'@nestjs/passport'; import { Request } from 'express'; import { ExtractJwt, Strategy } from 'passport-jwt...认证守卫我们已经实现了 JWT 的认证策略及签发,接下来要做的就是携带有效的 JWT 来保护接口@nestjs/passport 中已经内置 AuthGuard 守卫,我们直接用就行。

21920

【Nest教程】Nest项目集成JWT接口认证

我们都知道,http协议本身是无状态的协议,如果在一个系统中,我们只有登录后在可以操作,由于http是无状态的,所以那就必须每个接口都需要一个认证,来查看当前用户是否有权限。...今天我们就基于之前的项目,集成JWT。 1 user.service方法 增加一个查询单个用户的方法,这个方法不需要对应控制器。...passport-jwt passport-local @nestjs/passport @nestjs/jwt -S 4 创建Auth模块 src下新建文件夹logical/auth,auth目录下为我们逻辑功能...{ ExtractJwt, Strategy } from 'passport-jwt'; import { PassportStrategy } from '@nestjs/passport'; import.../user/user.module'; import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs

3K1311
  • Nest.js 实战系列第二篇-实现注册、扫码登陆、jwt认证等

    在实现登录注册之前,需要先整理一下需求, 我们希望用户有两种方式可以登录进入网站来写文章, 一种是账号密码登录,另一种是微信扫码登录。文章内容大纲 接着上章内容开始......在注册功能中,当用户是通过用户名和密码进行注册,密码我们不能直接存明文在数据库中,所以采用bcryptjs实现加密, 然后再存入数据库。...实践一下 npm install @nestjs/jwt 首先注册一下JwtModule, 在auth.module.ts中实现: ... import { JwtModule } from '@nestjs...最后我们在auth.service.ts中实现业务逻辑: //auth.service.ts ... import { JwtService } from '@nestjs/jwt'; @Injectable...install passport-jwt @types/passport-jwt 其实jwt 策略主要实现分两步 第一步: 如何取出token 第二步: 根据token拿到用户信息 我们看一下实现:

    10.1K30

    关于 Node.js 的认证方面的教程(很可能)是有误的

    与 Devise 相比,Passport 只是身份验证中间件,不会处理任何其他身份验证:这意味着 Node.js 开发人员可能会定制自己的 API 令牌机制、密码重置令牌机制、用户认证路由、端点、多种模板语言...凭证,作为中间件,简单地说就是“这个用户可以通过”或“这个用户不可以通过”,需要 passport-local 模块来处理在你自己的数据库密码存储,这个模块也是由 Passport.js 作者写的。...我们在 Google 上搜索 express js jwt,然后找到 Soni Pandey 的教程使用 Node.js 中的 JWT(JSON Web 令牌)进行用户验证,。...Scotch,在 passport-local 教程中做了一个密码存储的工作,比如只是忽略他们以前告诉你的东西,并将密码存储在明文中。...这个令牌返回并显示在了 Postman 上。 ? 从 Scotch 教程返回的 JWT 令牌。 请注意,JSON Web 令牌已签名但未加密。

    4.6K90

    Nest.js JWT 验证授权管理

    什么是JWT 验证JWT(JSON Web Token)是一种用于在网络应用中传输信息的开放标准(RFC 7519)。它是一种基于JSON的安全令牌,用于在不同系统之间传递声明(claims)。...JWT通常用于身份验证和授权机制。JWT 组成JWT由三个部分组成,它们通过点号(.)分隔:头部(Header):描述令牌的元数据和签名算法。...载荷(Payload):包含声明信息,例如用户身份、权限等。签名(Signature):用于验证令牌的完整性和真实性。JWT 验证流程接收到JWT后,首先将其拆分为头部、载荷和签名三个部分。...同时,由于JWT本身包含了用户信息,因此在传输过程中需要采取适当的安全措施,如使用HTTPS来保护通信。...接收客户端发送的请求(用户名,密码)去数据库查询是否存在该用户,如果存在比对密码(示例中是伪代码)密码通过的话,配置 JWT 的 Payload ,声明信息,例如用户身份、权限等最终通过 this.jwtService.signAsync

    94721

    如何使用 NestJs、PostgreSQL、Redis 构建基于用户设备的授权验证

    ,即 jwt 令牌。...注意:我们可以通过将 jwt 令牌传递给请求头来使用cookies或会话。但为了简单起见,我们将在请求和响应体之间使用 jwt 令牌。 这些令牌包含了发起这些请求的用户的有效载荷。...JWT令牌已经通过验证。如果没有令牌,我们会抛出未经授权的异常。...使用HTTpie进行测试 现在我们可以访问JWT令牌,这是我们在Postman登录时返回的 access-token ,让我们使用该令牌在另一台设备上发出请求。...这将从包含用户设备详细信息的缓存中删除用户的电子邮件键。 注意:由于密钥已从Redis缓存中删除,我们还必须在成功注销后从客户端删除JWT令牌。

    44221

    Nest.js进阶系列四:Node.js中使用Redis原来这么简单!

    首先,我们在Nest.js项目中连接Redis, 连接Redis需要的参数: REDIS_HOST:Redis 域名 REDIS_PORT:Redis 端口号 REDIS_DB:Redis 数据库 REDIS_PASSPORT...户唯一登录:相同的账号,不同电脑登录,先登录的用户会被后登录的挤下线 token 过期处理 在登录时,将jwt生成的token,存入redis,并设置有效期为30分钟。...我这里主要介绍一下,纯后端实现的token自动续期 实现流程: ①:jwt生成token时,有效期设置为用不过期 ②:redis 缓存token时设置有效期30分钟 ③:用户携带token请求时, 如果...在Nest中除了使用官方推荐的这种方式外, 还可以使用nestjs-redis来实现,如果你存token时, 希望存hash结构,使用cache-manager-redis-store时,会发现没有提供...注意:如果使用nest-redis来实现redis缓存, 在Nest.js 8 版本下会报错, 小伙伴们可以使用@chenjm/nestjs-redis 来代替, 或者参考 issue上的解决方案:Nest

    2.6K30

    边缘认证和与令牌无关的身份传播

    在这个过程中,我们更改了身份在服务之间的传播方式,转而使用支持加密验证且令牌无关的身份对象。...在Netflix的流产品中使用了一些协议和令牌,概括如下: ? Netflix 的流生态系统会消费(有可能会更改)这些令牌,如: ?...更复杂的是,可以通过多种方法在系统之间传输这些令牌或令牌中包含的数据。...我们引入了一个称为"Passport"的身份结构,它允许以统一的方式传播用户和设备身份信息。Passport也是一种令牌,但相比使用外部令牌,使用内部结构能带来很多好处。...Passport 的完整性 Passport 的完整性由HMAC保证(基于哈希的消息认证码),HMAC是一种特定类型的MAC,涉及密码哈希函数和密钥,可以同时用于校验数据完整性和消息的真实性。

    1.7K10

    【安全】如果您的JWT被盗,会发生什么?

    现在,只要知道这意味着拥有JWT的任何可信方都可以判断令牌是否已被修改或更改。...但是,有一件事使得被盗的JWT比被盗的用户名和密码稍微不那么糟糕:时机。由于JWT可以配置为在设定的时间(一分钟,一小时,一天等)后自动过期,因此攻击者只能使用您的JWT访问该服务,直到它过期。...另一个有趣的事情是,在某些情况下,被盗的JWT实际上可能比被盗的用户名和密码更糟糕。 让我们暂时假装您的用户名和密码已被盗用。...如果您在服务器上使用撤销列表来使令牌无效,则撤消令牌可立即将攻击者从系统中启动,直到他们获得新令牌为止。虽然这是一个临时解决方案,但它会让攻击者的生活变得更加困难。 强制您的客户立即更改密码。...如果攻击者试图使用受感染的令牌修改用户登录凭据,则强制用户更改其密码可能会使攻击者远离其帐户。通过要求多因素身份验证,您可以更自信地重置其凭据的用户是他们所声称的人而不是攻击者。 检查客户的环境。

    12.3K30

    如何在微服务架构中实现安全性?

    例如,应用程序通常会验证访问的凭据,例如用户的 ID 和密码,或应用程序的 API 密钥。 访问授权:验证是否允许访问主体对指定数据完成请求的操作。...客户在向 FTGO 应用程序发出的每个后续请求中都会包括会话令牌 当用户使用其用户 ID 和密码登录时,客户端会向 FTGO 应用程序发出包含用户凭据的 POST 请求。...Passport:在 Node.js 应用程序流行的一个专注于身份验证的安全框架。 安全架构的一个关键部分是会话,它存储主体的 ID 和角色。...使用 JWT 传递用户身份和角色 在微服务架构中实现安全性时,你需要确定 API Gateway 应使用哪种类型的令牌来将用户信息传递给服务。有两种类型的令牌可供选择。...透明令牌的一个流行的标准是 JSON Web 令牌(JWT)。JWT 是在访问双方之间安全地传递信息(例如用户身份和角色)的标准方式。

    4.5K40
    领券