首页 > 解决方案 > 在 Node Js 中处理基于令牌的授权

问题描述

我是 Node Js 的新手。之前,我使用 Laravel API。在 Laravel 中,我使用保存在数据库中的令牌来处理 Endpoints 以使用某些端点。例如:localhost:3000/api/users/getall?token=1234。如果没有令牌通过,API 会说Unauthorized access and no token provided. 如果令牌无效,那么系统会说Invalid token。这样,我如何使用保存在 Mongo 数据库中的令牌来验证端点?

用户模型

var bcrypt = require('bcryptjs');
var mongoose = require('mongoose');
var userSchema = new mongoose.Schema(
{
    fname : {type: String, required: true, max: 25, trim: false},
    uname : {type: String, required: true, max: 25, trim: false},
    password : {type: String, required: true},
    token : {type: String, required: true},
    role: {type: String, required: true}, //0 - admin, 1 - counter
},
{
    timestamps:true
});

mongoose.model('User', userSchema);
module.exports = mongoose.model('User');

以下用户 getAll 端点只能由管理员访问

getAll 端点

router.get("/", function (req, res, next)
{
    User.find()
    .select('fname uname')
    .exec()
    .then(docs => {
        return res.send(setting.status("User details retrieval successfully", true, docs))
    .catch(err => {
        return res.send(setting.status("Error in retrieving user details",false, err))
    });
    });
});

})

上面的 getAll 路由现在也可以由管理员和计数器访问。并且它不检查数据库中的令牌(即:可以在没有令牌的情况下访问)。

如何使用令牌检查和验证?

标签: node.jstoken

解决方案


在做任何事情之前,从查询参数中获取令牌并验证它。如果它无效,只需发送“ 401 Unauthorized ”状态,或任何您喜欢的响应。

router.get("/", function (req, res, next) {      
  const token = req.query.token
  if (!isValid(token)) return res.status(401).end()

  User.find()
    .select('fname uname')
    .exec()
    .then(docs => {
      return res.send(setting.status("User details retrieval successfully", true, docs))
    })
    .catch(err => {
      return res.send(setting.status("Error in retrieving user details",false, err))
    });
})

确保您明确返回,否则执行将继续。或者只是使用一个if-else声明。


推荐阅读