成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼

瀏覽:120日期:2022-06-09 18:32:05
目錄
  • 實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄
  • 前置條件
    • 安裝
    • Module
    • service
  • 如何生成圖形驗(yàn)證碼
    • 如何使用 session
  • 接入 mongose

    實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄

    效果圖

    前置條件

    學(xué)習(xí)一下 nest

    安裝

    新建項(xiàng)目

     npm i -g @nestjs/cli nest new project-name npm run start:dev //啟動(dòng)服務(wù)

    目錄結(jié)構(gòu)

    controllers

    負(fù)責(zé)處理傳入的請求并將響應(yīng)返回給客戶端。(定義路由等)

    import { Controller, Get } from "@nestjs/common";@Controller()export class AppController {  constructor() {}  @Get()  getHello(): string {    return "hello world";  }}

    controllers 常用裝飾器

    常用裝飾器

    @Controller(path)@Get(path)@Post(path)@Request(), @Req()@Response(), @Res()@Session()@Param(key?: string)@Body(key?: string)@Query(key?: string)@Headers(name?: string)定義 root 路徑定義 get 請求和路徑定義 post 請求和路徑請求體(req)響應(yīng)體(res)session獲取 req.params 參數(shù)獲取 req.body 參數(shù)獲取 req.query 參數(shù)獲取 req.headers 參數(shù)

    Module

    @Global()@Module({  providers: [MyService],  exports: [MyService],})export class AppModule {}
    • providers 屬性用來聲明模塊所提供的依賴注入 (DI) 提供者,它們將在整個(gè)模塊中共享。
    • exports 屬性用于導(dǎo)出模塊中的提供者以供其他模塊使用。
    • global 標(biāo)識符用于創(chuàng)建一個(gè)全局模塊。在任何地方都可以使用 @Inject() 裝飾器來注入其提供者。
    • imports 選項(xiàng)用于引入其他模塊中提供的依賴關(guān)系。

    service

    import { Injectable } from "@nestjs/common";@Injectable()export class AppService {  getHello(): string {    return "Hello World!";  }}

    業(yè)務(wù)邏輯具體實(shí)現(xiàn)

    如何生成圖形驗(yàn)證碼

    需要用到 svg-captcha 這個(gè)庫

    npm i svg-captcha

    nest 命令行創(chuàng)建一個(gè) captcha 模塊nest g res captchanest 命令行:

    import { Controller, Get, Response, Session } from "@nestjs/common";import * as svgCaptcha from "svg-captcha";@Controller("captcha")export class CaptchaController {  @Get()  async getCaptcha(@Response() res, @Session() session) {    const captcha = svgCaptcha.create({      size: 4,      noise: 2,    });    session.captcha = captcha.text;    res.type("svg");    res.send(captcha.data);  }}

    通過 session 將當(dāng)前會話的 captcha 存起來此時(shí)能通過:http://localhost:3000/captcha查看到效果圖

    如何使用 session

    npm i express-sessionnpm i -D @types/express-session

    并且再 main.ts 中引入

    import * as session from "express-session";// somewhere in your initialization fileapp.use(  session({    secret: "my-secret",    resave: false,    saveUninitialized: false,  }),);

    接入 mongose

    在本機(jī)下載 mogodb mogodb 官網(wǎng)下載

    安裝 mongoose

    npm install --save mongoose

    在 app.modele 中引入

    import { Module } from "@nestjs/common";import { MongooseModule } from "@nestjs/mongoose";import { AppController } from "./app.controller";import { AppService } from "./app.service";@Module({  imports: [MongooseModule.forRoot("mongodb://127.0.0.1:27017/nest")],  controllers: [AppController],  providers: [AppService],})export class AppModule {}

    創(chuàng)建 schemas

    import { Document } from "mongoose";import * as mongoose from "mongoose";export interface User {  account: string;  password: string;}export interface UserDoc extends User, Document {}export const UserSchema = new mongoose.Schema({  password: { type: String, required: true },  account: {    type: String,    required: true,    unique: true,  },});export const UserModel = mongoose.model<UserDoc>("User", UserSchema);

    創(chuàng)建 auth 模塊

    nest g res auth

    實(shí)現(xiàn)注冊和登錄方法controller

    import {  Controller,  Get,  Body,  Post,  UseInterceptors,  Req,  Request,  Res,} from "@nestjs/common";import { AuthService } from "./auth.service";import { CreateUserDto } from "./dto/index";import { ApiCreatedResponse } from "@nestjs/swagger";import { CaptchaMiddleware } from "src/middleware/captcha-middleware/captcha-middleware.middleware";@Controller("auth")export class AuthController {  constructor(private readonly authService: AuthService) {}  @ApiCreatedResponse({    description: "The record has been successfully created.",    type: CreateUserDto,  })  @Post("register")  async created(@Body() data: CreateUserDto) {    const user = await this.authService.created(data);    return user;  }  @UseInterceptors(CaptchaMiddleware)  @Post("login")  async login(    @Body() data: CreateUserDto,    @Req() request: Request,    @Res() res,  ) {    const user = await this.authService.login(data, request);    res.sendResponse(user);  }}

    引入uuid 生成隨機(jī)數(shù)和userId做鍵值對映射,為單點(diǎn)登錄打下基礎(chǔ)。

    引入jwt 生成token進(jìn)行校驗(yàn)。

    import { Injectable, UnauthorizedException } from "@nestjs/common";import { JwtService } from "@nestjs/jwt";import mongoose, { Model } from "mongoose";import { InjectModel } from "@nestjs/mongoose";import { UserDoc } from "../schemas/user.schema";import { loginMapDoc } from "../schemas/login.mapping";import { CreateUserDto } from "./dto/index";import { v4 as uuid } from "uuid";@Injectable()export class AuthService {  constructor(    private jwtService: JwtService,    @InjectModel("user") private readonly userModel: Model<UserDoc>,    @InjectModel("loginmapModel")    private readonly loginmapModel: Model<loginMapDoc>,  ) {}  async created(data: CreateUserDto) {    const user = await new this.userModel(data);    return user.save();  }  async login(data: any, req) {    const { account, password, code } = data;    if (code.toLocaleLowerCase() !== req.session?.captcha.toLocaleLowerCase()) {      return {code: 400,message: "驗(yàn)證碼錯(cuò)誤",      };    }    const user = await this.userModel.findOne({      account,      password,    });    if (!user) {      throw new UnauthorizedException();    }    const loginId = uuid();    const payload = {      userId: user.id,      username: user.account,      loginId: loginId,    };    const token = this.jwtService.sign(payload);    const foundCollection = await mongoose.connection.collections[      "loginmapModel"    ];    if (!foundCollection) {      // 如果該 collection 不存在,則創(chuàng)建它      await new this.loginmapModel();      console.log("新建成功");    }    await this.loginmapModel.findOneAndUpdate(      { userId: user.id },      { userId: user.id, loginId },      { upsert: true, new: true, runValidators: true },    );    return { token, loginId };  }  async viladate(data: any) {    const { userId, loginId } = data;    const map = await this.loginmapModel.findOne({ userId, loginId });    return loginId == map.loginId;  }}

    最后創(chuàng)建一個(gè)guard,對用戶是否登錄進(jìn)行攔截判斷

    nest g gu middleware/auth
    import {  CanActivate,  ExecutionContext,  Injectable,  Request,  UnauthorizedException,} from "@nestjs/common";import { Reflector } from "@nestjs/core";import { JwtService } from "@nestjs/jwt";import { jwtConstants } from "@/auth/constants";import { AuthService } from "@/auth/auth.service";@Injectable()export class AuthGuardGuard implements CanActivate {  constructor(    private jwtService: JwtService,    private reflector: Reflector,    private authService: AuthService,  ) {}  async canActivate(context: ExecutionContext): Promise<boolean> {    const skipAuth = this.reflector.get<boolean>(      "skipAuth",      context.getHandler(),    ); // 返回 Boolean 值或 undefined,即是否跳過校驗(yàn)    if (skipAuth) {      return true;    }    const request: Request = context.switchToHttp().getRequest();    const token = this.extractTokenFromHeader(request);    if (!token) {      throw new UnauthorizedException();    }    try {      const payload = await this.jwtService.verifyAsync(token, {secret: jwtConstants.secret,      });      const isRemoteLogin = await this.authService.viladate(payload);      console.log(isRemoteLogin, "payload", payload);      if (!isRemoteLogin) {throw new UnauthorizedException("異地登錄");      }      // 
    標(biāo)簽: JavaScript
    成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
    狂野欧美性猛交blacked| 伊人一区二区三区| 91精品国产综合久久久久| 国产调教视频一区| 日韩激情av在线| 国内精品嫩模av私拍在线观看| 老色鬼久久亚洲一区二区| 日本一区二区三区国色天香| 久久精品国产99| 久久www免费人成看片高清| 伊人精品在线| 精品av久久707| 久久精品国产一区二区三| 不卡的av中国片| 欧美日韩国产成人在线免费| 亚洲一区二区不卡免费| 色综合久久综合| 欧美美女网站色| 亚洲成人综合网站| 亚洲二区免费| 国产欧美一区二区精品性色超碰 | 欧美区视频在线观看| 亚洲黄色性网站| 欧美日韩蜜桃| 2020日本不卡一区二区视频| 国产在线播放一区三区四| 香蕉精品999视频一区二区| 精品精品国产高清一毛片一天堂| 美国十次了思思久久精品导航| 亚洲少妇自拍| 国产精品国产自产拍在线| 成人免费看的视频| 欧美日韩视频第一区| 偷窥国产亚洲免费视频| 亚洲精品美女91| 国产精品久久精品日日| 99国产精品久久久久久久久久 | 欧美三级日韩在线| 性做久久久久久久久| 国产日韩在线一区二区三区| 中文字幕日本乱码精品影院| 欧美99在线视频观看| 日韩精品中午字幕| 国产精品自在在线| 欧美性猛交xxxxxxxx| 五月天网站亚洲| 国产欧美亚洲日本| 亚洲色图欧美激情| 欧美成人一品| 久久精品在线观看| 99精品一区二区| 欧美一区二区久久| 国产精品中文欧美| 这里只有精品免费| 国产一区二区三区香蕉| 欧美日韩国产另类不卡| 另类人妖一区二区av| 久久精品中文| 丝袜诱惑制服诱惑色一区在线观看| 国产精品毛片va一区二区三区| 亚洲欧美日韩国产一区二区三区| 欧美一区在线看| 日韩欧美的一区| 波多野结衣中文字幕一区二区三区| 日韩美女一区二区三区四区| 国产精品99久| 3d动漫精品啪啪一区二区竹菊| 国产一区二区免费看| 欧美一区二区免费视频| 成人av综合在线| 精品国产免费视频| 99久久免费精品高清特色大片| 精品奇米国产一区二区三区| 99久久精品国产观看| 国产蜜臀97一区二区三区 | 欧美mv和日韩mv的网站| 成人深夜福利app| 日韩欧美一区二区视频| 成人一区二区三区在线观看| 欧美一级日韩不卡播放免费| 国产一区二区三区在线观看精品| 日韩片之四级片| av电影在线观看完整版一区二区| 久久久久久久综合日本| 午夜精品一区二区三区四区| 中文字幕在线一区二区三区| 国产欧美一区二区视频| 午夜精品久久久久久久99水蜜桃| 先锋影音国产一区| 另类中文字幕网| 日韩女优av电影| 欧美日本不卡| 夜夜操天天操亚洲| 91久久精品日日躁夜夜躁欧美| 久久国产欧美日韩精品| 日韩欧美你懂的| 欧美精品麻豆| 一区二区成人在线| 欧美丝袜丝交足nylons图片| 另类成人小视频在线| 欧美成人一区二区三区| 色综合天天性综合| 一区二区高清在线| 欧美精品乱人伦久久久久久| www.日韩在线| 亚洲黄色av一区| 久久免费99精品久久久久久| 看国产成人h片视频| 欧美一区二区三区婷婷月色 | 久久亚洲精精品中文字幕早川悠里| 激情久久婷婷| 午夜视黄欧洲亚洲| 日韩一区二区三区免费看| 欧美日韩国产免费观看| 亚洲精品成a人| 欧美日韩高清一区| 91在线国产观看| 亚洲高清免费视频| 日韩一区二区三区视频| 亚洲第一网站| 久久爱www久久做| 日韩精品在线网站| 伊人成年综合电影网| 五月婷婷激情综合| 国产精品拍天天在线| 久久综合九色| 99re免费视频精品全部| 亚洲尤物在线视频观看| 欧美日韩国产综合草草| 欧美日韩一区二区三区四区在线观看| 丝袜美腿亚洲一区二区图片| 欧美精选在线播放| 亚洲第一黄网| 国产69精品久久99不卡| 亚洲视频综合在线| 7878成人国产在线观看| 欧美精品二区| 蜜桃视频在线一区| 久久久国际精品| 色婷婷综合久久久中文一区二区| 91蜜桃网址入口| 青椒成人免费视频| 国产欧美一区二区精品忘忧草 | 综合分类小说区另类春色亚洲小说欧美| 亚洲中字在线| 国产精品一级片| 日韩va欧美va亚洲va久久| 国产日韩av一区| 欧美午夜一区二区三区| 午夜欧美精品久久久久久久| 人人精品人人爱| 自拍偷在线精品自拍偷无码专区 | 欧美日韩精品免费观看视频完整| 蜜桃av一区二区三区| 国产精品久久久久久久久久久免费看 | 欧美日韩亚洲综合在线| 国模精品娜娜一二三区| 国内精品伊人久久久久av一坑| 一区二区三区在线看| 精品国产青草久久久久福利| 色8久久人人97超碰香蕉987| 欧美色图麻豆| 国产黄色91视频| 首页国产欧美日韩丝袜| 欧美激情自拍偷拍| 欧美精品色综合| 99成人在线| 一区二区三区影院| 久久丝袜美腿综合| 在线视频国产一区| 亚洲日本欧美在线| 99精品视频免费在线观看| 秋霞国产午夜精品免费视频| 国产精品久久久久久久久免费丝袜| 在线成人av网站| 久久av一区| 中文日韩在线| 欧美精品97| 波多野结衣亚洲| 久久91精品国产91久久小草| 亚洲欧美偷拍三级| 久久综合丝袜日本网| 欧美色中文字幕| 国产日韩欧美一区在线| 国内视频一区| 色综合天天在线| 99精品国产热久久91蜜凸| 国产91丝袜在线观看| 精品一二三四区| 奇米综合一区二区三区精品视频| 亚洲综合小说图片| 日韩毛片精品高清免费| 国产午夜亚洲精品羞羞网站| 日韩欧美亚洲国产另类| 欧美午夜片在线观看| 久久精品一本| 亚洲欧洲三级| 午夜精品亚洲一区二区三区嫩草| 成人av免费在线播放| 人人精品人人爱|