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

如何使用NestJS操作Passport-JS AuthGuard中的cookies?

在使用NestJS结合Passport-JS的AuthGuard时,处理cookies是一个常见的需求。Cookies通常用于存储会话信息,以便在客户端和服务器之间保持状态。以下是如何在NestJS中使用Passport-JS AuthGuard来操作cookies的基础概念和相关步骤:

基础概念

  • Cookies: 是一种存储在用户浏览器上的小型数据片段,它可以包含会话信息或其他数据。
  • Passport-JS: 是一个Node.js的身份验证中间件,支持多种策略。
  • AuthGuard: 是NestJS提供的一个守卫,用于保护路由,确保只有经过身份验证的用户才能访问。

相关优势

  • 安全性: 通过使用cookies和Passport-JS,可以有效地管理用户会话,提高应用的安全性。
  • 灵活性: Passport-JS支持多种身份验证策略,如本地策略、OAuth、JWT等,可以根据应用需求灵活选择。

类型

  • 会话Cookies: 存储在服务器端,通常与一个会话ID关联。
  • 持久Cookies: 设置了过期时间,即使关闭浏览器也会保留。

应用场景

  • 用户登录状态维护: 使用cookies来跟踪用户的登录状态。
  • 个性化设置: 存储用户的偏好设置或其他个性化信息。

如何操作Cookies

在NestJS中,你可以通过@nestjs/passportpassport模块来集成Passport-JS。以下是一个简单的例子,展示如何在AuthGuard中设置和读取cookies。

安装依赖

首先,确保你已经安装了必要的npm包:

代码语言:txt
复制
npm install @nestjs/passport passport passport-local cookie-parser

配置Passport

在你的NestJS应用中配置Passport:

代码语言:txt
复制
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { AuthService } from './auth.service';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'local' }),
  ],
  providers: [AuthService, LocalStrategy],
})
export class AuthModule {}

创建AuthGuard

创建一个AuthGuard来保护你的路由:

代码语言:txt
复制
import { Injectable } from '@nestjs/common';
import { CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy as JwtStrategy } from 'passport-jwt';

@Injectable()
export class JwtAuthGuard extends PassportStrategy(JwtStrategy) {
  constructor(private reflector: Reflector) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  canActivate(context: ExecutionContext): boolean | Promise<boolean> {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (roles) {
      const request = context.switchToHttp().getRequest();
      const jwt = this.extractJwt(request);
      const { role } = jwt.payload;
      if (!roles.includes(role)) {
        throw new UnauthorizedException('You do not have permission to access this resource');
      }
    }
    return super.canActivate(context);
  }
}

设置和读取Cookies

在你的控制器中,你可以使用cookie-parser中间件来解析请求中的cookies,并使用Passport来设置认证状态。

代码语言:txt
复制
import { Controller, Get, UseGuards, Response } from '@nestjs/common';
import { Response as ExpressResponse } from 'express';
import { AuthGuard } from '@nestjs/passport';

@Controller('profile')
export class ProfileController {
  @UseGuards(AuthGuard('jwt'))
  @Get()
  getProfile(@Req() req, @Res() res: ExpressResponse) {
    // 设置一个cookie
    res.cookie('profileId', '12345', { maxAge: 900000, httpOnly: true });
    
    // 读取cookie
    const profileId = req.cookies.profileId;
    
    return { message: 'Profile page', profileId };
  }
}

可能遇到的问题及解决方法

问题:Cookies未正确设置或读取

  • 原因: 可能是由于cookie-parser中间件未正确配置,或者cookies的属性(如httpOnlysecure等)设置不正确。
  • 解决方法: 确保在app.module.ts中引入并使用CookieParser模块,并检查cookies的属性设置是否符合你的安全策略。
代码语言:txt
复制
import { Module } from '@nestjs/common';
import { CookieParser } from '@nestjsplus/cookie-parser';

@Module({
  imports: [
    CookieParser(),
    // ...其他模块
  ],
})
export class AppModule {}

问题:AuthGuard未正确保护路由

  • 原因: 可能是由于AuthGuard未正确应用到路由上,或者Passport策略配置有误。
  • 解决方法: 确保在路由上使用了@UseGuards(AuthGuard('jwt'))装饰器,并检查Passport策略配置是否正确。

通过以上步骤,你应该能够在NestJS中成功使用Passport-JS AuthGuard来操作cookies。如果你遇到具体的问题,可以根据错误信息进一步调试和解决。

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

相关·内容

Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0

本文由图雀社区认证作者 布拉德特皮 写作而成 上一篇介绍了如何使用 DTO 和管道对入参进行验证,接下来介绍一下如何用拦截器,实现后台管理系统中最复杂、也最令人头疼 RBAC。...在 RBAC ,权限与角色相关联,用户通过成为适当角色成员而得到这些角色权限。这就极大地简化了权限管理。 2....【角色互斥】:同一用户不能分配到一组互斥角色集合多个角色,互斥角色是指权限互相制约两个角色。案例:财务系统中一个用户不能同时被指派给会计角色和审计员角色。...【运行时互斥】:例如,允许一个用户具有两个角色成员资格,但在运行不可同时激活这两个角色。...请求一下只有管理员才有权限删除操作: ? 涛声依旧。 总结 本篇介绍了 RBAC 概念,以及如何使用拦截器和守卫实现 RBAC 0,原理简单到 15 行代码就搞定了。

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

    身份验证身份认证是大多数应用程序重要组成部分,有很多不同方法和策略来处理身份认证。当前比较流程是JWT 认证,也叫令牌认证,今天我们探讨一下在 Nest.js 如何实现。...我们将使用在 API 请求授权头中提供token标准方法 jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),...3 天 }); return { token };}JWT 认证守卫我们已经实现了 JWT 认证策略及签发,接下来要做就是携带有效 JWT 来保护接口@nestjs/passport 已经内置...在需要鉴权 Controller 控制器中使用:import { Controller, UseGuards } from '@nestjs/common';import { AuthGuard }...from '@nestjs/passport';@Controller('system/user-manage')@UseGuards(AuthGuard('jwt'))export class UserManageController

    17020

    Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?

    本文由图雀社区认证作者 布拉德特皮 写作而成,点击阅读原文查看作者掘金链接,感谢作者优质输出,让我们技术世界变得更加美好前言 上一篇介绍了如何使用寥寥几行代码就实现 RBAC 0,解决了权限管理痛点...上家公司在恒大时候,项目的后端文档使用 Swagger UI 来展示,这是一个遵循 RESTful API 、 可以互动文档,所见即所得。...那么,如何在 Swagger 登录呢?..., Body, UseGuards, UsePipes } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import...,还能看到 DTO 详情: 再点击 try it out 按钮时候,就会自动使用默认参数了: 总结 本篇介绍了如何使用 Swagger 自动生成可互动文档。

    4.6K10

    Nest.js JWT 验证授权管理

    什么是JWT 验证JWT(JSON Web Token)是一种用于在网络应用传输信息开放标准(RFC 7519)。它是一种基于JSON安全令牌,用于在不同系统之间传递声明(claims)。...验证签名:使用事先共享密钥和签名算法对头部和载荷进行签名验证,确保令牌未被篡改。检查有效期:检查载荷声明,例如过期时间(exp)和生效时间(nbf),确保令牌在有效时间范围内。...可选其他验证:根据需要,可能还会验证其他声明,如发行者(iss)、受众(aud)等。一旦JWT通过验证,可以信任其内容,并根据其中声明执行相应操作。...同时,由于JWT本身包含了用户信息,因此在传输过程需要采取适当安全措施,如使用HTTPS来保护通信。.../jwt.key';import { APP_GUARD } from '@nestjs/core';import { AuthGuard } from 'src/guard/auth.guard';@

    91321

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

    设备认证是验证设备身份和合法性过程,该设备试图访问系统或应用程序。当设备身份得到验证后,设备授权便着重于确定它在应用程序可以执行哪些操作。...@nestjs/jwt :这是一个基于 jsonwebtoken 包NestJWT实用程序模块。 device-detector-js :这将解析或检测任何用户代理和浏览器、操作系统、设备等。...typeorm @nestjs/typeorm :由于我们使用PostgreSQL,我们需要它作为我们对象关系模型。 运行我们服务器 运行下面的命令来启动我们服务器。...注意:我们可以通过将 jwt 令牌传递给请求头来使用cookies或会话。但为了简单起见,我们将在请求和响应体之间使用 jwt 令牌。 这些令牌包含了发起这些请求用户有效载荷。...在上面的代码,以下 lines 36 and 37 帮助我们使用从用户获取负载 email 地址来获取用户最后活跃设备,使用我们 redisCacheService 实例 get() 方法

    41721

    BFF与Nestjs实战

    bff和node没有强绑定关系,但让前端人员去熟悉node之外后端语言学习成本太高,所以技术栈上我们使用node作为中间层,nodehttp框架我们使用nestjs。...一些基础知识 使用Nestjs完成一个基本服务需要有Module,Controller,Provider三大部分。...常用模块 通过阅读上文我们了解了跑通一个服务流程和nestjs接口是如何相应数据,但还有很多细节没有讲,比如大量装饰器(@Get,@Req等)使用,下文将为大家讲解Nestjs常用模块 基础功能...Middleware 中间件 Nestjs是对Express二次封装,Nestjs中间件等价于Express中间件,最常用场景就是全局日志、跨域、错误处理、cookie格式化等较为常见...Nestjs小总结 经过上文一系列步骤,我们已经搭建了一个小应用(没有日志和数据源),那么问题来了,前端发起请求后我们实现应用内部是如何一步步处理并且响应数据

    2.7K10

    基于Nest快速构建Web应用

    Contents 1 写在前面 2 依赖 3 目录结构 4 使用 4.1 开始开发 4.2 主要功能 4.3 接口 5 其他 写在前面 最近忙里偷闲,趁着学习Nest功夫,抽离写了一个Nest模块。...这里简单介绍一下什么是Nestjs Nestjs是一个用于构建高效且可伸缩服务端应用程序渐进式 Node.js 框架。...他主要有以下几个特点 完美支持 Typescript 面向 AOP 编程 支持 Typeorm 高并发,异步非阻塞 IO Node.js 版 spring 构建微服务应用 依赖 @nestjs/core...7.5.1 核心包 @nestjs/config 环境变量治理 @nestjs/swagger 生成接口文档 swagger-ui-express 装@nestjs/swagger 必装包 处理接口文档样式...开始开发 复制根目录下default.env文件,重命名为.env文件,修改其配置 yarn start:dev 开始开发 本地新建数据库,Redis,修改.env相关配置 主要配置项 #

    1.6K10

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

    (data, encrypted) * - data 要比较数据, 使用登录时传递过来密码 * - encrypted 要比较数据, 使用从数据库查询出来加密过密码...其实这两种方式结合使用也完全可以。 用户登录 用户登录这块,前面也提到了打算使用两种方式,一种是本地身份验证(用户名&密码),另一种是使用微信扫码登录。先来看一下本地身份验证登录如何实现。...:在授权标头带有Bearer方案查找JWT我们采用是fromAuthHeaderAsBearerToken,后面请求操作演示可以看到,发送请求头中需要带上,这种方案也是现在很多后端比较青睐:...微信扫码登录 到这里本地验证登录就完成了,通过上面的学习,关于登录这块流程相信大家都已经掌握了, 接下来我再分享一下开发过程我是如何实现微信扫码登录。...其一,本地认证登录token没有设置过期时间,这样风险极大; 其二,微信扫码登录access_token是都时效性如何实现在有效期内多次使用,而不是每次扫码都去获取access_token 这两个问题可以结合

    10K30

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

    Json web token (JWT), 是为了在网络应用环境间传递声明而执行一种基于JSON开放标准((RFC 7519).该token被设计为紧凑且安全,特别适用于分布式站点单点登录(SSO...JWT声明一般被用来在身份提供者和服务提供者间传递被认证用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外其它业务逻辑所必须声明信息,该token也可直接被用于认证,也可被加密。...我们都知道,http协议本身是无状态协议,如果在一个系统,我们只有登录后在可以操作,由于http是无状态,所以那就必须每个接口都需要一个认证,来查看当前用户是否有权限。...JwtStrategy], exports: [AuthService], }) export class AuthModule {} 上面这些属于配置,调用我们需要在路由/login里面写逻辑,第2步我们只定义了一个空方法..., Post, Body, Logger, HttpCode, UseGuards, } from '@nestjs/common'; import { AuthGuard } from

    2.9K1311

    NestJS学习总结篇

    默认情况下使用 @nestjs/platform-express 包。 许多用户都可以使用 Express ,并且无需采取任何操作即可启用它。...Get传值或者Post提交数据的话我们可以使用Nestjs装饰器来获取。...导入模块列表,这些模块导出了此模块中所需提供者 exports 由本模块提供并应在其他模块可用提供者子集 // 创建模块 posts nest g module posts Nestjs共享模块...nest g res posts 一键创建以上需要各个模块 配置静态资源 NestJS配置静态资源目录完整代码 npm i @nestjs/platform-express -S import...signed Boolean 表示是否签名cookie,如果设置为true时候表示对这个cookie签名了,这样就需要用res.signedCookies()获取值cookie不是使用res.cookies

    2.3K42

    如何使用我们telnet操作memcached

    Memcached 是一个高性能分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存缓存数据和对象来减少读取数据库次数,从而提高动态、数据库驱动网站速度。...现在网上教程也很多,给大家一个参考案例(如遇到有什么问题,请在下方留言) windows安装 linux安装 我们对memcached进行操作方式主要有三种。 1....使用telnet操作 2.使用php_memcached.dll扩展库 3.直接使用php操作 先给大家介绍第一种,也是最简单一种(操作环境windows)。...第一步,我们打开我们telnet,链接到memcached。我们先开启我们memcached服务。前面的windows安装已经介绍了怎么操作。 ?...安装好后,在执行上面的操作即可,建议使用管理员身份操作dos命令。

    78330

    使用SQL数据操作语言 (DML)

    它是一种声明式语言,因此用户声明他们想要结果,而不是像 C、Java 和 Python 等命令式语言那样声明如何获取结果。它还易于阅读,因为它语法类似于英语。...在本系列第一部分,我分解了用于 SQL 查询语法。在本文中,我将讨论 SQL 数据操作语言 (DML) 解剖结构,正如你所料,它用于操作数据。...定义 DML 元素 数据操作语言是一组用于添加、更新和删除数据 SQL 语句。用于数据操作 SQL 使用 INSERT、UPDATE、DELETE 和 MERGE 语句。...使用 DML 既然你已经熟悉了各种 DML 语句含义,就可以开始使用它们了。你可以使用 GitHub 存储库数据模型来完成这些练习。...INSERT INTO INSERT INTO 语句向表添加行。可以通过使用 VALUES 子句定义一行或多行或通过插入子查询结果来使用它。

    13110

    学习PHPYAML操作扩展使用

    学习PHPYAML操作扩展使用 YAML 这个东西,说实话,自己用得并不多。...在学习自动化测试相关内容时候,接触过使用这种配置文件来配置 Travis CI 持续集成操作,当然,当时也是以学习性质为主。...此外,在测试代码我们加入了中文内容。可以看到直接转换时候中文被编码了。就像 JSON 操作一样,在 YAML 这个扩展函数,我们也可以指定编码格式让中文原样显示。...laravel 这种写法可以看做是 YAML 一种标签格式写法。而这个回调作用就是在遇到类似的这类标签时候,使用什么回调函数来进行处理。比如我们原文档 !...如果是自己使用的话,在 packagist.org 能找到很多组件,而如果是使用 Laravel 的话,它底层使用其实是 symfony 框架 yaml 处理组件。

    2.3K10
    领券