1. 程式人生 > >用 node 實現仿微信風格的 token 獲取介面

用 node 實現仿微信風格的 token 獲取介面

流程圖

這裡寫圖片描述

依賴項

"dependencies": {
    "express": "^4.12.3",
    "jsonwebtoken": "^5.0.0",
    "mongoose": "^4.0.2",
    "redis-fast-driver": "0.0.9",
  }

獲取token程式碼

function get_interface_token(req, res) {

    Jiekou.findOne({username: req.query.username}, function (err, interface_find) {

        if
(err) throw err; if (!interface_find) { res.json({success: false, message: '認證失敗,使用者名稱找不到'}); } else if (interface_find) { // 檢查密碼 if (interface_find.password != req.query.password) { res.json({success: false, message: '認證失敗,密碼錯誤'}); } else
{ //為介面加入token建立時間,使得每次獲取的token都不一樣 var time = new Date(); interface_find.token_create_time = time; // 建立token var token = jwt.sign(interface_find, config.secret, { expiresInMinutes: 1440 // 設定過期時間 }); r.rawCall(['hmset'
, req.query.username, 'token', token], function (err, d) { if (err) throw err; }); r.rawCall(['EXPIRE', req.query.username, config.token_expire_time], function (err, d) { if (err) throw err; }); // json格式返回token res.json({ success: true, message: 'Enjoy your token!', token: token }); } } }) }

檢測token程式碼

function checktoken(req, res, next) {

    //檢查post的資訊或者url查詢引數或者頭資訊
    var token = req.body.token || req.query.token || req.headers['x-access-token'];

    // 解析 token
    if (token) {

        // 確認token
        jwt.verify(token, config.secret, function (err, decoded) {
            if (err) {
                return res.json({success: false, message: 'token資訊錯誤.'});
            } else {
                console.log(decoded.username);
                r.rawCall(['HEXISTS', decoded.username, 'token'], function (err, d) {
                    if (err) throw err;
                    console.log(d)
                    if (d === 1) {
                        // 如果沒問題就把解碼後的資訊儲存到請求中,供後面的路由使用
                        req.decoded = decoded;
                        next();
                    } else {
                        return res.status(403).send({
                            success: false,
                            message: 'token已經過期!'
                        });
                        next()
                    }
                })


            }
        });

    } else {

        // 如果沒有token,則返回錯誤
        return res.status(403).send({
            success: false,
            message: '沒有提供token!'
        });

    }
}

程式碼檔案結構