我正在尝试将移动设备与应用程序的桌面部分分开,并认为我尝试使用DDP.connect作为移动应用程序与桌面应用程序共享数据的方法。
我的第一个障碍是关于Meteor内部收藏和出版物。
我应该如何验证用户身份?我知道我可以调用login方法对用户进行身份验证,但是这仍然没有给我以前用于Meteor.users的所有其他好的反应功能
这是否应该有效,如果是的话,模式是什么。
由于
答案 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.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
相同。在验证时,用户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)
创建用户帐户/身份验证:
在client.js中,创建DDP连接并将其设置为Accounts.connection
Accounts.connection = Meteor.remoteConnection;
在客户端创建一个Accounts.users集合,并从外部服务器订阅其内容,如下所示。
Accounts.users = new Meteor.Collection(&#39; users&#39;,{connection:Meteor.remoteConnection});
Meteor.remoteConnection.subscribe(&#39;用户&#39);
现在调用如下所示的登录方法,并设置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); } });
上述代码的问题在于,每次手动客户端刷新后都会重置令牌。结果对象包含以下登录信息。我们必须为每个外部客户端刷新获取令牌并使用令牌登录。
ID:&#34; 5RigABaSzbARHv9ZD&#34; 令牌:&#34; MItg8P59gsl_T5OXtaWRSjUnETqzns0hGEV26xWYxj7&#34; tokenExpires:2017年7月20日星期四12:46:31 GMT + 0530(印度标准时间)
在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;,令牌); } }); }
Meteor在使用令牌登录时抛出错误
使用令牌登录时出错:错误:您已被服务器注销。请再次登录。 [403]
要解决此问题,我们必须编写跟踪器功能来跟踪已登录的会话并在需要时再次登录。这基本上是流星论坛中提出的黑客攻击。
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;,令牌); } }); }});
如果用户导航到登录路径,请重置localStorage。在Layout.js中,
如果(路径==&#39; /登录&#39;) localStorage.setItem(&#39; _storedLoginToken&#39;,NULL);