DDP.connect和Meteor.users

时间:2015-02-12 17:47:29

标签: meteor ddp

我正在尝试将移动设备与应用程序的桌面部分分开,并认为我尝试使用DDP.connect作为移动应用程序与桌面应用程序共享数据的方法。

我的第一个障碍是关于Meteor内部收藏和出版物。

我应该如何验证用户身份?我知道我可以调用login方法对用户进行身份验证,但是这仍然没有给我以前用于Meteor.users的所有其他好的反应功能

这是否应该有效,如果是的话,模式是什么。

由于

4 个答案:

答案 0 :(得分:5)

这是与远程服务器完全集成的内容(代码刷新除外,它会忘记用户会话)

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
}

通过这种方式,您可以直接使用登录(通过帐户基础,帐户传递等),而无需调用登录方法。只需添加帐户-ui并包含 {{> loginButtons}} 即可使用

答案 1 :(得分:5)

我有类似的问题。我希望将两个不同的前端(尽管两者都用于桌面)连接到同一个后端,因此他们可以使用相同的数据库,出版物和方法。在查看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.jsAPS只是我的应用程序的命名空间。在使用订阅或方法(这就是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.connectionAccounts.connection是两个独立的连接,尽管BACKEND_URL相同。在验证时,用户ID仅与后者相关联。固定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);
}

答案 2 :(得分:2)

您可以使用以下代码进行身份验证:

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");

答案 3 :(得分:0)

创建用户帐户/身份验证:

  1. 在client.js中,创建DDP连接并将其设置为Accounts.connection

    Accounts.connection = Meteor.remoteConnection;

  2. 在客户端创建一个Accounts.users集合,并从外部服务器订阅其内容,如下所示。

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

    Meteor.remoteConnection.subscribe(&#39;用户&#39);

  3. 现在调用如下所示的登录方法,并设置localStorage中返回的令牌。这适用于所有内部点击和路由。

    Meteor.loginWithPassword(login_email,login_password,function(err){       submit_button.button(&#34;重置&#34);       如果(错)       {     的console.log(ERR);     pageSession.set(&#34; errorMessage&#34;,err.message);     返回false;         }其他{         console.log(&#34;登录为&#34; + Meteor.userId());          var token = Accounts._storedLoginToken();         localStorage.setItem(&#39; _storedLoginToken&#39;,token);         }     });

  4. 上述代码的问题在于,每次手动客户端刷新后都会重置令牌。结果对象包含以下登录信息。我们必须为每个外部客户端刷新获取令牌并使用令牌登录。

    ID:&#34; 5RigABaSzbARHv9ZD&#34; 令牌:&#34; MItg8P59gsl_T5OXtaWRSjUnETqzns0hGEV26xWYxj7&#34; tokenExpires:2017年7月20日星期四12:46:31 GMT + 0530(印度标准时间)

  5. 在client.js中,只要没有可用的用户,启动就会使用返回的令牌调用loginwithtoken函数,如下所示。

    var user = Meteor.user();   var token = localStorage.getItem(&#39; _storedLoginToken&#39;); 如果(用户== NULL){   console.log(&#34; Token&#34; + token + user);   如果(令牌)     Meteor.loginWithToken(标记,函数(错误){       //如果我们退出,这会抛出错误       if(!err){          console.log(&#39;登录!!!!&#39;,令牌);        }     }); }

  6. Meteor在使用令牌登录时抛出错误

    使用令牌登录时出错:错误:您已被服务器注销。请再次登录。 [403]

  7. 要解决此问题,我们必须编写跟踪器功能来跟踪已登录的会话并在需要时再次登录。这基本上是流星论坛中提出的黑客攻击。

      

    Tracker.autorun(function(){var user = Meteor.user(); var token   = localStorage.getItem(&#39; _storedLoginToken&#39;); if(user == null){console.log(&#34; Token&#34; + token + user);如果(令牌)       Meteor.loginWithToken(标记,函数(错误){         //如果我们退出,这会抛出错误         if(!err){                console.log(&#39;登录!!!!&#39;,令牌); }       }); }});

  8. 如果用户导航到登录路径,请重置localStorage。在Layout.js中,

    如果(路径==&#39; /登录&#39;)    localStorage.setItem(&#39; _storedLoginToken&#39;,NULL);