我一直试图弄清楚如何在我的ember.js应用中正确实现firebase的simpleLogin blog post和source code无效。
博客文章示例使用github作为身份验证提供程序,但我需要使用电子邮件&密码选项。我到目前为止成功地将用户添加到有问题的firebase的注册用户并且可以吐回user.id和user.email,但我无法登录用户,因为它没有将用户添加到firebase用户/路径。
AuthController.js
App.AuthController = Ember.Controller.extend({
authed: false,
currentUser: null,
init: function() {
this.authClient = new FirebaseSimpleLogin(dbRef, function(error, user) {
if (error) {
alert('Authentication failed: ' + error);
} else if (user) {
this.set('authed', true);
var userRef = new Firebase(usersPath + '/simplelogin:' + user.id);
var controller = this;
var properties = {
id: user.id,
email: user.email
};
userRef.once('value', function(snapshot) {
var user = App.User.create({ ref: userRef });
user.setProperties(properties);
controller.set('currentUser', user);
});
} else {
this.set('authed', false);
}
}.bind(this));
},
login: function() {
this.authClient.login('password', {
email: this.get("email"),
password: this.get("password"),
rememberMe: this.get("remember")
});
},
logout: function() {
this.authClient.logout();
},
createUser: function() {
var email = createEmail.value;
var password = createPassword.value;
this.authClient.createUser(email, password, function(error, user) {
if (!error) {
console.log('User Id: ' + user.id + ', Email: ' + user.email);
}
}
)}
});
创建用户模板
<form {{action createUser on='submit'}} class="form-horizontal" role='form'>
<div class='form-group'>
<label class="col-sm-5 control-label" for='createEmail'><p class='lead'>What's your email?</p></label>
<div class="col-sm-7">
{{input type="email" classNames="form-control" value=createEmail id="createEmail" placeholder="Don't worry, we won't spam you..."}}
</div>
</div>
<div class='form-group'>
<label class="col-sm-5 control-label" for='createPassword'><p class='lead'>Choose a password...</p></label>
<div class="col-sm-7">
{{input type="password" classNames="form-control" value=createPassword id="createPassword" placeholder="Make it super hard to guess!"}}
</div>
</div>
<div class='form-group'>
<label class="col-sm-5 control-label" for='confirm'><p class='lead'>And confirm it</p></label>
<div class="col-sm-7">
{{input type="password" classNames="form-control" value=confirm id="confirm" placeholder="Make sure you know what you typed..."}}
</div>
</div>
<button type='submit'>Submit</button>
</form>
如果您需要查看更多我的代码,请告诉我,我会把它扔到这里。谢谢!
@ kingpin2k你有什么想法吗?
由@ mike-pugh提供的答案:
我的AuthController现在看起来像这样:
App.AuthController = Ember.Controller.extend({
authed: false,
currentUser: null,
init: function() {
this.authClient = new FirebaseSimpleLogin(dbRef, function(error, user) {
if (error) {
alert('Authentication failed: ' + error);
} else if (user) {
this.set('authed', true);
var userRef = new Firebase(usersPath + '/simplelogin:' + user.id);
var controller = this;
var properties = {
id: user.id,
email: user.email
};
userRef.once('value', function(snapshot) {
var data = snapshot.val();
var user = App.User.create({ ref: data});
user.setProperties(properties);
controller.set('currentUser', user);
});
} else {
this.set('authed', false);
}
}.bind(this));
},
login: function() {
console.log('made it inside login');
console.log(email.value);
console.log(password.value);
console.log(remember.value);
this.authClient.login('password', {
email: email.value,
password: password.value,
rememberMe: remember.value
});
},
logout: function() {
this.authClient.logout();
},
createUser: function() {
console.log('made it inside createUser');
var email = createEmail.value;
console.log(email);
var password = createPassword.value;
console.log(password);
this.authClient.createUser(email, password, function(error, user) {
if (!error) {
console.log('User Id: ' + user.id + ', Email: ' + user.email);
var userRef = new Firebase(usersPath + '/simplelogin:' + user.id);
userRef.set({
email: user.email,
id: user.id
});
}
}
)}
});
我还必须添加一个空的UserModel:
App.User = EmberFire.Object.extend({
});
就是这样!现在我可以进行身份验证,然后提取当前的用户数据。
答案 0 :(得分:2)
Firebase简单登录功能不会将用户添加到您的锻造中的用户/路径。它将用户存储在某个系统定义的区域中。如果要在用户/路径中存储有关用户的数据,则需要创建该信息。
例如:
createUser: function() {
var that = this;
var email = createEmail.value;
var password = createPassword.value;
this.authClient.createUser(email, password, function(error, user) {
if (!error) {
console.log('User Id: ' + user.id + ', Email: ' + user.email);
var userRef = new Firebase(usersPath + '/simplelogin:' + user.id);
userRef.set({email: user.email}); // This is where you'd add Display Name, phone #, whatever
that.authClient.login('password', email, password);
}
}
)}
您的登录代码似乎正确调用Firebase简单登录代码,登录时应触发您在构造函数中指定的回调。在该回调中,我认为您将要将userRef.once()方法更改为:
userRef.once('value', function(snapshot) {
var data = snapshot.val();
var user = App.User.create({ ref: data});
user.setProperties(properties);
controller.set('currentUser', user);
});
once()成功回调为您提供该路径上数据的快照,因此您需要绑定到该信息而不是仅仅是Firebase参考的userRef对象本身。