在Node Js中处理基于令牌的授权

时间:2019-01-05 19:45:34

标签: node.js token

我是Node Js的新手。之前,我曾使用Laravel API。在Laravel中,我使用保存在数据库中的令牌处理端点以使用某些端点。例如:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.may.Application</mainClass> </configuration> </plugin> </plugins> </build> 。如果没有传递令牌,则API将显示localhost:3000/api/users/getall?token=1234。如果令牌无效,则系统将显示Unauthorized access and no token provided。以这种方式,如何使用Mongo数据库中保存的令牌来验证端点?

用户模型

Invalid token

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

getAll端点

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路由现在也可以由admin和counter访问。而且它不是从数据库中检查令牌(即:可以不带令牌访问)。

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

2 个答案:

答案 0 :(得分:0)

在执行任何操作之前,请从查询参数中获取令牌并对其进行验证。如果无效,只需发送“ 401未经授权”状态或您喜欢的任何答复。

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语句。

答案 1 :(得分:0)

您可以使用中间件来验证请求。在server.js上

//validate requests
app.use ('/', function (req, res, next) {
  if (
    // except the public requests (for login ...)
    req.originalUrl.indexOf ('/public') > -1
  ) {
    next ();
  } else {
    if (
      // Compare with your token
      req.query &&
      req.query.hasOwnProperty ('access_token') &&
      req.query.access_token === 'YOUR_TOKEN'
    ) {
      next ();
    } else {
      // STOP
      return res.json ({
        success: false,
        message: 'Failed to authenticate.',
      });
    }
  }
});

希望有帮助。