前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Nest教程】Nest项目集成JWT接口认证

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

作者头像
青年码农
发布于 2021-02-03 03:14:56
发布于 2021-02-03 03:14:56
3K00
代码可运行
举报
文章被收录于专栏:青年码农青年码农
运行总次数:0
代码可运行

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

我们都知道,http协议本身是无状态的协议,如果在一个系统中,我们只有登录后在可以操作,由于http是无状态的,所以那就必须每个接口都需要一个认证,来查看当前用户是否有权限。今天我们就基于之前的项目,集成JWT。

1 user.service方法

增加一个查询单个用户的方法,这个方法不需要对应控制器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async findOne(name: string): Promise<any | undefined> {
  const user = await this.UserRepository.findOne({
    where: {
      name: name,
    },
  });
  if (user == undefined) {
    return void 0;
  } else {
    return user;
  }
}

2 增加登录路由

在user.controller文件中新增路由,里面的逻辑暂时什么都不写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Post('/login')
  async login(@Body() loginParmas: any) {}

3 安装依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 yarn add passport passport-jwt passport-local @nestjs/passport @nestjs/jwt -S

4 创建Auth模块

src下新建文件夹logical/auth,auth目录下为我们逻辑功能。

constants.ts - 常量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const jwtConstants = {
  secret: 'NestAPI',
};

jwt.strategy.ts - 验证策略

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: jwtConstants.secret,
    });
  }

  // JWT验证 - Step 4: 被守卫调用
  async validate(payload: any) {
    return {
      id: payload.id,
      name: payload.name,
      nickname: payload.nickname,
    };
  }
}

auth.service.ts - 验证逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Injectable, Inject } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UserService } from '../../user/user.service';
import { encryptPassword } from '../../utils/cryptogram';

@Injectable()
export class AuthService {
  constructor(
    @Inject('UserService') private readonly usersService: UserService,
    private readonly jwtService: JwtService,
  ) {}

  // JWT验证 - Step 2: 校验用户信息
  async validateUser(name: string, password: string): Promise<any> {
    const user = await this.usersService.findOne(name);
    if (user) {
      const hashedPassword = user.password;
      const salt = user.passwdSalt;
      // 通过密码盐,加密传参,再与数据库里的比较,判断是否相等
      const hashPassword = encryptPassword(password, salt);
      if (hashedPassword === hashPassword) {
        // 密码正确
        return {
          code: 1,
          user,
        };
      } else {
        // 密码错误
        return {
          code: 2,
          user: null,
        };
      }
    }
    // 查无此人
    return {
      code: 3,
      user: null,
    };
  }

  // JWT验证 - Step 3: 处理 jwt 签证
  async certificate(user: any) {
    const payload = {
      id: user.id,
      name: user.name,
      nickname: user.nickname,
    };
    try {
      const token = this.jwtService.sign(payload);
      return {
        code: 200,
        data: {
          token,
        },
        msg: `登录成功`,
      };
    } catch (error) {
      return {
        code: 600,
        msg: `账号或密码错误`,
      };
    }
  }
}

auth.module.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { JwtStrategy } from './jwt.strategy';
import { UserModule } from '../../user/user.module';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { jwtConstants } from './constants';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: jwtConstants.secret,
      signOptions: { expiresIn: '8h' }, // token 过期时效
    }),
    UserModule,
  ],
  providers: [AuthService, JwtStrategy],
  exports: [AuthService],
})
export class AuthModule {}

上面这些属于配置,调用我们需要在路由/login里面写逻辑,第2步中我们只定义了一个空的方法,我们接下来写逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ApiTags, ApiParam, ApiQuery, ApiHeader } from '@nestjs/swagger';
import {
  Controller,
  Post,
  Body,
  Logger,
  HttpCode,
  UseGuards,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { AuthService } from '../logical/auth/auth.service';
import { UserService } from './user.service';

@ApiTags('用户管理')
@Controller('user')
export class UserController {
  constructor(
    private readonly authService: AuthService,
    private readonly userService: UserService,
  ) {}

  /**
   * 用户登录
   */
  @Post('/login')
  async login(@Body() loginParmas: any) {
    const authResult = await this.authService.validateUser(
      loginParmas.name,
      loginParmas.password,
    );
    switch (authResult.code) {
      case 1:
        return this.authService.certificate(authResult.user);
      case 2:
        return {
          code: 600,
          msg: `账号或密码不正确`,
        };
      default:
        return {
          code: 600,
          msg: `当前用户未查到`,
        };
    }
  }
}

5 测试

运行项目,我们用postman测试

登录成功,返回token。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 青年码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nest.js 从零到壹系列(三):使用 JWT 实现单点登录
上一篇介绍了如何使用 Sequelize 连接 MySQL,接下来,在原来代码的基础上进行扩展,实现用户的注册和登录功能。
一只图雀
2020/04/07
5.5K0
Nest.js JWT 验证授权管理
JWT(JSON Web Token)是一种用于在网络应用中传输信息的开放标准(RFC 7519)。它是一种基于JSON的安全令牌,用于在不同系统之间传递声明(claims)。JWT通常用于身份验证和授权机制。
程序员海军
2023/11/01
9860
Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权
当前比较流程的是JWT 认证,也叫令牌认证,今天我们探讨一下在 Nest.js 中如何实现。
白雾茫茫丶
2024/08/07
2560
Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权
Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 的恐惧
你是否曾经为了验证参数,写了一大堆 if - else ?然后还要判断各种参数类型?相似的结构在不同的方法里判断,却又要复制一遍代码?
五月君
2021/07/15
4.1K0
Nest.js 实战系列四:使用管道、DTO 验证入参,摆脱 if-else 的恐惧
Nest.js 从零到壹系列(八):使用 Redis 实现登录挤出功能
上一篇介绍了如何配合 Swagger UI 解决写文档这个痛点,这篇将介绍如何利用 Redis 解决 JWT 登录认证的另一个痛点:同账号的登录挤出问题。(再不更新,读者就要寄刀片了 -_-||)
一只图雀
2020/07/28
2.5K0
Nest.js 从零到壹系列(八):使用 Redis 实现登录挤出功能
Nest.js进阶系列四:Node.js中使用Redis原来这么简单!
JWT token 实现方式, 将基本信息直接放在token中,以便于分布式系统使用, 但是我们没有设置有限期(这个是可以实现的),并且服务端无法主动让token失效。而Redis天然支持过期时间,也能实现让服务端主动使token过期。
江涛学编程
2023/05/27
2.6K0
Nest.js进阶系列四:Node.js中使用Redis原来这么简单!
Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?
上一篇介绍了如何使用寥寥几行代码就实现 RBAC 0,解决了权限管理的痛点,这篇将解决另一个痛点:写文档。
一只图雀
2020/04/17
4.7K0
Nest.js 从零到壹系列(七):讨厌写文档,Swagger UI 了解一下?
Nest.js 实战系列第二篇-实现注册、扫码登陆、jwt认证等
大家好我是考拉🐨,这是 Nest.js 实战系列第二篇,我要用最真实的场景让你学会使用 Node 主流框架。 上一篇中 【Nest.js入门之基本项目搭建】 带大家入门了Nest.js, 接下来在之前的代码上继续进行开发, 主要两个任务:实现用户的注册与登录。 在实现登录注册之前,需要先整理一下需求, 我们希望用户有两种方式可以登录进入网站来写文章, 一种是账号密码登录,另一种是微信扫码登录。文章内容大纲 接着上章内容开始... 前面我们创建文件都是一个个创建的, 其实还有一个快速创建Contoller
coder_koala
2021/12/13
10.2K0
Nest.js 实战系列第二篇-实现注册、扫码登陆、jwt认证等
Nest.js 从零到壹系列(五):使用管道、DTO 验证入参,摆脱 if-else 的恐惧
上一篇介绍了如何使用中间件、拦截器、过滤器打造日志系统,接下来将介绍后端永远绕不过去的痛:参数验证。
一只图雀
2020/04/07
4.1K0
【Nest教程】实现一个简单的用户增删改查功能
前面几章我们讲了项目的初始,连接MySQL,这章我们主要实现增删改查接口,在src下新建user文件夹,我们的所有功能都写在这个文件夹下。
青年码农
2021/02/03
2.1K0
【Nest教程】实现一个简单的用户增删改查功能
10分钟上手nest.js+mongoDB
项目中我们会用到 Mongoose 来操作我们的数据库,Nest 官方为我们提供了一个 Mongoose 的封装,我们需要安装 mongoose 和 @nestjs/mongoose:
淼学派对
2024/04/10
3690
JWT 登录认证
✨ Token 认证流程 作为目前最流行的跨域认证解决方案,JWT(JSON Web Token) 深受开发者的喜爱,主要流程如下: 客户端发送账号和密码请求登录 服务端收到请求,验证账号密码是否通过 验证成功后,服务端会生成唯一的 token,并将其返回给客户端 客户端接受到 token,将其存储在 cookie 或者 localStroge 中 之后每一次客户端向服务端发送请求,都会通过 cookie 或者header 携带该 token 服务端验证 token 的有效性,通过才返回响应的数据 图片 ✨
江户川码农
2022/07/04
4.5K3
JWT 登录认证
cache-manager、ioredis配合使用方案(nestjs )
Jacky-易小天
2024/09/13
2740
cache-manager、ioredis配合使用方案(nestjs )
Nest.js 从零到壹系列(六):用 15 行代码实现 RBAC 0
上一篇介绍了如何使用 DTO 和管道对入参进行验证,接下来介绍一下如何用拦截器,实现后台管理系统中最复杂、也最令人头疼的 RBAC。
一只图雀
2020/04/07
3.5K0
实战模拟│JWT 登录认证「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170852.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
1.6K0
实战模拟│JWT 登录认证「建议收藏」
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
在 Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之前对数据进行转换、验证、清理或执行其他预处理任务。这使得 Nest.js 应用更加健壮、可维护和一致。
白雾茫茫丶
2024/07/22
2240
Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换
手把手,带你从零封装Gin框架(七):实现登录接口 & jwt 鉴权中间件
这一篇将使用 jwt-go[1] 包来完成登录接口,颁发 token 令牌,并编写 jwt 中间件对 token 统一鉴权,避免在各个 controller 重复编写鉴权逻辑
用户10002156
2024/01/17
3.2K0
手把手,带你从零封装Gin框架(七):实现登录接口 & jwt 鉴权中间件
如何使用 NestJs、PostgreSQL、Redis 构建基于用户设备的授权验证
设备认证和授权在确保Web应用程序安全方面起着至关重要的作用。它们是维护敏感数据、用户账户和应用程序整体完整性的综合安全策略的重要组成部分。
前端达人
2023/11/13
4820
如何使用 NestJs、PostgreSQL、Redis 构建基于用户设备的授权验证
SpringBoot实现微信小程序登录的完整例子
根据流程图描述,主要步骤有以下几步 1、小程序端调用 wx.login()向微信接口服务获取 临时登录凭证code ,并上传至开发者服务端。 2、开发者服务端向微信服务接口服务调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 3、开发者服务端根据session_key等信息,基于JWT标准,生成自定义的网络令牌token,返回至小程序端存储。
智慧zhuhuix
2020/08/14
8.5K2
SpringBoot实现微信小程序登录的完整例子
基于 Axios 封装一个完美的双 token 无感刷新
用户登录之后,会返回一个用户的标识,之后带上这个标识请求别的接口,就能识别出该用户。
神说要有光zxg
2023/08/28
1.5K0
基于 Axios 封装一个完美的双  token 无感刷新
推荐阅读
相关推荐
Nest.js 从零到壹系列(三):使用 JWT 实现单点登录
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验