JWT的認識
什么是 JWT
????????JWT(英文全稱:JSON Web Token)是目前最流行的跨域認證解決方案。
JWT 的工作原理
????????總結:用戶的信息通過 Token 字符串的形式,保存在客戶端瀏覽器中。服務器通過還原 Token 字符串的形式來認證用戶的身份。?
?JWT 的組成部分
????????JWT 通常由三部分組成,分別是 Header(頭部)、Payload(有效荷載)、Signature(簽名)。 三者之間使用英文的“.”分隔,格式如下:
下面是 JWT 字符串的示例:
?JWT 的三個部分各自代表的含義
????????JWT 的三個組成部分,從前到后分別是
- Header
- Payload
- Signature
????????其中: ?Payload 部分才是真正的用戶信息,它是用戶信息經過加密之后生成的字符串。
?????????Header 和 Signature 是安全性相關的部分,只是為了保證 Token 的安全性。
JWT 的使用方式
????????客戶端收到服務器返回的 JWT 之后,通常會將它儲存在 localStorage 或 sessionStorage 中。
???????? 此后,客戶端每次與服務器通信,都要帶上這個 JWT 的字符串,從而進行身份認證。推薦的做法是把 JWT 放在 HTTP 請求頭的 Authorization 字段中,格式如下:?
在 Express 中使用 JWT
1.安裝 JWT 相關的包
????????運行如下命令,安裝如下兩個 JWT 相關的包:
?其中:
- jsonwebtoken 用于生成 JWT 字符串
- express-jwt 用于將 JWT 字符串解析還原成 JSON 對象
2. 導入 JWT 相關的包
使用 require() 函數,分別導入 JWT 相關的兩個包:
3. 定義 secret 密鑰
????????為了保證 JWT 字符串的安全性,防止 JWT 字符串在網絡傳輸過程中被別人破解,我們需要專門定義一個用于加密和解密的 secret 密鑰:
- 當生成 JWT 字符串的時候,需要使用 secret 密鑰對用戶的信息進行加密,最終得到加密好的 JWT 字符串
- 當把 JWT 字符串解析還原成 JSON 對象的時候,需要使用 secret 密鑰進行解密?
4. 在登錄成功后生成 JWT 字符串
調用 jsonwebtoken 包提供的 sign() 方法,將用戶的信息加密成 JWT 字符串,響應給客戶端:
?5. 將 JWT 字符串還原為 JSON 對象
????????客戶端每次在訪問那些有權限接口的時候,都需要主動通過請求頭中的 Authorization 字段,將 Token 字符串發送到服務器進行身份認證。 此時,服務器可以通過 express-jwt 這個中間件,自動將客戶端發送過來的 Token 解析還原成 JSON 對象:
6. 使用 req.user 獲取用戶信息
????????當 express-jwt 這個中間件配置成功之后,即可在那些有權限的接口中,使用 req.user 對象,來訪問從 JWT 字符串中解析出來的用戶信息了,示例代碼如下:
?