DDP.connect и Meteor.users

Я пытаюсь отделить мобильную часть своего приложения от настольной и подумал, что попробую DDP.connect как средство обмена данными между мобильным приложением и настольным приложением.

Мое первое препятствие касается внутренних коллекций и публикаций Meteor.

Как я должен аутентифицировать пользователей? Я знаю, что могу вызвать метод входа в систему для аутентификации пользователя, но это все равно не дает мне всех других приятных реактивных функций, к которым я привык с Meteor.users.

Должно ли это работать, и если да, то какова схема.

Спасибо


person Jamgold    schedule 12.02.2015    source источник


Ответы (4)


Это то, что полностью интегрировано с удаленным сервером (кроме обновления кода, которое забывает сеанс пользователя)

if (Meteor.isClient) {
 Meteor.connection = DDP.connect('http://remote.site.com');
 Accounts.connection = Meteor.connection;
 Meteor.users = new Meteor.Collection('users');
 SomeCollection = new Meteor.Collection('remote_collection');
 Meteor.connection.subscribe('users');
 Meteor.connection.subscribe('remote_collection');
 // rest if the code just as always
}

Таким образом, вы можете напрямую использовать вход в систему (через базу учетных записей, учетные записи и т. д.) и вам не нужно вызывать метод входа в систему. Просто добавьте учетные записи и включите {{>loginButtons}}, и все заработает.

person Jamgold    schedule 13.02.2015

У меня была аналогичная проблема. Я хотел иметь два разных интерфейса (хотя оба предназначены для настольных компьютеров) для одного и того же сервера, чтобы они могли использовать одну и ту же базу данных, публикации и методы. После просмотра исходного кода Meteor (версия 1.1.0.3) мне удалось сделать это следующим образом.

1) Запустите проект базового сервера.

$ meteor --port 3100

2) В проектах внешнего интерфейса добавьте следующее в server/server.config.js.

var backendUrl = process.env.BACKEND_URL;

if (backendUrl) {
    __meteor_runtime_config__.BACKEND_URL = backendUrl;
    __meteor_runtime_config__.ACCOUNTS_CONNECTION_URL = backendUrl;

    console.log('config', __meteor_runtime_config__);
}

3) В внешних проектах добавьте следующее в client/lib/client.connection.js. APS — это просто пространство имен для моего приложения. Обязательно загрузите его, прежде чем использовать подписки или методы (поэтому он находится в папке lib).

if (typeof APS == 'undefined') APS = {};

var backendUrl = __meteor_runtime_config__.BACKEND_URL;

if (backendUrl) {
    APS.backendConnection = DDP.connect(backendUrl);

    Meteor.connection = APS.backendConnection;

    _.each(['subscribe', 'methods', 'call', 'apply', 'status', 'reconnect', 'disconnect'], function(name) {
        Meteor[name] = _.bind(Meteor.connection[name], Meteor.connection);
    });

    console.log('connected to backend', APS.backendConnection);
}

4) Запустите внешний сервер с переменной среды BACKEND_URL, указывающей на внутренний сервер.

$ BACKEND_URL=http://192.168.33.10:3100 meteor

Это все. Обновление на клиенте работает нормально. И нам не нужно возиться с Accounts.*.


ОБНОВЛЕНИЕ: только что обнаружил проблему с моим решением. При вызове серверных методов this.userId всегда равно null. Это потому, что Meteor.connection и Accounts.connection были двумя отдельными соединениями, несмотря на одно и то же BACKEND_URL. При аутентификации идентификатор пользователя ассоциируется только с последним. Фиксированный client.connection.js выглядит следующим образом.

if (typeof APS == 'undefined') APS = {};

var backendUrl = __meteor_runtime_config__.BACKEND_URL;

if (backendUrl) {
    APS.originalConnection = Meteor.connection;

    // Accounts is already connected to our BACKEND_URL
    APS.backendConnection = Accounts.connection;
    // Reusing same (authenticated) connection for method calls and subscriptions
    Meteor.connection = APS.backendConnection;

    _.each(['subscribe', 'methods', 'call', 'apply', 'status', 'reconnect', 'disconnect'], function(name) {
        Meteor[name] = _.bind(Meteor.connection[name], Meteor.connection);
    });

    console.log('Connected to backend', APS.backendConnection);
}
person vgrechka    schedule 12.08.2015

Вы можете аутентифицироваться с помощью такого кода:

var connection = DDP.connect("<url>")

Для аутентификации

connection.call("login", {"password":"qwerty","user":{"username":"user_1"}});

чтобы получить пользователя, добавьте его на другой сервер)

Meteor.methods({
    whoami: function() { return Meteor.user() }
});

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

console.log(connection.call("whoami");
person Tarang    schedule 12.02.2015
comment
Я нашел этот ответ и сделал это, но впоследствии не было объекта Meteor.user. Как мне получить доступ к {currentUser}? - person Jamgold; 13.02.2015
comment
Понятно, спасибо за обновление ответа. Это означает, что шаблоны программирования в отношении аутентификации и пользователей будут полностью отличаться от локального метеора. - person Jamgold; 13.02.2015
comment
@Akshat Мне нужно использовать Meteor.user() на другом сервере для определенного метода. Как отправить значения Meteor.user()? Безопасно отправлять пользовательские значения в качестве параметра. - person Ramesh Murugesan; 15.07.2016

Создание/аутентификация учетной записи пользователя:

  1. В client.js создайте соединение DDP и установите для него значение Accounts.connection.

    Accounts.connection = Meteor.remoteConnection;

  2. Создайте коллекцию Accounts.users в клиенте и подпишите ее содержимое с внешнего сервера, как показано ниже.

    Accounts.users = new Meteor.Collection('users', {connection: Meteor.remoteConnection});

    Meteor.remoteConnection.subscribe('пользователи');

  3. Теперь вызовите требуемый метод входа в систему, как показано ниже, и установите токен, возвращаемый в localStorage. Это работает для всех внутренних кликов и маршрутизации.

    Meteor.loginWithPassword (электронная почта для входа, пароль для входа, функция (ошибка) { submit_button.button («сброс»); если (ошибка) { console.log (ошибка); pageSession.set («errorMessage», err.message); вернуть ложь; }else{ console.log("Вы вошли как "+Meteor.userId()); var token = Accounts._storedLoginToken(); localStorage.setItem('_storedLoginToken', token); } });

  4. Проблема с приведенным выше кодом заключается в том, что токен сбрасывается после каждого ручного обновления клиента. Объект результата содержит приведенную ниже информацию о входе. Мы должны брать токен и входить в систему с ним для каждого обновления внешнего клиента.

    id: токен «5RigABaSzbARHv9ZD»: токен «MItg8P59gsl_T5OXtaWRSjUnETqzns0hGEV26xWYxj7» Срок действия: четверг, 20 июля 2017 г., 12:46:31 GMT+0530 (стандартное время Индии)

  5. В client.js при запуске вызывайте функцию loginwithtoken с возвращенным токеном, как показано ниже, всякий раз, когда пользователь недоступен.

    пользователь var = Meteor.user(); var token = localStorage.getItem('_storedLoginToken'); if(user==null){ console.log("Token"+token+user); if(token) Meteor.loginWithToken(token, function(err){ // это вызовет ошибку, если мы выйдем из системы if(!err) { console.log('вошел в систему !!!! ',token); } }); }

  6. Meteor выдает ошибку при входе в систему с токеном,

    Ошибка при входе с токеном: Ошибка: вы вышли из системы на сервере. Пожалуйста, войдите снова. [403]

  7. #P15# <блочная цитата> #P16#
  8. Сбросьте localStorage, если пользователь переходит к пути входа в систему. В Layout.js,

    if(path=='/login') localStorage.setItem('_storedLoginToken',null);

person sandhya murugesan    schedule 24.04.2017