摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址基于的認(rèn)證流程客戶端用戶發(fā)登錄請(qǐng)求服務(wù)端驗(yàn)證用戶名密碼驗(yàn)證成功服務(wù)端生成一個(gè),響應(yīng)給客戶端客戶端之后的每次請(qǐng)求中都帶上這個(gè)服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證,驗(yàn)證成功接收請(qǐng)求這里我們采用來生成,使用驗(yàn)證驗(yàn)證成功會(huì)把
[一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11...
git地址
基于token的認(rèn)證流程
客戶端用戶發(fā)登錄請(qǐng)求
服務(wù)端驗(yàn)證用戶名密碼
驗(yàn)證成功服務(wù)端生成一個(gè)token,響應(yīng)給客戶端
客戶端之后的每次請(qǐng)求header中都帶上這個(gè)token
服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證token,驗(yàn)證成功接收請(qǐng)求
這里我們采用jsonwebtoken來生成token,
jwt.sign(payload, secretOrPrivateKey, [options, callback])
使用express-jwt驗(yàn)證token(驗(yàn)證成功會(huì)把token信息放在request.user中)
express_jwt({ secret: SECRET, getToken: (req)=> { if (req.headers.authorization && req.headers.authorization.split(" ")[0] === "Bearer") { return req.headers.authorization.split(" ")[1]; } else if (req.query && req.query.token) { return req.query.token; } return null; } }
為什么使用redis
采用jsonwebtoken生成token時(shí)可以指定token的有效期,并且jsonwebtoken的verify方法也提供了選項(xiàng)來更新token的有效期,但這里使用了express_jwt中間件,express_jwt不提供方法來刷新token
思路:
客戶端請(qǐng)求登錄成功,生成token
將此token保存在redis中,設(shè)置redis的有效期(例如1h)
新的請(qǐng)求過來,先express_jwt驗(yàn)證token,驗(yàn)證成功, 再驗(yàn)證token是否在redis中存在,存在說明有效
有效期內(nèi)客戶端新的請(qǐng)求過來,提取token,更新此token在redis中的有效期
客戶端退出登錄請(qǐng)求,刪除redis中此token
const express_jwt = require("express-jwt") const redis = require("./redis") const jwt = require("jsonwebtoken") const unless = require("express-unless") const SECRET = "MOVIESKEY" const token = { SECRET, sign: (user) => { return jwt.sign(user, SECRET) }, getToken: function fromHeaderOrQuerystring(req) { if (req.headers.authorization && req.headers.authorization.split(" ")[0] === "Bearer") { return req.headers.authorization.split(" ")[1]; } else if (req.query && req.query.token) { return req.query.token; } return null; }, validToken: express_jwt({ secret: SECRET, getToken: this.getToken }), noAuthorization: (err, req, res, next) => { if (err.status == 401) { res.json(err) return } next() }, //token在redis中存在,更新有效期,不存在說明已退出登錄 checkRedis: (req, res, next) => { const tok = token.getToken(req) redis.get(tok, (data) => { if (data) { // token 在redis中存在,延長(zhǎng)過期時(shí)間 redis.updateExpire(tok) next() } else { next(10005) } }) }, add:(tok)=>{ redis.add(tok) }, remove: (req) => { const tok = token.getToken(req) tok && redis.remove(tok) } } token.checkRedis.unless = unless module.exports = token
使用
routes/movies.js
const unlessPath = { path: [ { url: "/api/movies", methods: ["GET"] }, { url: "/api/movies/search/by", methods: ["GET"] }, { url: /movies/[^/]+$/, methods: ["GET"] }, ] } if (process.env.NODE_ENV != "test") { router.use( token.validToken.unless(unlessPath), token.noAuthorization, token.checkRedis.unless(unlessPath) ) } router.get("/",(req,res,next)=>{}) router.post("/",(req,res,next)=>{}) router.put("/:movieId",(req,res,next)=>{})
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88464.html
摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址基于的認(rèn)證流程客戶端用戶發(fā)登錄請(qǐng)求服務(wù)端驗(yàn)證用戶名密碼驗(yàn)證成功服務(wù)端生成一個(gè),響應(yīng)給客戶端客戶端之后的每次請(qǐng)求中都帶上這個(gè)服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證,驗(yàn)證成功接收請(qǐng)求這里我們采用來生成,使用驗(yàn)證驗(yàn)證成功會(huì)把 [一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11... git地址 基于token的認(rèn)證流程 客...
摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開啟身份認(rèn)證使用來做基于的用戶身份認(rèn)證中使用來寫單元測(cè)試部署技術(shù)棧沒用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來總結(jié)一下前后端用到技術(shù)及遇到的問題和解決方法...
摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開啟身份認(rèn)證使用來做基于的用戶身份認(rèn)證中使用來寫單元測(cè)試部署技術(shù)棧沒用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來總結(jié)一下前后端用到技術(shù)及遇到的問題和解決方法...
摘要:前端日?qǐng)?bào)精選如何制作離線友好的表單淺談前端狀態(tài)管理年學(xué)習(xí)的一些建議我遇到的前端面試題并發(fā)模型與中文和的比較介紹掘金使用實(shí)踐一步一步搭建應(yīng)用使用來做基于的用戶身份認(rèn)證個(gè)人文章下劃線是否破壞可讀性從看的掘金從零開始教你寫一個(gè)包前 2017-09-10 前端日?qǐng)?bào) 精選 如何制作離線友好的表單?淺談前端狀態(tài)管理2017 年學(xué)習(xí) React + Redux 的一些建議我遇到的前端面試題2017J...
摘要:其實(shí),該復(fù)雜的東西在哪放都復(fù)雜,只不過現(xiàn)在更清晰一點(diǎn)使用不好的地方就是太繁瑣了,定義各種各種組件。。。。。 之前做了個(gè)好電影搜集的小應(yīng)用,前端采用react,后端采用express+mongodb,最近又將組件間的狀態(tài)管理改成了redux,并加入了redux-saga來管理異步操作,記錄一些總結(jié) 在線地址 手機(jī)模式 源碼 主要功能 爬取豆瓣電影信息并錄入MongoDB 電影列表展示...
閱讀 3406·2021-11-24 09:39
閱讀 1797·2021-11-17 09:33
閱讀 3503·2021-10-12 10:12
閱讀 5019·2021-09-22 15:51
閱讀 1112·2019-08-30 13:11
閱讀 3572·2019-08-30 10:59
閱讀 564·2019-08-30 10:48
閱讀 1311·2019-08-26 13:48