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

身份验证

身份认证是大多数应用程序的重要组成部分,有很多不同的方法和策略来处理身份认证。

当前比较流程的是JWT 认证,也叫令牌认证,今天我们探讨一下在 Nest.js 中如何实现。

认证流程

  1. 客户端将首先使用用户名和密码进行身份认证
  2. 认证成功,服务端会签发一个 JWT 返回给客户端
  3. JWT 在后续请求的授权头中作为 Bearer Token 发送,以实现身份认证

JWT 认证策略

  1. 安装依赖
pnpm add @nestjs/passport passport-jwt @nestjs/jwt
  1. auth 模块中新建 jwt.strategy.ts 文件,用来处理认证流程
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Request } from 'express';
import { ExtractJwt, Strategy } from 'passport-jwt';import { PrismaService } from '@/modules/prisma/prisma.service';@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {constructor(private prisma: PrismaService) {super({// 提供从请求中提取 JWT 的方法。我们将使用在 API 请求的授权头中提供token的标准方法jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),// 为了明确起见,我们选择默认的 false 设置,// 它将确保 JWT 没有过期的责任委托给 Passport 模块。// 这意味着,如果我们的路由提供了一个过期的 JWT ,请求将被拒绝,并发送 401 未经授权的响应。Passport 会自动为我们办理ignoreExpiration: false,// 使用权宜的选项来提供对称的秘密来签署令牌secretOrKey: process.env.JWT_SECRET,passReqToCallback: true,});}async validate(req: Request, payload: Api.Common.TokenPayload) {// 获取当前 tokenconst token = ExtractJwt.fromAuthHeaderAsBearerToken()(req);// 缺少令牌if (!token) {throw new UnauthorizedException('未登录');}const user = await this.prisma.user.findUnique({where: {id: payload.sub,},});if (!user) {throw new UnauthorizedException('token令牌非法,请重新登录');}return payload;}
}
  1. 全局注册
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';import { PrismaModule } from '@/modules/prisma/prisma.module';
import { OperationLogModule } from '@/modules/system-manage/operation-log/operation-log.module';import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { JwtStrategy } from './jwt.strategy';@Module({imports: [PrismaModule,PassportModule.register({ defaultStrategy: 'jwt' }),JwtModule.register({secret: process.env.JWT_SECRET,signOptions: { expiresIn: '15m' }, // 这里设置访问 token 的过期时间}),OperationLogModule,],controllers: [AuthController],providers: [AuthService, JwtStrategy],exports: [AuthService],
})
export class AuthModule { }

JWT 签发

在客户端认证成功后,服务器将签发一个 JWT 返回给客户端

/*** @description: 用户登录*/
async login(params: LoginParamsDto, session: Api.Common.SessionInfo, ip: string) {// 省略认证流程// 生成 tokenconst tokens = await this.generateTokens(user);// 验证成功,返回 tokenreturn responseMessage(tokens);
}/*** @description: 生成 token*/
async generateTokens(userInfo: Api.SystemManage.User) {const payload: Api.Common.TokenPayload = { userName: userInfo.userName, sub: userInfo.id };const token = this.jwtService.sign(payload, {expiresIn: '3d', // 设置访问 token 的过期时间为 3 天});return { token };
}

JWT 认证守卫

我们已经实现了 JWT 的认证策略及签发,接下来要做的就是携带有效的 JWT 来保护接口

@nestjs/passport 中已经内置 AuthGuard 守卫,我们直接用就行。

在需要鉴权的 Controller 控制器中使用:

import { Controller, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';@Controller('system/user-manage')
@UseGuards(AuthGuard('jwt'))
export class UserManageController {}

也许一些接口我们不需要登录就能访问,可以单独给接口绑定守卫

/*** @description: 获取用户信息*/
@UseGuards(AuthGuard('jwt'))
@Get('/getUserInfo')
getUserInfo(@Session() session: Api.Common.SessionInfo) {return this.authService.getUserInfo(session);
}

这样在未登录的情况下访问接口,HttpException 过滤器就会捕获并返回 401 状态码:
在这里插入图片描述

客户端就能根据接口返回的信息处理相应的逻辑。

总结

关注我,我们一起领略 Nest.js 的魅力

Github:nest-server

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397348.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sql与Rce注入相关漏洞复现

目录 sqli-labs注入第38,48关 第38关(单引号闭合) ​编辑 第48关 (GET请求-基于错误-盲注-数字型-order by 排序 ​编辑 贷齐乐系统多处Sql注入漏洞 环境搭建 将贷齐乐源码放入phpstudy中的www目录下 在phpstudy上创建网站&#xff1…

ESP8266与阿里云物联网平台连接

前言 最近折腾项目,需要用到ESP8266模块对接阿里云物联网平台,网上感觉十分完善的教程少了一点点,比较折腾我哈哈哈,所以打算自己写一篇。 材料准备 1、ESP8266 WiFi模块 数据线 网上随便买一个就好,十块钱左右一个…

C# winform 三层架构增删改查,(删除篇)

一.留言 C# wnform 三层架构增删改查,本篇是增删改查是删除篇,也就增删改查外加一个登录更新完,后续考虑出一个增删改查就是不用三层架构,在uI里面 直接写完,并且放一个帮助类,基本十分钟可以写完一套增删…

数据保存--总结

目录 Excel Excel--openpyxl mysql Excel Excel--openpyxl ... mysql

快速幂、矩阵快速幂

乘法快速幂: P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import ja…

【C#】一个项目移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF,解决方法

文章目录 1 问题分析2 本文解决方法 一个项目可以正常运行编译的项目,所有路径均为相对路径。 移动了位置,或者换到其他电脑上,编译报错 Files 的值“IGEF, 1 问题分析 这个错误信息表明在处理文件时,Files 的值出…

(限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!

目录 haproxy七层代理详解一、负载均衡1.1 什么是负载均衡1.2 为什么使用负载均衡1.3 负载均衡类型1.3.1 硬件负载1.3.2 四层负载1.3.3 七层负载1.3.4 四层与七层的区别 二、haproxy介绍2.1 haproxy简介2.2 haproxy特性 三、haproxy详细部署3.1 实验所用的环境3.2 软件安装3.3 …

C语言 | Leetcode C语言题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; int minPatches(int* nums, int numsSize, int n) {int patches 0;long long x 1;int index 0;while (x < n) {if (index < numsSize && nums[index] < x) {x nums[index];index;} else {x << 1;patches;}}retu…

【HarmonyOS NEXT星河版开发学习】小型测试案例06-小红书卡片

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 在鸿蒙&#xff08;HarmonyOS&#xff09;开发中&#xff0c;自适应伸缩是指应用程序能够根据不同设备的屏幕尺寸、分辨率和形态&…

气象大数据案例项目(求各气象站的平均气温)

气象大数据案例项目&#xff08;求各气象站的平均气温&#xff09; 一、项目需求二、数据格式三、项目开发3.1 在windows 进行开发3.2 运行结果3.3 对项目打包 一、项目需求 现在有一份来自美国国家海洋和大气管理局的数据集&#xff0c;里面包含近30年每个气象站、每小时的天…

WSL2 最新最全帮助小白一步步详细安装教程

文章目录 一、前言1.1、什么是 WSL &#xff1f;1.2、WSL2 相比传统虚拟机的优势1.3、微软官方 二、安装步骤*2.1、启用 WSL 功能2.2、重启电脑2.3、dos命令自动安装 (一行命令搞定&#xff0c;非常方便)2.3.1、通过 cmd 打开 dos 命令行 或者 WIN键 R&#xff1a;2.3.2、输入…

探案录 | 在线打补丁,运维更轻松

清晨&#xff0c;曙光温柔地洒落在福尔摩斯K那标志性的书房内&#xff0c;福尔摩斯K坐在他那张熟悉的扶手椅上&#xff0c;眼神锐利如鹰&#xff0c;正沉浸在思考的海洋中。门突然被推开&#xff0c;华生K带着一丝急切步入室内。 “福尔摩斯K&#xff0c;这次案件非同小可&…

如何在线观看汤姆克鲁斯、比莉艾利什、红辣椒乐队、HER等明星的奥运闭幕式

2024 年巴黎奥运会将以一系列众星云集的表演者为结尾&#xff0c;他们将帮助将奥运会移交给洛杉矶——以下是在线直播盛大决赛的时间和地点。 经过两周多令人惊叹的田径运动、激烈的比赛和表情包活动后&#xff0c;2024 年巴黎奥运会即将落下帷幕。 奥运会闭幕式将于 8 月 12 …

【C++】 特殊类设计:从构思到实现,引领设计新潮流

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f680; 前言 一&#xff1a; &#x1f525; 不能被拷贝的类 二&#xff1a; &#x1f525; 只能在堆上创建对象的类 三&#xff1a; &#x1f525; 只能在栈上创建对象的…

uniapp使用echarts在H5上显示报错问题的解决方法

前言 在做uniapp vue3开发的echarts图表的时候&#xff0c;发现在浏览器上面正常运行&#xff0c;但在微信开发者工具上显示报错了&#xff0c;报错如下 原因&#xff1a;在微信小程序中&#xff0c;使用document.getElementById会报错&#xff0c;因为小程序的运行环境是基于…

目前最强的文生图模型?!FLUX完全解读!附体验地址

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…

python网络爬虫使用代理

Python网络爬虫使用代理的实用指南 在网络爬虫的开发过程中&#xff0c;使用代理是一个非常重要的环节。代理不仅可以帮助爬虫绕过反爬虫机制&#xff0c;还能保护开发者的隐私。本文将介绍如何在Python中使用代理进行网络爬虫&#xff0c;包括基本的设置和示例代码。 1. 代理…

WordPress多用途电子商务博客新闻主题betheme 21.5.6版本

简介&#xff1a; WordPress多用途电子商务博客新闻主题betheme 21.5.6版本 自带500多套模板 BeTheme第一次发布于2014年5月21日&#xff0c;自那时以来&#xff0c;已有数以百万计的人下载了BeTheme&#xff0c;其评分为4.8。 这个主题是WooCommerce支持的&#xff0c;在此…

Git代码管理规范

1. 简介 git 分支分为集成分支、功能分支和修复分支&#xff0c;分别命名为 develop、feature 和 hotfix&#xff0c;均为单数。不可使用 features、future、hotfixes、hotfixs 等错误名称。 master&#xff08;主分支&#xff0c;永远是可用的稳定版本&#xff0c;不能直接在…