JWT認證機制

Session認證機制中需要配合cookie才能實現,由于cookie默認不支持跨域訪問,當涉及到前端跨域請求后端接口時,需要做很多額外的配置,才能實現跨域session認證。所以這里不推薦使用session身份認證機制,一般推薦使用jwt認證。

目錄

一、JWT的概念

二、JWT工作原理

?三、JWT的組成部分

四、JWT的使用方式

五、在express中使用JWT

1.安裝JWT相關的包

2.導入JWT相關的包

3.定義secret密鑰

4.在登錄成功后生成jwt字符串

5.將jwt字符串還原為JSON對象

?6.使用req.user獲取用戶信息


一、JWT的概念

JWT(英文全稱:JSON Web Token)是目前最流行的跨域認證解決方案。

二、JWT工作原理

用戶的信息通過token字符串的形式,保存在客戶端瀏覽器中,服務器通過還原token字符串的形式來認證用戶的身份。

?三、JWT的組成部分

jwt通常由三部分組成,分別是header(頭部)、payload(有效荷載)、signature(簽名),三者之間使用英文的“.”分隔,格式如下:

header.payload.signature
payload是真正的用戶信息,它是用戶信息經過加密之后生成的字符串
header、signature是安全性相關的部分,只是為了保證token的安全性

四、JWT的使用方式

客戶端收到服務器返回的JWT之后,通常會將它儲存在 localStorage 或 sessionStorage 中,此后,客戶端每次與服務器通信,都要帶上這個JWT 的字符串,從而進行身份認證。推薦的做法是把 JWT 放在 HTTP請求頭的 Authorization 字段中格式如下:

Authorization:Bearer<token>

五、在express中使用JWT

1.安裝JWT相關的包

運行如下命令,安裝如下兩個JWT相關的包:

npm i jsonwebtoken express-jwt

jsonwebtoken:用于生成JWT字符串;

express-jwt:用于將JWT字符串解析還原成JSON對象。

2.導入JWT相關的包

使用require()函數,分別導入JWT相關的兩個包:

//導入用于生成jwt字符串的包
const jwt = require('jsonwebtoken')
//導入用于將客戶端發送過來的jwt字符串,解析還原成JSON對象的包
const expressJwt = require('express-jwt')

3.定義secret密鑰

為了保證jwt字符串的安全性,防止jwt字符串在網絡傳輸中被別人破解,我們需要專門定義一個用于加密和解密的secret密鑰:

  • 當生成jwt字符串的時候,需要使用secret密鑰對用戶信息進行加密,最終得到加密好的jwt字符串;
  • 當把jwt字符串解析還原成JSON對象的時候,需要使用secret密鑰進行解密;
//設置密鑰
const secret = '123456'

4.在登錄成功后生成jwt字符串

調用jsonwebtoken包提供的sign()方法,將用戶的信息加密成jwt字符串,響應給客戶端:

//登錄接口
app.post('/api/login', (req, res) => { //省略登錄失敗情況下的代碼//用戶登錄成功之后,生成jwt字符串,通過token屬性響應給客戶端res.send({code: 200,message: 'success',//調用jwt.sign方法生成token字符串token:jwt.sign({username:userinfo.username}, secret, {expiresIn: '1h'})})
})

5.將jwt字符串還原為JSON對象

?客戶端每次在訪問那些有權限接口的時候,都需要主動通過請求頭中的 Authorization 字段,將 Token 字符串發送到服務器進行身份認證。此時,服務器可以通過 express-jwt 這個中間件,自動將客戶端發送過來的 Token 解析還原成 JSON 對象:

//使用app.use()來注冊中間件
//expressJwt({secret: secret})就是用來解析token的中間件
//.unless({path:[/^\/api\//]})用來指定那些接口不需要那些接口不需要訪問權限
app.use(expressJwt({secret: secret}).unless({path:[/^\/api\//]}))

?6.使用req.user獲取用戶信息

當express-jwt這個中間件配置成功之后,即可在哪些有權限的接口中,使用req.user對象,來訪問從jwt字符串中解析出來的用戶信息了,示例代碼如下:

//這是一個有權限的接口
app.get('/api/protected', (req, res) => { //使用req.auth獲取用戶信息,并使用data屬性將用戶信息發送給客戶端res.send({code: 200,message: 'success',data: req.auth})
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70424.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

netcore 啟用gzip壓縮及緩存

public void ConfigureServices(IServiceCollection services) {....// 配置gzip 與 br的壓縮等級為最優services.Configure<BrotliCompressionProviderOptions>(options > {options.Level CompressionLevel.Optimal;});services.Configure<GzipCompressionProvid…

qt:常見標簽操作,倒計時功能,進度條與日歷

1.標簽常見函數 函數功能void setext(const QString &text)設置文本QString text()const獲取文本void setPixmap(const QPixmap)與Pixmap()const設置和獲取圖像void setAlignment(Qt::Alignment alignment)設置對齊&#xff08;獲取和上面一樣&#xff09;void setWordWr…

STM32MP157A單片機移植Linux驅動

在stm32mp157a單片機移植Linux操作系統&#xff0c;并移植內核驅動&#xff0c;在應用程序中使用3個線程&#xff0c;分別實現控制單片機上3個led流水燈的功能、蜂鳴器控制的功能、風扇控制的功能。 需求整理&#xff1a; 1.驅動程序-->led1.c&#xff0c;led2.c&#xff…

python中格式化輸出知識點匯總

在Python中&#xff0c;格式化輸出是一種常見的操作&#xff0c;用于將數據以特定的格式展示。以下是Python中格式化輸出的主要方法&#xff1a; ### 1. 使用 % 操作符 這是Python早期版本中常用的格式化方法&#xff0c;類似于C語言中的printf。 - **基本語法**&#xff1a;&…

完美轉發使用

完美轉發的幾個例子 例子 1&#xff1a;普通的完美轉發 首先&#xff0c;我們先來一個簡單的完美轉發的例子&#xff0c;展示如何使用 std::forward 來保持傳入參數的類型。 #include <iostream> #include <utility> // std::forwardvoid func(int& x) {st…

【Content-Type詳解、Postman中binary格式、json格式數據轉原始二進制流等】

Content-Type詳解、Postman中binary格式、json格式數據轉原始二進制流等 背景&#xff1a;postman中如何使用binary格式上傳文件 Content-TypeContent-Type的格式由三部分組成&#xff1a;以下是一些常見的Content-Type示例&#xff1a; Postman中 binary格式定義&#xff1a;用…

DeepSeek等大模型功能集成到WPS中的詳細步驟

記錄下將**DeepSeek功能集成到WPS中**的步驟&#xff0c;以備忘。 1. 下載并安裝OfficeAI插件 訪問OfficeAI插件下載地址&#xff1a;https://www.office-ai.cn/&#xff0c;下載插件&#xff08;目前只支持windows系統&#xff09;。 注意&#xff0c;有兩個插件&#xff0…

MATLAB學習之旅:從入門到基礎實踐

在當今科技飛速發展的時代,MATLAB作為一款強大的數學軟件,猶如一把神奇的鑰匙,能夠打開眾多領域的大門。無論是工程計算、數據分析,還是算法開發、可視化呈現,MATLAB都展現出了無與倫比的魅力。今天,就讓我們踏上這段奇妙的MATLAB學習之旅,從最基礎的部分開始,逐步探索…

在Ubutu18.04下搭建nfs服務器

在Ubutu18.04下搭建nfs服務器 主要參考這篇博客 Ubuntu18.04下安裝NFS詳細步驟_烏班圖安裝nfs-CSDN博客 1.安裝NFS服務&#xff1a; 服務器端&#xff1a; sudo apt install nfs-kernel-server

棧,優先級隊列,map,set

文章目錄 棧題目解析代碼 優先級隊列題解代碼 map題解代碼 set題解代碼 棧 題目解析 1.先把元素push進棧中&#xff0c;如果棧非空并且棧中的元素按順序和k相等就出棧&#xff0c;直到棧為空或者k ! sk.top() 代碼 #include<iostream> #include<stack> #include&l…

C++ Primer 類的靜態成員

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

Java——super

在Java中&#xff0c;super關鍵字用于引用父類的成員&#xff08;屬性、方法或構造器&#xff09;。它在繼承關系中非常重要&#xff0c;主要用于以下幾種場景&#xff1a; 1. 調用父類的構造器 在子類的構造器中&#xff0c;可以使用super關鍵字調用父類的構造器。super()必須…

Unity 全局屏幕點擊特效

思路&#xff1a; 1、生成一個點擊特效實例&#xff0c;每點擊屏幕&#xff0c;就調整特效實例的位置并控制特效的顯隱狀態即可。 2、需要注意要保證在編輯器開發時或手機上運行時都要顯示點擊效果。 方案一 &#xff08;推薦&#xff09; using UnityEngine; using UnityEn…

什么是業務流程分類框架

業務流程分類框架是一個用于組織和系統化地分類業務流程的結構化方法。它旨在幫助企業理解、管理、分析和改進其運營流程。 可以把它想象成一個圖書館的圖書分類系統&#xff0c;幫助快速找到和理解不同類型的書籍。對于業務流程來說&#xff0c;分類框架幫助快速了解不同類型的…

基于springboot校園健康系統的設計與實現(源碼+文檔)

大家好我是風歌&#xff0c;今天要和大家聊的是一款基于springboot的園健康系統的設計與實現。項目源碼以及部署相關請聯系風歌&#xff0c;文末附上聯系信息 。 項目簡介&#xff1a; 基于springboot校園健康系統的設計與實現的主要使用者管理員具有最高的權限&#xff0c;通…

【Leetcode】平衡二叉樹

平衡二叉樹 題目 思路與代碼實現 常規解法&#xff1a; int max(int a,int b){return a>b?a:b;}int maxDepth(struct TreeNode* root) {if(rootNULL)return 0;return 1max(maxDepth(root->left),maxDepth(root->right)); }bool isBalanced(struct TreeNode* root)…

【AI實踐】阿里百煉文本對話Agent安卓版搭建

環境&#xff1a;安卓手機運行環境&#xff1b;WinsurfAI編程工具&#xff1b;阿里百煉提前創建Agent應用&#xff1b; 耗時&#xff1a;2小時&#xff1b; 1&#xff0c;新建安卓項目 完成文本輸入&#xff0c;并將輸入的文字顯示出來。 2&#xff0c;安裝SDK 參考文檔 安…

一文讀懂Docker之Docker Compose

目錄 一、Docker Compose簡介 二、Docker Compose的安裝和基本使用 1、Docker Compose的安裝 步驟一、下載docker-compose 步驟二、新增可執行權限 步驟三、查看是否安裝成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…

WordPress“更新失敗,響應不是有效的JSON響應”問題的修復

在使用WordPress搭建網站時&#xff0c;許多人在編輯或更新文章時&#xff0c;可能會遇到一個提示框&#xff0c;顯示“更新失敗&#xff0c;響應不是有效的JSON響應”。這個提示信息對于不了解技術細節的用戶來說&#xff0c;太難懂。其實&#xff0c;這個問題并不復雜&#x…

信息學奧賽一本通 1973 【16NOIP普及組】買鉛筆 | 洛谷 P1909 [NOIP 2016 普及組] 買鉛筆

【題目鏈接】 ybt 1973 【16NOIP普及組】買鉛筆 洛谷 P1909 [NOIP 2016 普及組] 買鉛筆 【題目考點】 1. 簡單數學 2. 數組 3. 向上取整 <cmath>中有函數double ceil(double x)&#xff0c;求x向上取整的值。 如果求正整數 ? a b ? \lceil \frac{a}{b} \rceil ?…