1

我开始这个示例项目来学习流星:

https://github.com/andrewarrow/question-raven/

我试图复制一个流行的问答网站功能只是为了学习流星。

在我的登录表单上方,我在模板中有这个:

 {{#if invalid }}
<div style="background-color: yellow; padding: 3px 3px 3px 3px;">
login invalid, please try again.
</div>
{{/if}}

我开始这样的登录逻辑:

Template.hello.events = {
  'click #login' : function () {
    var email = $('#email').val();
    var password = $('#password').val();
    if (false) {
      Session.set('user_id', 1);
    } else {
      Session.set('invalid', 1);
    }
  }
};

然后为了使无效变量在模板中工作,我有这个函数:

Template.hello.invalid = function () {
  return Session.get('invalid') != null;
};

这是正确的方法吗?模板引用的每个变量都必须是函数吗?我是否应该使用会话存储来记录登录无效,以便函数可以返回真/假?

4

3 回答 3

4

您现在可以为此使用accounts-base、accounts-ui 和accounts-*(各种登录服务)包。在调用 loginWith* 方法并提供一个回调(如果发生不好的事情时会出错)之后,您可以使用 Session 为失败的登录创建反应通知。例子:

Template.hello.events = {
  'click #login' : function () {
    var email = $('#email').val();
    var password = $('#password').val();
    Meteor.loginWithPassword(email, password, function (err) {
      if (err) Session.set("loginError", true);
    });
  }
};

新文档很好地解释了它:

http://docs.meteor.com/#meteor_loginwithpassword

于 2012-12-14T01:38:25.913 回答
0

简短的回答 - 你不能这样做(还)。但我相信流星团队正在努力工作,因为目前它是框架中的一个大漏洞。

在此示例中执行此操作的方式在任何客户端框架中都是不安全的,因为您正在设置 javascript 变量的值以强制执行身份验证。我可以Session.set('invalid', null);在 chrome 控制台中运行并自己登录。

登录的规范方法是让服务器对密码进行哈希处理并将其与数据库中的用户名/密码表进行比较,如果有效,则在另一个数据库表中创建一个具有过期日期时间的会话令牌,然后将会话令牌提供给浏览器向您发送未来的请求(通常存储在 cookie 中)。这在 Meteor 中不起作用,因为客户端对数据库中的任何集合具有完全的读/写访问权限。

您可能会运行一个 Meteor 不知道的完全独立的数据库,并在使用 node.js 代码访问它的服务器上设置流星函数(完全使用 pybassing 流星集合)。您可以仅发布/订阅该数据库中的公共数据,以查看客户端中的数据自动更新。这真的很混乱,我什至不肯定它会起作用——如果你现在需要身份验证,最好不要使用流星。

部分解决方案(并且非常容易实现)是使用 HTTP 身份验证。它不适用于用户系统,因为没有人可以注册,但它会阻止陌生人看到您的代码/访问您的数据库。

于 2012-04-16T04:10:43.033 回答
0

如果您想了解登录错误的更多详细信息,Meteor 实际上会将错误参数中的“原因”字符串传递给 Meteor.loginWithPassword 的回调。这就是我实现 Meteor.loginWithPassword 的方式:

Meteor.loginWithPassword(username, password, function(error) {
  if(error !== undefined){
    setAlert('error', 'Error in processing login. ' + error.reason + '.');
  }
});
于 2013-01-20T22:06:16.030 回答