日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

nestjs實現圖形校驗和單點登錄的示例代碼

瀏覽:154日期:2022-06-09 18:32:05
目錄
  • 實現圖形校驗和單點登錄
  • 前置條件
    • 安裝
    • Module
    • service
  • 如何生成圖形驗證碼
    • 如何使用 session
  • 接入 mongose

    實現圖形校驗和單點登錄

    效果圖

    前置條件

    學習一下 nest

    安裝

    新建項目

     npm i -g @nestjs/cli nest new project-name npm run start:dev //啟動服務

    目錄結構

    controllers

    負責處理傳入的請求并將響應返回給客戶端。(定義路由等)

    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)響應體(res)session獲取 req.params 參數獲取 req.body 參數獲取 req.query 參數獲取 req.headers 參數

    Module

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

    service

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

    業務邏輯具體實現

    如何生成圖形驗證碼

    需要用到 svg-captcha 這個庫

    npm i svg-captcha

    nest 命令行創建一個 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 將當前會話的 captcha 存起來此時能通過: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

    在本機下載 mogodb mogodb 官網下載

    安裝 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 {}

    創建 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);

    創建 auth 模塊

    nest g res auth

    實現注冊和登錄方法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 生成隨機數和userId做鍵值對映射,為單點登錄打下基礎。

    引入jwt 生成token進行校驗。

    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: "驗證碼錯誤",      };    }    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 不存在,則創建它      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;  }}

    最后創建一個guard,對用戶是否登錄進行攔截判斷

    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,即是否跳過校驗    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("異地登錄");      }      // 
    標簽: JavaScript
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    久久午夜精品一区二区| 国产免费成人| 蜜桃视频一区二区三区| 日韩中文字幕一区二区三区| 一区二区精品| 福利一区二区| 精品欧美一区二区三区在线观看| 91超碰国产精品| 高清日韩中文字幕| 日本国产亚洲| 亚洲天堂成人| 国产va免费精品观看精品视频| 国产亚洲一区在线| 欧美激情另类| 久久精品九色| 国产精品黄网站| 亚洲精品成人一区| 五月天综合网站| 久久国产亚洲精品| 欧美日韩视频免费看| av一区二区高清| 亚洲欧美在线专区| а√在线中文在线新版| 日本国产欧美| 亚洲免费毛片| 亚洲开心激情| 先锋影音国产一区| 亚洲精品a级片| 91精品蜜臀一区二区三区在线 | 五月天久久网站| 日韩欧美字幕| 久久福利毛片| 日本不卡视频在线观看| 青青草91久久久久久久久| 97久久亚洲| 91亚洲自偷观看高清| 欧美天堂一区二区| 麻豆成人在线观看| 亚洲不卡av不卡一区二区| 国产一区亚洲| 亚洲一区二区成人| 亚洲免费专区| 国产一区二区三区四区五区传媒| 亚洲综合电影| 蜜桃视频一区二区三区在线观看| 久久成人av| 欧美日韩91| 超级白嫩亚洲国产第一| 久久久久欧美精品| 日韩中文字幕亚洲一区二区va在线 | 免费精品视频| 国产精品亚洲综合色区韩国| 精品日韩一区| 午夜精品影院| 精品一区二区三区视频在线播放| 婷婷中文字幕一区| 国产精品传媒麻豆hd| 欧美二区视频| 欧美日韩一视频区二区| av在线最新| 亚洲香蕉视频| 99成人在线| 99久久视频| 国产精品久久久久久久久妇女| 伊人久久一区| 午夜在线视频观看日韩17c| 欧美激情另类| 老司机免费视频一区二区三区| 日韩亚洲精品在线| 亚洲性图久久| 欧美gv在线| 色乱码一区二区三区网站| 国产精品地址| 国产精品免费99久久久| 日韩欧美自拍| 国产精品三级| 日本精品在线播放| 亚洲97av| 日本一区福利在线| 欧美日韩国产一区精品一区| 亚洲伦乱视频| 国产亚洲一区二区手机在线观看| 激情国产在线| 精品国产一区二区三区2021| 国产欧美综合一区二区三区| 欧美专区一区二区三区| 日本免费一区二区三区四区| 91精品美女| 国产三级精品三级在线观看国产| 国产精东传媒成人av电影| 国产在线日韩| 欧美日韩国产高清电影| 国内精品福利| 午夜久久av| 国产精品jk白丝蜜臀av小说| 精品中文在线| 亚洲一级少妇| 婷婷久久一区| 久久最新视频| 欧美黑人巨大videos精品| 高潮一区二区| 日韩中文字幕在线一区| 久久精品毛片| 蜜臀精品久久久久久蜜臀 | 蜜桃视频一区二区| 日韩av黄色在线| 国产亚洲精品美女久久久久久久久久| 免费在线播放第一区高清av| 在线日韩视频| 欧美亚洲福利| 99久久99久久精品国产片果冰 | 久久国产三级| 免费视频亚洲| 精品视频91| 久久国产精品亚洲77777| 欧美一级网站| 黄色国产精品| 国产欧美日韩亚洲一区二区三区| 日韩精品欧美激情一区二区| 美女精品在线| 久久久噜噜噜| 91青青国产在线观看精品| 日本午夜精品一区二区三区电影 | 夜夜嗨av一区二区三区网站四季av| 国产伦理一区| 日韩有吗在线观看| 国产精品一区二区99| 免费在线观看日韩欧美| 99久久久久国产精品| 国产精选一区| 日本午夜免费一区二区| 性色一区二区| 蜜臀91精品一区二区三区| 国产不卡人人| 青草久久视频| 日韩高清中文字幕一区| 亚州av一区| 青青伊人久久| 亚洲精品激情| 日韩精品欧美大片| 亚洲a成人v| 人人精品人人爱| 日韩欧美2区| 国产免费播放一区二区| 日本一区免费网站| 亚洲网址在线观看| 香蕉久久一区| 麻豆精品新av中文字幕| 欧美激情福利| 久久久久观看| 亚洲电影有码| 婷婷精品进入| 玖玖精品视频| 免费不卡在线视频| 日韩成人午夜精品| 亚洲三级国产| 亚洲另类av| 国产日韩欧美一区二区三区在线观看| 日韩激情啪啪| 亚洲一区国产| 成人片免费看| 亚洲tv在线| 香蕉成人av| 狠狠久久伊人中文字幕| 国产aa精品| 亚洲高清久久| 久久狠狠亚洲综合| 亚洲一本视频| 国产福利资源一区| 午夜在线播放视频欧美| 久久永久免费| 日韩免费在线| 日欧美一区二区| 国产综合激情| 久久精品国产网站| 亚洲欧美日韩精品一区二区| 国产精品毛片久久| 欧美亚洲人成在线| 日本久久成人网| 蜜桃久久精品一区二区| 色综合狠狠操| 老司机精品久久| 粉嫩av一区二区三区四区五区| 国产乱码精品一区二区三区四区 | 国产欧美自拍| 99re国产精品| 久久av免费看| 免费视频最近日韩| 1024精品久久久久久久久| 日韩欧美三级| 国产一区日韩| 国产成人精品一区二区免费看京 | 欧美日韩一区二区三区四区在线观看| 日韩精品免费一区二区三区| 蜜臀av一区二区三区| 欧美特黄一区| 色婷婷色综合| 乱一区二区av| 国产精品日韩精品中文字幕| 日韩精品一级|