Использование Global.var в NodeJS для временного хранения URL-адреса перенаправления для использования после обратного вызова OAuth

У меня есть приложение nodejs (http://app.winetracker.co), и я интегрирую логины OAuth. Я думаю, что могу использовать переменную global.redirectURL для временного хранения URL-адреса перенаправления для использования после обратного вызова OAuth.

// url param passed to route /auth/twitter?redirectUrl=/path/to/location

app.get('/auth/twitter', function(req, res) {
    var redirectUrl = req.param('redirectUrl');
    global.redirectUrl = req.param('redirectUrl');
    passport.authenticate('twitter', {})(req, res);
});
app.route('/auth/twitter/callback').get(users.oauthCallback('twitter'));

Если у меня есть 2 пользователя, которые одновременно входят в мое приложение через OAuth, будут ли значения global.redirectURL перезаписываться значением переменной перенаправления каждого пользователя?

По сути, являются ли глобальные значения уникальными для каждого пользователя или все используют одно и то же значение переменной global.redirectUrl?


node.js oauth global
person tonejac    schedule 14.08.2016    source источник


Ответы (1)


arrow_upward
1
arrow_downward

Если у меня есть 2 пользователя, которые одновременно входят в мое приложение через OAuth, будут ли значения global.redirectURL перезаписываться значением переменной перенаправления каждого пользователя?

Да, они будут перезаписаны, и сделать это таким образом — серьезная проблема.

По сути, являются ли глобальные значения уникальными для каждого пользователя или все используют одно и то же значение переменной global.redirectUrl?

Глобальные значения являются общими для всего вашего сервера, поэтому хранящиеся там данные видны для ВСЕХ запросов всех пользователей, которые могут обрабатываться. Вы никогда не должны хранить такую ​​временную информацию в файле global. Если код авторизации является асинхронным (что я и предполагаю), то вы можете легко получить несколько запросов, нарушающих/конфликтующих с этим глобальным. Это ошибка. Вы должны перейти к другому способу решения проблемы.

Обычные решения для этого типа проблем, которые не имеют уязвимости глобального, включают следующее:

  1. Используйте диспетчер сеансов и поместите данные в сеанс для этого конкретного браузера, чтобы их можно было получить оттуда во время перенаправления.

  2. Поместите информацию в качестве параметра запроса в URL-адрес перенаправления, чтобы, когда браузер вернется с URL-адресом перенаправления, вы могли затем проанализировать его из строки запроса.

  3. Придумайте уникальный идентификатор для этого запроса, установите его как файл cookie и сохраните временные данные на карте, используя идентификатор в качестве ключа. Затем, когда перенаправление вернется, вы можете использовать файл cookie, чтобы получить идентификатор, а затем найти значение на карте. По сути, это сессия, но она специально предназначена именно для этой цели. Чтобы быть тщательным, вы также должны убедиться, что ваша карта не протекает и не накапливается с течением времени, поэтому вам, вероятно, придется хранить временную метку и регулярно очищать карту, удаляя старые значения.

person jfriend00    schedule 14.08.2016
comment
Спасибо! Это полностью проясняет для меня ситуацию. Ваше здоровье. :) - person tonejac; 15.08.2016
comment
Итак, так ли просто сохранить его в req.session? req.session.redirectUrl - person tonejac; 15.08.2016
comment
@tonejac - Если у вас уже установлен сеанс, то все, что вам нужно, это любой механизм, который ваш сеанс использует для сохранения новой информации. Я не был уверен, что сеанс, который использует паспорт, обязательно был установлен для первого пользователя, который еще не прошел аутентификацию. - person jfriend00; 15.08.2016