express -rate-limit не работает при развертывании на героку - PullRequest
0 голосов
/ 21 июня 2020

У меня этот код работает на localhost (отправка не вызывает проблем, только express -rate-limit), но когда я развертываю / pu sh его в моем приложении heroku и делаю почтовый запрос, он превышает максимальный предел который равен 3.

const router = require('express').Router();
const nodemailer = require('nodemailer');
const rateLimit = require("express-rate-limit");

const apiLimit = rateLimit({
    windowMs: 24 * 60 * 60 * 1000, // 24 hrs
    max: 3, // limit each IP to 3 requests per windowMs
    message: "Spam detected!"
});

router.route('/').post(apiLimit,(req, res) => {

    const transport = nodemailer.createTransport({
        service: 'gmail',
        host : "smtp.gmail.com",
        port : "465",
        ssl : true,
        auth: {
        user: process.env.USER,
        pass: process.env.PASS
    }
    });

    const mailOptions = {
        from: '',
        to: '<myemail>',
        subject: req.body.subject,
        text: "FROM: "+ req.body.email + " MESSAGE: " + req.body.message
    };

    transport.sendMail(mailOptions, (err, info) => {
        err ? res.json(res.status(400).json("Error " + err)) : res.json("Email sent.");
    });

});

module.exports = router ;

, обслуживающий локальный хост, работает, когда я запрашиваю более 3 раз, он возвращает сообщение об обнаружении спама и больше не отправляет почту. когда я использую расширение rest api на vscode, это показывает. X-Ratelimit-Remaining: 2 не изменится, если я сделаю еще несколько почтовых запросов.

HTTP/1.1 200 OK
Server: Cowboy
Connection: close
X-Powered-By: Express
Access-Control-Allow-Origin: *
X-Ratelimit-Limit: 3
X-Ratelimit-Remaining: 2
Date: Sun, 21 Jun 2020 03:09:11 GMT
X-Ratelimit-Reset: 1592793933
Content-Type: application/json; charset=utf-8
Content-Length: 13
Etag: W/"d-EBrE0f9LbjD0DZTwvOVLMa8Lqo8"
Via: 1.1 vegur

"Email sent."

1 Ответ

1 голос
/ 21 июня 2020

Кажется вероятным, что модуль express -rate-limit не получает правильный IP-адрес для клиента, когда вы запускаете его на heroku? Возможно, из-за того, что heroku использует прокси перед вашим сервером?

Согласно документации express -rate-limit :

// Enable if you're behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc)
// see https://expressjs.com/en/guide/behind-proxies.html
// app.set('trust proxy', 1);

Итак, похоже возможно, вам понадобится:

app.set('trust proxy', 1);

Это приведет к заполнению значений req.ip и req.ips списком адресов из заголовка X-Forwarded-For, который, вероятно, будет тем, что express -rate- ограничитель необходим при работе за прокси.

...