Подтвердить что ты не робот

Аутентификация с помощью Meteor через DDP (и SRP?)

Я не могу найти какую-либо полезную информацию об аутентификации пользователя с помощью Meteor DDP.

Возможно ли это? Если да, то какой лучший способ это сделать? Как вы можете удаленно входить в Meteor с помощью SRP?

В настоящее время я использую прямое Node (в конечном итоге будет использовать Express) вместе с этим Node ddp-клиентом.

4b9b3361

Ответ 1

Чтобы войти в систему через DDP, просто отправьте вызов метода. Вы немного изменяете его в зависимости от того, как вы хотите войти.

Я буду использовать ddp-tools, чтобы попытаться объяснить, как войти в систему, поскольку это будет общение с чисто ddp. Детали входа в приведенные ниже примеры:

Имя пользователя user_1, пароль qwerty (да, я знаю его плохо), а адрес электронной почты [email protected], токен входа MxNY9BFPKra2uNWG7

Формат

ddp call <method call name> [<param1>..]

То же самое, что и делать ddpclient.call(<method call name>,<param1>,callback) в nodejs

Чтобы войти в систему с помощью электронной почты и пароля

ddp call 'login' '{"password":"qwerty","user":{"email":"[email protected]"}}'

Чтобы войти в систему с именем пользователя и паролем

ddp call 'login' '{"password":"qwerty","user":{"username":"user_1"}}'

Чтобы войти в систему с токеном (какой метеорит сохраняется при входе в систему:

ddp call 'login' '{"resume":"MxNY9BFPKra2uNWG7"}'

-

Трудный: SRP

Если вы не хотите отправлять пароль в виде обычного текста, как описано выше, вы не используете SSL-защищенное/https-соединение, которое вы можете использовать SRP.

Чтобы войти в систему с SRP, это немного сложнее, поскольку у нее есть несколько этапов.

1. Begin a passwordExchange to establish the key to communicate the hash
2. Send a login call with the hash calculated using the reply from 1)

Шаг 1:

-Begin обмен паролями SRP:

ddp call 'beginPasswordExchange' '{"A":"A","user":{"email":"[email protected]"}}

Ответ будет выглядеть как

{"identity":"identity","salt":"salt","B":B"}

Затем вы можете использовать это для входа:

ddp call 'login' '{"srp":{"M":"srp hash"}}'

Аналогичным образом вы можете использовать имя пользователя вместо указанного выше сообщения.

Итак, чтобы получить значения M, и A вам нужна библиотека SRP. Поскольку в meteor есть библиотека SRP, ее легко объяснить, как получить пароль от каждого, это довольно сложно. Если вы хотите написать один на другом языке, вы можете использовать описание wikipedia для создания методов

Итак, мы начинаем обмен srp (из библиотеки SRP в пакете SRS meteors), поскольку вы используете node.js, вы можете включить все файлы в свой проект (за исключением package.js)

var srp = new SRP.Client(password);

Это даст вам A, после чего вы получите данные, которые вы можете ответить:

var response = srp.respondToChallenge(result);

Это, наконец, даст вам SHA-хэш, чтобы ответить с помощью "M", взяв "B" и соль.

Наконец

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

srp.verifyConfirmation({HAMK: result.HAMK}

Снова все это из библиотеки SRP в Meteor, но все они являются частью спецификации SRP, как на wikipedia. Meteor SRP использует SHA256 в качестве функции хеширования.

Примеры:

Ответ 2

Ближе всего я нашел это, но это в загадочном Objective-C:-P https://github.com/boundsj/ObjectiveDDP/blob/master/Example/Example/LoginViewController.m

Функции, которые он вызывает, находятся в C, хотя: https://github.com/boundsj/ObjectiveDDP/blob/master/ObjectiveDDP/srp/srp.c

И Meteor SRP unit test находится здесь: https://github.com/meteor/meteor/blob/master/packages/srp/srp_tests.js

и код Meteor srp находится здесь: https://github.com/meteor/meteor/blob/master/packages/srp/srp.js

Вам понадобится хотя бы это: https://github.com/jedp/node-srp

Удачи. Я пытаюсь понять, как это сделать в Java, и это более загадочно, чем большинство схем шифрования. Самая сложная часть - выяснить, как Meteor кодирует личность, но в коде Meteor srp, который вы, вероятно, можете поднять, поскольку он находится в Javascript: -)

Ответ 3

Пакет теперь делает часть входа, добавляющую метод loginWithPassowrd к соединению DDP.

meteor add ongoworks:ddp-login

Тогда:

// Get the connection
var conn = DDP.connect(Meteor.absoluteUrl());

// Pass the connection to `DDP.loginWithPassword`, which is otherwise similar to
// the core `Meteor.loginWithPassword` method.
DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) { ... })