Как создать правильную идентификацию пользователя, используя хэшированные значения - PullRequest
1 голос
/ 08 мая 2019

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

Вот история:

Я разрабатываю приложение для платформы электронной коммерции Shopify. Когда продавец первоначально получает доступ к приложению, Shopify отправляет в приложение подтверждение hmac. При проверке авторизации Shopify hmac проверяет приложение, хранит cookie-файл «shopname» и отправляет страницу приложения в ответ. Дело в том, что когда продавец следует по другим маршрутам приложения, нет никаких способов проверить, действительно ли он является тем, кем он является. Единственное информационное приложение, имеющееся на этих маршрутах, - cookie-файл «shopname». Я придумал несколько случайных значений хеша для идентификации продавцов. Что я делаю, так это создаю hmac (как cookie «app-token») из случайных значений и сохраняю их и дату создания в БД под значением «shopname».

Когда маршрут получает запрос, приложение считывает cookie-файлы «shopname» и «app-token» и запрашивает в БД сохраненные значения. Затем проверяет, прошло ли не более 1 дня с момента создания 'app-token', создает hmac из этих значений и проверяет cookie 'app-token' на равенство. Если прошло более 1 дня, продавец перенаправляется на маршрут авторизации Shopify hmac, а новый hmac cookie «app-token» генерируется и сохраняется в БД (это единственное место, где он генерируется).

Вот как сейчас выглядит «app-token»:

var random_num = Math.random().toString();
var auth_hash = crypto.createHash('md5').update(random_num).digest('base64');

var auth_hmac_random_num = Math.random().toString();
var auth_hmac = crypto.createHmac('sha256',auth_hash).update(auth_hmac_random_num).digest('hex');

var auth_hmac_concant_random_num = Math.random().toString();
var auth_hmac_concat = crypto.createHash('md5').update(auth_hmac_concant_random_num).digest('hex');

var auth_hmac = auth_hmac_concat + auth_hmac;

auth_hash, auth_hmac_random_num, auth_hmac_concat хранятся в БД под значением «shopname» как JSON. По запросу проверки auth_hmac_concat удаляется из cookie «app-token», а hmac создается из auth_hash и auth_hmac_random_num и проверяется на «app-token» с помощью crypto.timingSafeEqual(hmac, app_token).

Опять же, я совершенно новичок в бэкенде, и я мог бы слишком усложнять или упрощать вещи. Вопрос в том, что было бы правильным способом идентифицировать торговцев в описанных обстоятельствах? Надеюсь, я был достаточно ясен.

1 Ответ

0 голосов
/ 08 мая 2019

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

Единственный случай, когда вы можете быть умным, это когда ваше приложение имеет обратный вызов, который вы сделали, и сеанс истек.В этом случае вам нужно изящно повторно авторизоваться и вернуть приложение туда, где оно было, чтобы быть вежливым с продавцом.Не многие приложения делают это хорошо, но вы можете.

...