Meteor - 客户端上的单页应用程序,但只有在登录后 - 我该如何做到这一点?

时间:2013-10-17 17:17:16

标签: meteor

我想用Meteor构建以下功能:

  1. 用户访问该网站时会看到一个登录/注册表单,而不是其他任何内容。我不希望客户端从服务器获得任何其他信息。只是最简单的登录/注册表单。

  2. 如果用户成功登录或注册,只有这样我才能将完整的应用程序及其所有模板等下载到客户端。

  3. Meteor可以实现这一目标吗?

3 个答案:

答案 0 :(得分:8)

我认为你有几个选择:

  • [Hard]单个流星应用

    进入节点请求处理管道并在其他Meteor参与之前进行拦截。可能最容易在server.js中执行此操作。不能使用Meteor构造 - 必须使用常规节点和NPM包,但您可以将登录令牌写入同一个MongoDB后端。

  • [更容易]两个Meteor应用程序

    编写一个单独的Meteor应用程序,仅执行登录并将令牌写入同一个数据库,然后重定向到不同的URL。使用reverse proxy来控制哪个应用处理哪个网址。

  • [最简单]等待Meteor核心中的服务器端渲染支持

    猜测它将在2014年第二季度初出现

没有对这些进行测试,但我认为只要登录令牌最终在数据库上的用户帐户中并且根域相同,这就行了。

==更新==

关于登录应用程序,此氛围包提供预制登录页面(需要IronRouter):

==更新2 ==

2 Meteor应用程序解决方案适用于更为通用的“我希望将我的应用程序拆分到不同的'区域'”。在OP询问的简单登录表单的特定情况下,我们可以使用静态HTML页面作为初始登录页面,甚至不用担心第二个Meteor应用程序。反向代理将在这两个端点之间路由流量:

  • 静态服务的登录页面(Nginx,apache等)
  • 真正的流星应用

使用Route53和S3存储桶之类的东西,我认为甚至可以直接从CDN提供初始登录页面,尽管我还没有完成所有工作。

答案 1 :(得分:3)

提供登录屏幕的最简单方法,然后完整的应用程序,可能是拥有一个静态登录页面,login the user on it using Asteroid,一个可以配置为通话的DDP客户端到流星后端。执行登录后,您将重定向到Meteor应用程序。

var asteroid = new Asteroid("https://example.com/app:3000");
asteroid.loginWithTwitter();

许多现代SPA在登录后重定向到子域:例如,Optmizely和Intercom在登录后重定向到app.(optimizely|intercom).com,NewRelic重定向到rpm.newrelic.com。如果您导航到/并显示您的用户名而不是“登录”,则Optimizely知道您已登录,但NewRelic不打扰并只显示“登录”。要在静态页面中确定用户是否登录到应用程序,您可以在localStorage中检查Meteor.loginTokenExpires的时间戳。如果您想在用户登录时自动重定向,可以写下:

if (Date.now() < Date.parse(window.localStorage.getItem('Meteor.loginTokenExpires'))) {
    window.location.replace('https://example.com/app');
}

尽管小心域名。 example.com无法访问app.example.com的localStorage。此外,这意味着除非他们退出,否则他们无法再次看到目标网页。

答案 2 :(得分:-3)

在您的模板中,您可以执行以下操作:

<body>
   {{#if currentUser}}
     {{> logged_in_template}}
   {{else}}
     {{> not_logged_in_template}}
   {{/ if}}
</body>

currentUser仅在用户登录时可用。

{{currentUser}} - 文档:http://docs.meteor.com/#template_currentuser