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

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

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

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

3 ответов


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

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

на имя пользователя is user_1, пароль is qwerty (да, я знаю, что это плохо), и адрес электронной почты is email@email.com, то маркер входа is MxNY9BFPKra2uNWG7

формат

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

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

для входа в систему с электронной почтой и паролем

ddp call 'login' '{"password":"qwerty","user":{"email":"email@email.com"}}'

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

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

для входа в систему с маркер (что meteor сохраняет при входе в систему в:

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:

-начать обмен паролями SRP:

ddp call 'beginPasswordExchange' '{"A":"A","user":{"email":"email@email.com"}}

ответ будет что-то вроде

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

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

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

аналогично вы можете использовать логин вместо почты.

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

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

var srp = new SRP.Client(password);

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

var response = srp.respondToChallenge(result);

это, наконец, даст вам хеш SHA для ответа с использованием "M", принимая " B " и соль.

наконец-то

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

srp.verifyConfirmation({HAMK: result.HAMK}

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

примеры:


ближе всего я нашел это, но это в загадочной цели-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

и модульный тест SRP Meteor здесь: https://github.com/meteor/meteor/blob/master/packages/srp/srp_tests.js

и Код Метеор srp здесь: https://github.com/meteor/meteor/blob/master/packages/srp/srp.js

вам понадобится по крайней мере это: https://github.com/jedp/node-srp

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


пакета теперь делает часть входа в систему, добавляя метод 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) { ... })