偽前端設(shè)想JWT構(gòu)建用戶體系【后端】

關(guān)鍵詞:刷新JWT,更新严里,緩存

平臺:數(shù)據(jù)庫(mongodb, mysql),redis

首先在用戶注冊的時候追城,我們需要收集用戶的賬號信息 譬如 id + username + 亂七八糟mix salt 的組合用md5加密成一串用戶初始token刹碾,和用戶信息一起存入數(shù)據(jù)庫,作為用戶在平臺唯一識別token(注意這個token和jwt發(fā)的token不是一回事)座柱。

在用戶注冊登錄的時候就把上述token作為cookie塞給用戶瀏覽器迷帜,存在redis維護一份(這里看策略,一般可能2-4小時后失效)色洞,redis保存信息形式大概為token:{用戶基本信息}
【下面的代碼僅為思路展示戏锹,像很多sql和redis操作不能直接套用,僅供參考】

async login(ctx, next) {
?      try {
?        const {username, pwd} = await Util.treamentFormData(ctx.req)
?        const handlePsw = md5Pwd(pwd)
?        const getCheckUserInfo = await query(
?          `SELECT FROM users WHERE name = ${username} AND vkey = ${handlePsw}`
?        )
?        if (!getCheckUserInfo) {
?          return ctx.body =({code: 1, msg: '用戶名或密碼錯誤'})
?        } else {
?          const userInfo = {username: findOneRes.username, vkey: findOneRes.vkey}
?          const token = Util.setToken(userInfo)
?          const redis = initStone() 
?          redis.set(findOneRes.vkey, JSON.stringify(userInfo) , 'EX', 60 * 60 * 2) *//秒為單位 2個小時redis失效*
?          const CookieOpt = CookieConfig()
?          try {
?            ctx.cookies.set('_token', findOneRes.vkey, CookieOpt)
?          } catch(err) {
?            console.log(err)
?          }
?          ctx.response.body = ({code: 0, data: {...findOneRes._doc, token}})
?        }
?      } catch (e) {
?        ctx.response.body = e
?      }
  },

基于jwt有時效性我們前端調(diào)用的時候先查驗一下jwt的有效時間火诸,這里可以發(fā)起一個請求去獲取最新的jwt锦针,使用cookie作為憑據(jù)(所以這個cookie的時間可以設(shè)長一點,比如一個月)置蜀,然后使用全局變量維護這個拿下來的jwt奈搜,當(dāng)下一個接口請求的時候,會先去本地拿這個對象看看過沒過期盯荤,如果過期了馋吗,去調(diào)這個獲取jwt的接口再拿一次新的,這個接口返回新的token和用戶個人信息

  *// 處理鑒權(quán) 不刷新cookie*
  async accessToken(ctx, next) {
?    try {
?        const getCookie = ctx.request.header.cookie
?       if (getCookie) {
?          *// redis.set('DD', 100, 'EX', 5) //秒為單位*
?          const parseCookie = Util.handleCookie(getCookie)
?          const getCookieToken = parseCookie['_token']
?          const redis = initStone() 
?          const result = await redis.get(`${getCookieToken}`)
?          if (result) {
?            const userInfo = JSON.parse(result)
?            const newToken = Util.setToken(userInfo)
?            ctx.body = ({code: 0, msg: 'success' , data: {token: newToken, userInfo}})
?          } else {
?            const getUserInfo = await query(
?              `SELECT FROM users WHERE vkey = ${handlePsw}`
?            ) 
?            if (getUserInfo) {
?              redis.set(getUserInfo.vkey, JSON.stringify(getUserInfo) , 'EX', 60 * 60 * 2) *//秒為單位 2個小時redis失效*
?              const newToken = Util.setToken(getUserInfo)
?              ctx.body = ({code: 0, msg: 'success' , data: {token: newToken, getUserInfo}})
?            } 
?          }
?       } else {
?          ctx.status = 401
?          ctx.body = ({code: -1, msg: 'fail'})
?       }
?    }  catch(e) {
?       console.log(e)
?    }
  }

這里通過cookie的toke去獲取用戶信息秋秤,如果redis上有這個信息(即_token = redis上的key "_token")宏粤,直接使用redis上的信息頒布新的jwt,如果沒有灼卢,則通過這個token我們可以去查詢數(shù)據(jù)里面?zhèn)€人信息绍哎,查到后再塞一次到redis,并且再返回個人信息和新的jwt給前端芥玉。

{
?   account: {
?       username: '',
                token: ''
?       …otherInfo,
?   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛇摸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灿巧,更是在濱河造成了極大的恐慌赶袄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抠藕,死亡現(xiàn)場離奇詭異饿肺,居然都是意外死亡,警方通過查閱死者的電腦和手機盾似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門敬辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪标,“玉大人,你說我怎么就攤上這事溉跃〈迮伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵撰茎,是天一觀的道長嵌牺。 經(jīng)常有香客問我,道長龄糊,這世上最難降的妖魔是什么逆粹? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮炫惩,結(jié)果婚禮上僻弹,老公的妹妹穿的比我還像新娘。我一直安慰自己他嚷,他們只是感情好蹋绽,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筋蓖,像睡著了一般蟋字。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扭勉,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天鹊奖,我揣著相機與錄音,去河邊找鬼涂炎。 笑死忠聚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唱捣。 我是一名探鬼主播两蟀,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼震缭!你這毒婦竟也來了赂毯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拣宰,失蹤者是張志新(化名)和其女友劉穎党涕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巡社,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膛堤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晌该。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肥荔。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绿渣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燕耿,到底是詐尸還是另有隱情中符,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布誉帅,位于F島的核電站舟茶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堵第。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一隧出、第九天 我趴在偏房一處隱蔽的房頂上張望踏志。 院中可真熱鬧,春花似錦胀瞪、人聲如沸针余。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆雁。三九已至,卻和暖如春帆谍,著一層夾襖步出監(jiān)牢的瞬間伪朽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工汛蝙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烈涮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓窖剑,卻偏偏與公主長得像坚洽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子西土,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354