Json web token(JWT)是爲了網絡應用環境間傳遞聲明而執行的一種基於JSON的開發標準(RFC 7519),該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登錄(SSO)場景。JWT的聲明通常被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也能夠增長一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。
eggmiddleware
jwt官網
node-jsonwebtokenhtml
npm install jsonwebtoken
在middleware文件下新建一個jwt.js文件前端
'use strict' const fs = require('fs') const path = require('path') const jwt = require('jsonwebtoken') //引入jsonwebtoken module.exports = (options, app) => { return async function userInterceptor(ctx, next) { let authToken = ctx.header.authorization // 獲取header裏的authorization if (authToken) { authToken = authToken.substring(7) const res = verifyToken(authToken) // 解密獲取的Token if (res.corpid && res.userid) { // 若是須要限制單端登錄或者使用過程當中廢止某個token,或者更改token的權限。也就是說,一旦 JWT 簽發了,在到期以前就會始終有效 // 此處使用redis進行保存 const redis_token = await app.redis.get('loginToken').get(res.corpid + res.userid) // 獲取保存的token if (authToken === redis_token) { ctx.locals.corpid = res.corpid ctx.locals.userid = res.userid await next() } else { ctx.body = { code: 50012, msg: '您的帳號已在其餘地方登陸' } } } else { ctx.body = { code: 50012, msg: '登陸狀態已過時' } } } else { ctx.body = { code: 50008, msg: '請登錄後再進行操做' } } } } // 解密,驗證 function verifyToken(token) { const cert = fs.readFileSync(path.join(__dirname, '../public/rsa_public_key.pem')) // 公鑰,看後面生成方法 let res = '' try { const result = jwt.verify(token, cert, { algorithms: [ 'RS256' ] }) || {} const { exp } = result, current = Math.floor(Date.now() / 1000) if (current <= exp) res = result.data || {} } catch (e) { console.log(e) } return res }
在 config.default.js 中加入下面的配置就完成了中間件的開啓和配置node
// 方法一:在應用中使用中間件 config.middleware = [ 'jwt' ] config.jwt = { enable: true, ignore: [ '/api/v1/test/', '/public/' ], // 哪些請求不須要認證 } // 方法二:router中使用中間件 module.exports = app => { const jwt = app.middleware.jwt(); app.router.get('/api/v1/test/', jwt, app.controller.test.test); };
建議寫在 helper 裏,方便調用ios
loginToken(data, expires = 7200) { const exp = Math.floor(Date.now() / 1000) + expires const cert = fs.readFileSync(path.join(__dirname, '../public/rsa_private_key.pem')) // 私鑰,看後面生成方法 const token = jwt.sign({ data, exp }, cert, { algorithm: 'RS256' }) return token }
調用token生成方法git
const token = ctx.helper.loginToken({ corpid: usersData.corpid, userid: usersData.userid }, 7200) // token生成 await app.redis.get('loginToken').set(usersData.corpid + usersData.userid, token, 'ex', 7200) // 保存到redis ctx.body = { data: { token, expires: this.config.login_token_time }, code: 1, msg: '登陸成功' } // 返回前端
設置headers的Authorization = 'Bearer ' + Token
Bearer後面要加空格github
例:axios中 // request攔截器 service.interceptors.request.use(config => { if (store.getters.token) { config.headers['Authorization'] = `Bearer ${getToken()}` } return config }, error => { console.log(error) Promise.reject(error) })
此處介紹window下已安裝git的方法
設置環境變量
個人電腦 > 右鍵 > 屬性 > 高級系統設置 > 環境變量 > path > 編輯 > 新建git路徑\bin
和git路徑\usr\bin
如:C:\Program Files\Git\bin
和 C:\Program Files\Git\usr\bin
生成公鑰:openssl genrsa -out rsa_private_key.pem 1024
生成私鑰: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
web
歡迎關注個人博客redis