我开始这个示例项目来学习流星:
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;
};
这是正确的方法吗?模板引用的每个变量都必须是一个函数吗?我应该使用Session存储来记录登录无效,这样函数可以返回true / false吗?
答案 0 :(得分: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);
});
}
};
新文档很好地解释了它:
答案 1 :(得分:0)
简短的回答 - 你还不能(还)。但我确信流星团队正在努力,因为它目前在框架中是一个很大的漏洞。
您在此示例中执行此操作的方式在任何客户端框架中都是不安全的,因为您正在设置javascript变量的值以强制执行身份验证。我可以在Chrome控制台中运行Session.set('invalid', null);
并自行登录。
登录的规范方法是让服务器对密码进行哈希并将其与数据库中的用户名/密码表进行比较,如果它有效则在另一个具有过期日期时间的数据库表中创建会话令牌,然后给出会话令牌向浏览器发送以后的请求(通常存储在cookie中)。这在Meteor中不起作用,因为客户端对数据库中的任何集合具有完全读/写访问权限。
你可能有一个完全独立的数据库运行Meteor不知道,并在服务器上设置meteor函数,使用node.js代码访问它(完全pybassing meteor Collections)。您可以只发布/调用该数据库中的公共数据,以查看客户端中的数据自动更新。这将是非常混乱,我甚至不肯定它会工作 - 如果你现在需要身份验证,你最好不要使用流星。
部分解决方案(并且非常容易实现)是使用HTTP身份验证。它不适用于用户系统,因为没有人可以注册,但它会让陌生人看不到你的代码/访问你的数据库。
答案 2 :(得分:0)
如果您想了解登录错误的其他详细信息,Meteor实际上会将错误参数中的'reason'字符串传递给Meteor.loginWithPassword的回调。这就是我实现Meteor.loginWithPassword的方式:
Meteor.loginWithPassword(username, password, function(error) {
if(error !== undefined){
setAlert('error', 'Error in processing login. ' + error.reason + '.');
}
});