欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

[記錄三]Vue+node+koa2+mysql+nginx+redis,全棧開發(fā)小程序和管理員管理 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

[記錄三]Vue+node+koa2+mysql+nginx+redis,全棧開發(fā)小程序和管理員管理

發(fā)表時間:2020-9-21

發(fā)布人:葵宇科技

瀏覽次數(shù):53

項目中凡是涉及到用戶登錄注冊的都需要一個登錄態(tài)來驗證用戶的登錄狀態(tài),常用的登錄臺無外乎是token、session啊這些標識。這里我使用的是token字段。token一般會包含用戶的個人信息,如:賬號、賬號id、用戶名等等,更為安全的是加入一個自定義的鹽(salt)一起加密,防止用戶信息泄漏。下面就一起來使用一下:

說到token,肯定會想到后端是怎么知道前端給我的token是不是我傳給他的有效值呢?就是說后端需要有個值去跟前端傳過來的token進行比較才知道合法性。所以后端在生成token的同時自己也需要將這個生成的token存下來備用。我這里選用的redis。它是一個數(shù)據(jù)庫,以鍵值對的形式存儲,這樣我就可以將生成的token存儲下來了。至于redis的安裝和部署這里就不累贅了,這里直接將使用。
在項目根目錄下新建一個redis文件夾。其下新建一個redis.js文件。

//redis.js
const Redis = require('ioredis')//導入模塊
const redis = {
    port: 6379,          // Redis port
    host: '127.0.0.1',   // Redis host
    prefix: '***', //存諸前綴
    ttl: 60 * 60 * 24 * 7 * 1000,  //過期時間   
    family: 4,
    db: 0
}
const redisClient = new Redis(redis)
//導出備用
module.exports = redisClient

這樣redis就可以使用了。

本文使用jsonwebtoken進行加密和解密。
因為加密和解密是很多接口都需要用的東西,所以我將這些方法寫到公共的部分去。
utils文件下建一個common.js,用來存放公共的方法。

//common.js
const secret = require('./secret')//導入自定義的鹽
const jwt = require('jsonwebtoken')//導入jsonwebtoken
const verify = util.promisify(jwt.verify) // token解密
const common = {//定義一個對象
  //加密
  //后端生成唯一的key
  /*
  * paylod:包含來用戶的信息
  * secret.secret 自定義的鹽(salt)
  * expiresIn 設置這個token的有效期
  */
  //jwt.sign是jsonwebtoken模塊的一個方法,可以將傳入的信息加密
  getToken(paylod, expiresIn) {
    return jwt.sign(paylod, secret.secret, expiresIn)
  },
  //解密
  //根據(jù)收到的token獲取用戶信息
  getUserInfo(token) {
    return verify(token, secret.secret) 
  },
}
//導出這個對象給外部使用
module.exports=common

新建一個secret.js文件用來存放自定義的信息

在這里插入圖片描述
?? 這里建議鹽最好亂寫 寫得越亂越好,各種字符都加上,并亂序?qū)憽?/p>

加密

我們在用戶登錄成功的時候?qū)⒂脩粜畔⒓用?。所以我在我的管理員登錄接口那寫。

我的在routes文件下的admin.js文件

//admin.js
const router = require('koa-router')()
const api = require('../controllers/api')
const redisClient = require('../redis/redis.js')
const common = require('../util/comon')

router.prefix('/admin')
//管理員登錄
router.post('/userLogin', async (ctx, next) => {
	/*寫你的接口邏輯*/
	//定義一個用戶信息對象
	const paylod = {
        name: '登錄用戶的用戶名',
        userid: '登錄用戶的id',//登錄時可查表查拿到用戶id
        author: '13414851033@163.com',
        type:'***',
        timestamp: new Date()//加個時間戳保證加密后token的唯一性
    }
    
    /*核心代碼*/
    
    // 調(diào)用上面公共的token加密方法(注:這里是沒有傳鹽進去的,我是直接在common文件引入來鹽)
    // expiresIn設置token的有效期是7天
    const token = await common.getToken(paylod, { expiresIn: '7 days' })
    //每次登錄之前先清除掉所有的有關此用戶的key(根據(jù)用戶id)
    let preToken = await redisClient.get(result.userid)
    //這個preToken就是當初登錄時redis存下來的key
    await redisClient.del(preToken)
    //用token作為key、自定義的token前綴+token作為值 傳key給前端作為校驗
    await redisClient.set(token, secret.identif + token)
    //再生成一對鍵值對 用來記錄是屬于哪個用戶的token 用戶id作為key 傳給前端的token(上一條鍵值對的key)作為值
    await redisClient.set(result.userid,token)
    ctx.body = {
        status: 200,
        code: 200,
        message: '登錄成功',
        data: result,
        token: token//將token傳給前端
    }
}

這樣登錄成功后的話前端就能收到后端生成的唯一性的token了,同時我也生成了兩對的鍵值對。一對是以token為key,以自定義的token前綴為value;一對是以用戶id為key,以token作為值的數(shù)據(jù)。在用戶登錄時拿到用戶的id,在redis中清除掉以這個用戶id為key的記錄,再存入一條以token為key的記錄。這樣就能保證每次用戶登錄該用戶都是只有一個合法的key(就是所謂的同一個賬戶在多地登錄會擠掉其他人的登錄狀態(tài))。

解密

加密完之后客戶端請求必然需要帶上登錄態(tài)token來操作數(shù)據(jù),但是不可能在客戶端去傳用戶的數(shù)據(jù),那樣太不安全了,這樣我上面生成token時將用戶信息加進去的數(shù)據(jù)就有用處了,只要解密我就能知道這個token所攜帶的用戶信息了。這個token客戶端看到也是不知道用戶信息的,所以相對來說比較安全些。

在common.js寫了一個獲取前端傳入的token(走請求頭傳入,不以參數(shù)的形式)

//common.js
 //根據(jù)請求頭的信息獲取前端傳入的token
 getHeaderToken(ctx) { 
   if (ctx.header && ctx.header.token) { 
     return ctx.header.token
   }
 }
const common = require('../util/comon')
//刪除管理員
router.post('/****', async (ctx, next) => {
	let token = await common.getHeaderToken(ctx)
	let userInfo = await common.getUserInfo(token)
	//用戶名
	console.log(userInfo.name)
	//用戶id
	console.log(userInfo.userid)
}

所以,只要前端傳入token,后端就能知道這個token所攜帶的用戶的信息,方便后端處理數(shù)據(jù)所需的必備條件。

以上就是本文介紹token的使用,下文將介紹根據(jù)token登錄態(tài)控制接口請求權(quán)限。

上一篇:編寫接口路由
下一篇:token控制接口權(quán)限

相關案例查看更多