成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

一步一步搭建react應(yīng)用-使用 jwt + redis 來(lái)做基于token的用戶(hù)身份認(rèn)證

ivyzhang / 3544人閱讀

摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址基于的認(rèn)證流程客戶(hù)端用戶(hù)發(fā)登錄請(qǐng)求服務(wù)端驗(yàn)證用戶(hù)名密碼驗(yàn)證成功服務(wù)端生成一個(gè),響應(yīng)給客戶(hù)端客戶(hù)端之后的每次請(qǐng)求中都帶上這個(gè)服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證,驗(yàn)證成功接收請(qǐng)求這里我們采用來(lái)生成,使用驗(yàn)證驗(yàn)證成功會(huì)把

[一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11...

git地址

基于token的認(rèn)證流程

客戶(hù)端用戶(hù)發(fā)登錄請(qǐng)求

服務(wù)端驗(yàn)證用戶(hù)名密碼

驗(yàn)證成功服務(wù)端生成一個(gè)token,響應(yīng)給客戶(hù)端

客戶(hù)端之后的每次請(qǐng)求header中都帶上這個(gè)token

服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證token,驗(yàn)證成功接收請(qǐng)求

這里我們采用jsonwebtoken來(lái)生成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)來(lái)更新token的有效期,但這里使用了express_jwt中間件,express_jwt不提供方法來(lái)刷新token

思路:

客戶(hù)端請(qǐng)求登錄成功,生成token

將此token保存在redis中,設(shè)置redis的有效期(例如1h)

新的請(qǐng)求過(guò)來(lái),先express_jwt驗(yàn)證token,驗(yàn)證成功, 再驗(yàn)證token是否在redis中存在,存在說(shuō)明有效

有效期內(nèi)客戶(hù)端新的請(qǐng)求過(guò)來(lái),提取token,更新此token在redis中的有效期

客戶(hù)端退出登錄請(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中存在,更新有效期,不存在說(shuō)明已退出登錄
    checkRedis: (req, res, next) => {
        const tok = token.getToken(req)
        redis.get(tok, (data) => {
            if (data) {
                // token 在redis中存在,延長(zhǎng)過(guò)期時(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://systransis.cn/yun/88464.html

相關(guān)文章

  • 步一搭建react應(yīng)用-使用 jwt + redis 來(lái)做基于token用戶(hù)身份認(rèn)證

    摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址基于的認(rèn)證流程客戶(hù)端用戶(hù)發(fā)登錄請(qǐng)求服務(wù)端驗(yàn)證用戶(hù)名密碼驗(yàn)證成功服務(wù)端生成一個(gè),響應(yīng)給客戶(hù)端客戶(hù)端之后的每次請(qǐng)求中都帶上這個(gè)服務(wù)端對(duì)需要認(rèn)證的接口要驗(yàn)證,驗(yàn)證成功接收請(qǐng)求這里我們采用來(lái)生成,使用驗(yàn)證驗(yàn)證成功會(huì)把 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 基于token的認(rèn)證流程 客...

    Scholer 評(píng)論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶(hù)身份認(rèn)證中使用來(lái)寫(xiě)單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫(xiě)一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...

    BigTomato 評(píng)論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶(hù)身份認(rèn)證中使用來(lái)寫(xiě)單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫(xiě)一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...

    lylwyy2016 評(píng)論0 收藏0
  • 2017-09-10 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選如何制作離線友好的表單淺談前端狀態(tài)管理年學(xué)習(xí)的一些建議我遇到的前端面試題并發(fā)模型與中文和的比較介紹掘金使用實(shí)踐一步一步搭建應(yīng)用使用來(lái)做基于的用戶(hù)身份認(rèn)證個(gè)人文章下劃線是否破壞可讀性從看的掘金從零開(kāi)始教你寫(xiě)一個(gè)包前 2017-09-10 前端日?qǐng)?bào) 精選 如何制作離線友好的表單?淺談前端狀態(tài)管理2017 年學(xué)習(xí) React + Redux 的一些建議我遇到的前端面試題2017J...

    elva 評(píng)論0 收藏0
  • react技術(shù)棧實(shí)踐(從前到后擼一個(gè)電影搜集應(yīng)用)

    摘要:其實(shí),該復(fù)雜的東西在哪放都復(fù)雜,只不過(guò)現(xiàn)在更清晰一點(diǎn)使用不好的地方就是太繁瑣了,定義各種各種組件。。。。。 之前做了個(gè)好電影搜集的小應(yīng)用,前端采用react,后端采用express+mongodb,最近又將組件間的狀態(tài)管理改成了redux,并加入了redux-saga來(lái)管理異步操作,記錄一些總結(jié) 在線地址 手機(jī)模式 源碼 主要功能 爬取豆瓣電影信息并錄入MongoDB 電影列表展示...

    tigerZH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<