我正在尝试将移动设备与应用程序的桌面部分分开,并认为我尝试将 DDP.connect 作为移动应用程序与桌面应用程序共享数据的一种方式。
我的第一个障碍是关于 Meteor 的内部收藏和出版物。
我应该如何对用户进行身份验证?我知道我可以调用 login 方法对用户进行身份验证,但这仍然没有提供我习惯使用 Meteor.users 的所有其他不错的反应特性
这应该有效吗,如果可以,模式是什么。
谢谢
这是与远程服务器完全集成的内容(代码刷新除外,它会忘记用户会话)
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
}
这样您就可以直接使用登录(通过帐户库、帐户传递等),而无需调用登录方法。只需添加accounts-ui并包含{{>loginButtons}}它就可以了
我有一个类似的问题。我想有两个不同的前端(尽管两者都是桌面)到同一个后端,所以他们可以使用相同的数据库、出版物和方法。查看 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);
}
您可以使用如下代码进行身份验证:
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");
用户帐户创建/身份验证:
在 client.js 中,创建一个 DDP 连接并将其设置为 Accounts.connection
Accounts.connection = Meteor.remoteConnection;
在客户端创建一个 Accounts.users 集合,并从外部服务器订阅其内容,如下所示。
Accounts.users = new Meteor.Collection('users', {connection: Meteor.remoteConnection});
Meteor.remoteConnection.subscribe('users');
现在调用如下所需的登录方法并设置在 localStorage 中返回的令牌。这适用于所有内部点击和路由。
Meteor.loginWithPassword(login_email, login_password, function(err) { submit_button.button("reset"); if (err) { console.log(err); pageSession.set("errorMessage", err.message); return false; }else{ console.log("登录为 "+Meteor.userId()); var token = Accounts._storedLoginToken(); localStorage.setItem('_storedLoginToken', token); } });
上述代码的问题在于,每次手动客户端刷新后都会重置令牌。结果对象包含以下登录信息。每次外部客户端刷新时,我们都必须获取令牌并使用令牌登录。
id:"5RigABaSzbARHv9ZD" token:"MItg8P59gsl_T5OXtaWRSjUnETqzns0hGEV26xWYxj7" tokenExpires:Thu Jul 20 2017 12:46:31 GMT+0530 (India Standard Time)
在 client.js 中,只要没有可用的用户,启动时使用返回的令牌调用 loginwithtoken 函数,如下所示。
var user = 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('logged in !!!! ',token); } }); }
Meteor 使用令牌登录时抛出错误,
使用令牌登录时出错:错误:您已被服务器注销。请重新登录。[403]
为了克服这个问题,我们必须编写一个跟踪器函数来跟踪登录的会话并在需要时再次登录。这基本上是流星论坛中建议的黑客攻击。
Tracker.autorun(function () { var user = 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('logged in !!!! ',token); } }); } });
如果用户导航到登录路径,请重置 localStorage。在 Layout.js 中,
if(path=='/login') localStorage.setItem('_storedLoginToken',null);