我想用 Meteor 构建以下功能:
用户访问网站并收到登录/注册表单,仅此而已。我根本不希望客户端从服务器获得任何其他信息。只是最简单的登录/注册表单。
如果用户成功登录或注册,那么我才希望将完整的应用程序及其所有模板等下载到客户端。
用 Meteor 可以做到这一点吗?
我想用 Meteor 构建以下功能:
用户访问网站并收到登录/注册表单,仅此而已。我根本不希望客户端从服务器获得任何其他信息。只是最简单的登录/注册表单。
如果用户成功登录或注册,那么我才希望将完整的应用程序及其所有模板等下载到客户端。
用 Meteor 可以做到这一点吗?
我认为你有几个选择:
[Hard] 单颗流星app
在 Meteor 的其余部分参与之前,连接到节点请求处理管道并在那里进行拦截。在 server.js 中可能最容易做到这一点。不能使用 Meteor 构造 - 必须使用常规节点和 NPM 包,但您可以将登录令牌写入同一个 MongoDB 后端。
[更简单] 两个 Meteor 应用程序
编写一个单独的 Meteor 应用程序,它只进行登录并将令牌写入同一个数据库,然后重定向到不同的 URL。使用反向代理来控制哪个应用程序处理哪个 URL。
[最简单] 在 Meteor 核心中等待服务端渲染支持
猜测它会在 2014 年第二季度初的某个时候到来
尚未测试过这些,但我认为只要登录令牌最终出现在数据库上的用户帐户中并且根域相同,这将起作用。
== 更新 ==
关于登录应用,这个氛围包提供了预制的登录页面(需要IronRouter):
== 更新 2 ==
2 Meteor 应用解决方案适用于更一般的情况,“我想将我的应用拆分到不同的‘区域’”。在简单登录表单的 OP 询问的特定情况下,我们可以只使用静态 HTML 页面作为初始登录页面,甚至不用担心 2nd Meteor 应用程序。反向代理将在这两个端点之间路由流量:
使用 Route53 和 S3 存储桶之类的东西,我认为甚至可以直接从 CDN 提供初始登录页面,尽管我还没有完成所有工作。
提供登录屏幕的最简单方法,然后是完整的应用程序,可能是拥有一个静态登录页面,并使用 Asteroid 登录用户,这是一个 DDP 客户端,您可以配置它与 Meteor 后端对话。执行登录后,您将重定向到 Meteor 应用程序。
var asteroid = new Asteroid("https://example.com/app:3000");
asteroid.loginWithTwitter();
许多现代 SPA 在登录后重定向到子域:例如,Optmizely 和 Intercomapp.(optimizely|intercom).com
在登录后重定向到,NewRelic 重定向到rpm.newrelic.com
. 如果您导航到并显示您的用户名而不是“登录”,Optimizely 就会知道您/
已登录,但 NewRelic 不会打扰,只显示“登录”。要在静态页面中确定用户是否已登录应用程序,您可以检查Meteor.loginTokenExpires
localStorage 中的时间戳。如果您想在用户登录后自动重定向用户,您可以编写:
if (Date.now() < Date.parse(window.localStorage.getItem('Meteor.loginTokenExpires'))) {
window.location.replace('https://example.com/app');
}
不过要小心域。example.com
将无权访问app.example.com
. 此外,这意味着他们无法再次看到登录页面,除非他们注销。
在您的模板中,您可以这样做:
<body>
{{#if currentUser}}
{{> logged_in_template}}
{{else}}
{{> not_logged_in_template}}
{{/ if}}
</body>
currentUser 仅在用户登录时可用。
{{currentUser}}
-文档: http ://docs.meteor.com/#template_currentuser