第五步:解決跨域問題,返回 token欢峰,校驗(yàn)token, 并定義將接收的參數(shù)全局存儲(chǔ)的方法

第一步:創(chuàng)建一個(gè)基礎(chǔ)項(xiàng)目
第二步:創(chuàng)建寫接口的模塊葬荷,建立moogodb數(shù)據(jù)庫連接涨共,寫添加與查詢接口
第三步:加入Swagger文檔
第四步:加入請求參數(shù)校驗(yàn)

  • 注:不要關(guān)心注釋代碼,那是屬于后面功能的區(qū)域闯狱。因?yàn)殡S著代碼體量加大煞赢,功能不再明確,只需按照步驟并參考效果圖哄孤,把關(guān)鍵代碼寫入即可照筑,所以下只寫關(guān)鍵代碼,具體請看效果圖瘦陈。
    項(xiàng)目地址

1 解決跨域問題

npm i cors

1.1 將cros掛到全局中間件上

~/src/app.module.ts

import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
// 跨域 
import * as cors from 'cors';

// 定義中間件
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      // 解決跨域的問題的全局中間件
      .apply(cors()).forRoutes('*')
      // 驗(yàn)證token的全局中間件
      // .apply(JwtExpiredMiddleware).forRoutes('*')
  }
}
效果圖

2 生成token凝危,校驗(yàn)token

2.3 生成token

// 生成token https://docs.nestjs.cn/9/security?id=jwt-%e5%8a%9f%e8%83%bd
import { JwtService } from '@nestjs/jwt';

  // Swagger標(biāo)簽
  @ApiTags('有Swagger文檔/開啟請求參數(shù)校驗(yàn)/Token')
  // 請求方式:Post, 請求路徑:/user-copy/queryToken
  @Post('queryToken')
  // @Body() 裝飾器
  async queryToken(@Body() body: userResponsesValidator) {
    // 存儲(chǔ)參數(shù)到全局
    this.globalParamsService.setParam('globalToken', body);
    return {
      // 對參數(shù)進(jìn)行簽名  生成token -- 正常來說肯定是要去庫里查這個(gè)賬號存不存在的 -- 由于是示例代碼  就不寫那么麻煩了 -- 不然忘了賬號又得再注冊一個(gè)
      access_token: this.jwtService.sign({ user_name: body.user_name, password: body.password }),
    };
  }
效果圖

2.2 創(chuàng)建token配置文件

npm i @nestjs/jwt jsonwebtoken
~/src/utils/tokenConfig.ts

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
// npm i jsonwebtoken
import * as jwt from 'jsonwebtoken';


interface JwtPayload {
  exp: number;
  // 其他 JWT 載荷屬性
}

// 定義token的簽名與超時(shí)時(shí)間
export const toeknData = {
  secret: "tokenKey", // 密匙
  expiresIn:"60s", // 超時(shí)時(shí)間60秒
}

@Injectable()
export class JwtExpiredMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {

    // 一般來說 可能會(huì)以正則去匹配白名單接口 - 大部分情況下,只會(huì)有極個(gè)別的接口會(huì)是白名單 - 由于是示例 就直接寫死了
    // 如果 請求地址不為 /user-copy/findValidatorToken 則直接跳過
    if (req.baseUrl !== '/user-copy/findValidatorToken') return next()

    const token = req.headers.authorization?.split(' ')[1]; // 從請求頭中獲取 JWT

    if (token) {
      try {
        // 解碼
        const decoded = jwt.verify(token, toeknData.secret) as JwtPayload;
        // 接收到JWT后執(zhí)行的邏輯
        // 當(dāng)前時(shí)間戳
        // const currentTime = Math.floor(Date.now() / 1000);
        // decoded.exp 是解碼后的 JWT 中的過期時(shí)間晨逝,表示該令牌的有效期截止時(shí)間蛾默。
        // decoded.iat 是解碼后的 JWT 中的簽發(fā)時(shí)間,表示該令牌的生成時(shí)間捉貌。
        // 比較當(dāng)前時(shí)間是否已經(jīng)超出令牌有效期截至?xí)r間
        // if (decoded.exp < currentTime) {
        //   // JWT 已經(jīng)超時(shí)
        //   // 執(zhí)行相應(yīng)的邏輯
        //   return res.send({ status: 99998, data: [], message: '登錄超時(shí)' });
        // }
      } catch (error) {
        // JWT 驗(yàn)證失敗
        // 執(zhí)行相應(yīng)的邏輯
        return res.send({ status: 99998, data: error, message: '認(rèn)證失敗' });
      }
    } else {
      // token認(rèn)證失敗
      // 執(zhí)行相應(yīng)的邏輯
      return res.send({ status: 99999, data: 'token in required', message: '認(rèn)證失敗' });
    }

    next();
  }

}

2.3 引入并配置生成token規(guī)則支鸡, 并掛載到全局中間件

~/src/app.module.ts

// npm i @nestjs/jwt
// 生成token https://docs.nestjs.cn/9/security?id=jwt-%e5%8a%9f%e8%83%bd
import { JwtModule } from '@nestjs/jwt';
import { toeknData, JwtExpiredMiddleware } from './utils/tokenConfig'

// 配置生成的token
  imports: [
    JwtModule.register({
      secret: toeknData.secret, // 是用于簽名和驗(yàn)證 JWT 的密鑰
      signOptions: { expiresIn: toeknData.expiresIn }, // JWT 的過期時(shí)間。
    }),
  ]

// 定義中間件
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      // 解決跨域的問題的全局中間件
      .apply(cors()).forRoutes('*')
      // 驗(yàn)證token的全局中間件
      .apply(JwtExpiredMiddleware).forRoutes('*')
  }
}
效果圖

3 測試效果

3.1 生成token接口

效果圖

3.2 不傳token

效果圖

3.3 傳token

效果圖

token失敗錯(cuò)誤/token過期

效果圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趁窃,一起剝皮案震驚了整個(gè)濱河市牧挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醒陆,老刑警劉巖瀑构,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刨摩,居然都是意外死亡寺晌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門澡刹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻征,“玉大人,你說我怎么就攤上這事罢浇∨吕纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵己莺,是天一觀的道長。 經(jīng)常有香客問我戈轿,道長凌受,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任思杯,我火速辦了婚禮胜蛉,結(jié)果婚禮上挠进,老公的妹妹穿的比我還像新娘。我一直安慰自己誊册,他們只是感情好领突,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著案怯,像睡著了一般君旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘲碱,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天金砍,我揣著相機(jī)與錄音,去河邊找鬼麦锯。 笑死恕稠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扶欣。 我是一名探鬼主播鹅巍,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼料祠!你這毒婦竟也來了骆捧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤术陶,失蹤者是張志新(化名)和其女友劉穎凑懂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梧宫,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡接谨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塘匣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脓豪。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忌卤,靈堂內(nèi)的尸體忽然破棺而出扫夜,到底是詐尸還是另有隱情,我是刑警寧澤驰徊,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布笤闯,位于F島的核電站,受9級特大地震影響棍厂,放射性物質(zhì)發(fā)生泄漏颗味。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一牺弹、第九天 我趴在偏房一處隱蔽的房頂上張望浦马。 院中可真熱鬧时呀,春花似錦、人聲如沸晶默。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磺陡。三九已至趴梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仅政,已是汗流浹背垢油。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圆丹,地道東北人滩愁。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像辫封,于是被迫代替她去往敵國和親硝枉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容