繁体   English   中英

仅服务器本身可以访问NodeJS,Express,Mongoose RESTFul Api

[英]NodeJS, Express, Mongoose RESTFul Api access only by the server itself

我使用NodeJS,Mongoose和Express构建了一个简单的RESTful API。 我正在使用数据库存储简单的字符串引号,并且不打算允许任何其他用户访问数据库或api。

我已经阅读过有关保护RESTful API的信息,但似乎大多数方法都集中在使用用户名和密码来限制访问。 但是,对于这样一个简单的API来说,这似乎是一个矫kill过正,尤其是因为我不考虑允许除服务器本身发出的请求之外的任何其他人进行访问。

因此,我想这样做,以便如果其他人尝试访问该API,则将拒绝该访问。 应该可以访问API的唯一方法是来自服务器本身的请求,即来自服务器上的JavaScript文件。

我目前正在学习所有这些内容,如果我没有使用正确的技术术语,抱歉:)

我正在考虑做一些事情,例如检查试图访问API的人的IP,如果不是服务器的IP,则拒绝访问。 这样的事情会起作用吗,我将如何实现它。

编辑:我正在寻找简单的东西,因为我认为大多数人不会花时间来“破解” API,以便他们可以访问报价数据库。

这是我的server.js

var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');
var mongoose   = require('mongoose');
var Quote     = require('./mongodb/models/mainModel.js');
mongoose.connect('mongodb://localhost:27017/myappdb');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 8080;

var router = express.Router();

function grantAccess(req) {
  if(req.ip === '::1'  ||
     req.ip === '127.0.0.1' ||
     req.ip === '::ffff:127.0.0.1') {
    return true;
  }
  return ["IP Address Unknown " + req.ip]
}

router.get('/', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });
});

router.route('/maindb')

    .post(function(req, res) {

        var quote = new Quote();    
        quote.name = req.body.name; 
        quote.severity = req.body.severity;
        quote.createdAt = new Date();
        quote.updatedAt = new Date();

        quote.save(function(err) {
            if (err)
                res.send(err);

            res.json({ message: 'Quote created!' });
        });

    })

    .get(function(req, res) {
        if(grantAccess(req) !== 'boolean')
        Quote.find(function(err, quotes) {
            if (err)
                res.send(err);

            res.json(quotes);
        });
    });

    router.route('/maindb/:quote_id')
        .get(function(req, res) {
            Quote.findById(req.params.quote_id, function(err, quote) {
                if (err)
                    res.send(err);
                res.json(quote);
            });

        })
        .put(function(req, res) {


            Quote.findById(req.params.quote_id, function(err, quote) {

                if (err)
                    res.send(err);

                quote.name = req.body.name;
                quote.severity = req.body.severity;
                quote.updatedAt = new Date();
                // save the bear
                quote.save(function(err) {
                    if (err)
                        res.send(err);

                    res.json({ message: 'Quote updated!' });
                });

            });
        })
        .delete(function(req, res) {
            Quote.remove({
                _id: req.params.quote_id
            }, function(err, quote) {
                if (err)
                    res.send(err);

                res.json({ message: 'Successfully deleted' });
            });
        });


app.use('/api', router);

app.listen(port);
console.log('Magic happens on port ' + port);

您可以在项目中添加apiKey。 如果有人点击您的任何api,则将需要该文件。

例如:

"apiKeys": {
        "web":     "7fe642cabe6855cd4175937fa8fadd876c1af6b499ab941db6a8a362c0f30f97"
    }

同样,您可以为移动用户或根据项目要求设置apikey。

链接以生成RandomKey

这样一来,您将只允许拥有您的api密钥的用户。由于api密钥由您共享,因此您只能将其提供给适当的用户。

api密钥检查:

您可以在对服务器的任何请求之前将api密钥检查为第一个中间件

例:

router.use(function(req,res,next){
var apiKey = req.get('api_key'); // assuming user will send api key in headers
// code to check api key basic comparison
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM