开发布景

在前面两天的文章中,介绍了一下注册功用,这儿来回忆一下。

需求后端两个接口:

  • 获取邮箱验证码(参数:邮箱验证码类型)
  • 注册(参数:邮箱验证码暗码)

主要流程是:

  1. 用户点击获取验证码按钮(自界说指令v-countdown)调用获取验证码接口
  2. 后端调用封装的Email类发送验证码
  3. 用户收到验证码
  4. 调用注册接口
  5. 后端先校验除验证码外的其他参数
  6. 校验无问题调用Redis类读取获取到的验证码
  7. 开端校验验证码
  8. 验证码校验无问题调用实体的save方法将用户信息保存到用户表
  9. 调用Redis类手动删去该验证码
  10. 反馈给用户注册成功

回忆完注册流程之后,这篇文章来聊一聊登录流程。

登录仅需求一个接口,该接口接收两个参数,邮箱暗码,成功之后给前端回来token信息。本篇内容不讲接口的实现,要点放在Jwt生成与校验token

开端开发

Jwt介绍

一个 JWT 实际上便是一个字符串,它由三部分组成,头部载荷签名。前两部分需求经过 Base64 编码,后一部分经过前两部分 Base64 编码后再加密而成,是前后端分离之后比较通用的一种鉴权计划。

装置依靠

这儿我运用的是NestJS开发的后端服务,就来装置nestjs对应的jwt插件。

npm i @nestjs/jwt @nestjs/passport passport-jwt

装备文件

这儿咱们有一个装备文件,假设是src/config/index.ts

export default {
  // ...
  JwtConfig: {
    secret: 'webxue',
    signOptions: { expiresIn: '60s' },
  },
}

这个装备文件导出了Jwt的装备信息JwtConfig,其间secret指的是一个字符串,用来进行token的加密,singnOptions是个目标,expiresIn指的是token过期时间。

注入Jwt

需求将jwt注入到咱们的modules中,这儿我是在api.module.ts中注入。

import { JwtModule } from '@nestjs/jwt';
import { JwtConfig } from 'src/config';
@Module({
  // 在这儿引进
  imports: [JwtModule.register(JwtConfig)],
  // ...
})
export class ApiModule {}

然后在src/common/strategy界说Jwt战略jwt.strategy.ts

import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from "passport-jwt";
import { JWT_CONFIG } from "src/config";
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      // 别离传入这些参数
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: JWT_CONFIG.secret,
    });
  }
  // token校验成功,会走到这儿,否则会直接走401
  async validate(payload: any) {
    return payload;
  }
}

然后将战略注入到api.module.ts中:

import { JwtStrategy } from "src/common/strategy/jwt.strategy";
// ...
@Module({
  imports: [JwtModule.register(JWT_CONFIG)],
  providers: [
    // ...
    JwtStrategy,
  ],
})

生成token

在咱们的登录service内界说jwtService

import { JwtService } from "@nestjs/jwt";
@Injectable()
export class AuthService extends BaseService {
  constructor(
    // 界说jwtService
    private jwtService: JwtService,
  ) {
    super();
  }

最终在登录接口内根据用户传入的emailpassword,与数据库中的数据进行对比,假如校验成功了,则经过下述代码就可以生成token了:

const token = this.jwtService.sign(userInfo);

结语

我本是一名前端程序员,但不甘于前端,最开端学习nodejs时运用的express,虽然以前运用jsonwebtoken插件做过生成校验token,但经过nestjs是第一次实现,假如哪里有什么不稳当的当地,还请大家谈论指正,有讨论才有前进。最终,感谢大家能看到此处!