express使用JWT和httpOnly cookie进行安全验证
生活随笔
收集整理的這篇文章主要介紹了
express使用JWT和httpOnly cookie进行安全验证
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
express使用JWT和httpOnly cookie進行身份驗證
對大創(chuàng)項目中使用JWT作為身份驗證的總結。
一般情況使用JWT作為身份驗證的方式可以直接參考這篇文章:Node.js 使用 express-jwt 解析 JWT 。這里主要針對httpOnly類型的cookie進行代碼調(diào)整。
1. 安裝和引入
需要使用的模塊:express-jwt ,用于解析token; jsonwebtoken ,用于生成token ; cookie-parser,用于解析cookie(據(jù)說express已經(jīng)內(nèi)置,但是為可能沒有該模塊導致避免取不到cookie,安裝該模塊)。
npm i express-jwt jsonwebtoken cookie-parser --save引入:
const express = require('express'); const jwt = require('jsonwebtoken'); const expressJwt = require('express-jwt'); const cookieParser = require('cookie-parser');const app = express();2. 生成token,放入cookie,驗證token
封裝一個生成token的方法:
//設置一個私鑰 const scrict = 'examplev8w9egf';function createToken = palyload =>{//給palyload添加一個生成時間戳的屬性palyload.curtime = Date.now();//這里添加Bearer是因為express-jwt模塊默認獲取到token的方法//當然這里也沒必要添加,因為后續(xù)我們不會使用默認的解析方式const token = 'Bearer ' + jwt.sign(palyload,scrict, { expiresIn: 3600 * 24 * 3 //過期時間})return token; }在需要的位置生成和發(fā)送token到cookie:
如果不知道express中怎么使用cookie,可以參考:Express Cookie的使用
app.use('/',(req,res)=>{let token = createToken({login:true,name:user}) //這里的palyload參數(shù)可以自行設定//將token存入cookie,設置最大失效時間和httpOnlyres.cookie('token',token,{ maxAge:1000*3600*24, path:'/', httpOnly:true });//響應客戶端res.send({msg:'cookie設置成功'}); }客戶端攜帶cookie請求:
//這里使用JQ封裝的ajax。默認是會自動攜帶cookie的,無需單獨設置: $.ajax({//一般情況攜帶token的方式。但這里設置的是httpOnly類型,使用js是無法獲取的,交給服務端處理 /* headers:{Accept: "application/json; charset=utf-8",Authorization:token}, */url: '/',type: 'put',contentType: "application/json", success: function (data) {return;},error: function (err) {console.log(err);},//這里加一個服務器端校驗token失敗返回401狀態(tài)碼的操作,跳轉(zhuǎn)回登錄界面statusCode:{401:function () {//token驗證失敗 異常處理alert('token驗證失敗!');}} })服務器端解析cookie中的token:
//cookie-parser掛載 home.use(cookieParser());//express-jwt掛載,驗證token home.use(expressJwt({secret:scrict, //封裝生成token方法時候設置的私鑰algorithms: ['HS256'], //解碼方式建議加上,否則可能會報錯/*重要的是這里,需要改變express-jwt默認取得token的方式默認模塊會從請求頭的authorization中取得token,token以'Bearer'開頭 */getToken:function fromCookie(req){//嘗試從cookie讀取token進行驗證if(req.cookies.token)return req.cookies.token.split(' ')[1];return null; } }).unless({path:['/login','logout'] //白名單,該地址下的不會進行解析 })) //token校驗錯誤處理中間件 home.use(function (err, req, res, next) {if (err.name === 'UnauthorizedError') { console.log(err);res.status(401).send('invalid token...'); //根據(jù)具體情況設置} })//通過解析后的處理 app.use('/user',(req,res)=>{res.send({err:0,msg:'token通過解析驗證'}) })總結
以上是生活随笔為你收集整理的express使用JWT和httpOnly cookie进行安全验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DNS服务器详解--------基础篇
- 下一篇: 敏捷团队如何进行绩效考核?