#angularjs #firebase #angularfire #firebasesimplelogin
# #angularjs #firebase #angularfire #firebasesimplelogin
Вопрос:
Здравствуйте, я использую AngularJS Firebase с Angular Fire, пытаясь создать простое приложение для блога, похожее на tumblr, чтобы узнать все тонкости AngularJS. Не используя какие-либо угловые начальные значения или не переходя к конкретному руководству, просто изучаю вещи, как мне нужно.
У меня работает простая система входа в систему $ firebase. Я создал простую форму регистрации пользователя, и когда пользователь отправляет, я запускаю $CreateUser(), который работает, а затем загружаю все данные профиля, которые пользователь вводит в набор данных с помощью user.id возвращается обещанием CreateUser. В документе API говорится, что их аргумент, оставленный пустым, автоматически регистрирует пользователя после создания, однако я прочитал в нескольких местах, что это было удалено, и документ остался не обновленным. Также в обычном API Firebase упоминается, что пользователь должен войти в систему после создания учетной записи. Я попытался запустить метод $login() внутри возвращенного обещания создания учетной записи следующим образом:
$scope.signUp = function(newuser){
var userData = newuser;
var userRef = new Firebase(FB_URL 'users');
$scope.users = $firebase(userRef); //oooohhhhhh
$rootScope.loginObj.$createUser(newuser.email,newuser.password).then(function(user){
var child = $scope.users.$child(user.id);
child.$set({name:userData.fullname,email:userData.email});
$rootScope.loginObj.$login('password',userData.email,userData.password).then(function(user,error){
$location.path('/home');
},function(error){
console.log(error);
});
//$rootScope.loginObj.user = user;
//$rootScope.currentUser = user;
//$location.path('/home');
//$rootScope.loginObj.$login('password', userData.email, userData.password).then(function(user){
// $location.path('/home');
//},function(error){
// console.log(error);
//});
},function(error){
console.log(error);
});
};
И он выдает мне эту ошибку:
Error {code: "UNKNOWN_ERROR", data: Object, stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: A…ple-login/1.5.0/firebase-simple-login.js:188:231)", message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."}
code: "UNKNOWN_ERROR"
data: Object
message: "FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred."
stack: "Error: FirebaseSimpleLogin: FirebaseSimpleLogin: An unknown error occurred.↵ at Error (native)↵ at Object.fb.simplelogin.Errors.format (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:33:294)↵ at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:275↵ at fb.simplelogin.providers.Password_.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:90:196)↵ at https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:209↵ at r (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:151)↵ at new n (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:60:79)↵ at fb.simplelogin.client.loginWithPassword (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:176:81)↵ at fb.simplelogin.client.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:173:85)↵ at Object.login (https://cdn.firebase.com/js/simple-login/1.5.0/firebase-simple-login.js:188:231)"
get stack: function () { [native code] }
set stack: function () { [native code] }
__proto__: d
Я также попытался вызвать метод, который я создал внутри контроллера, который похож на $scope.login(email, password), но это тоже не сработало. Когда пользователь регистрируется, предполагается, что он переходит к домашнему просмотру, который ограничен зарегистрированными пользователями. если пользователь не прошел проверку подлинности, он возвращает их обратно в представление входа. Итак, как и сейчас, пользователь создает свою учетную запись, затем перенаправляется в / home, они не отображаются как аутентифицированные, а затем возвращаются к логину.
Моя конфигурация маршрутизатора:
app.config(['$routeProvider', '$locationProvider',
function($routeProvider, $locationProvider) {
$routeProvider
.when('/admin', {
templateUrl: 'admin.html',
controller: 'AdminController',
needsAuth: true
})
.when('/home', {
templateUrl: 'home.html',
controller: 'HomeController',
needsAuth: true
})
.when('/login', {
templateUrl: 'app/html/login-form.html',
controller: 'LogInController',
needsAuth: false
})
.otherwise({redirectTo: '/home'});
}]);
И вот логика, которая проверяет, аутентифицирован ли пользователь после запуска routechange:
app.run(function ($rootScope, $firebaseSimpleLogin, $location) {
$rootScope.$on('$routeChangeStart', function (event, next, $firebaseSimpleLogin, $scope, $rootScope) {
//console.log(event.targetScope);
console.log(event.targetScope.currentUser);
event.targetScope.loginObj.$getCurrentUser().then(function(user){
var userAuthenticated = null;
if (user || event.targetScope.currentUser)
var userAuthenticated = true;
//console.log(userAuthenticated);
if(!userAuthenticated amp;amp; next.needsAuth){
$location.path('/login');
}
}, function(error){
console.log(error);
});
});
Я попытался обойти проблему, создав отдельную переменную с именем CurrentUser и загрузив в нее пользовательские данные, возвращаемые функцией CreateUser, а затем проверяя это тоже, когда он переводит их в домашний вид. И это работает, но затем, если пользователь обновляет, они теряют эту информацию, потому что она не сохраняется в сеансе, который, как я предполагаю, делает $login .
Ответ №1:
Второй аргумент для $login — это не адрес электронной почты и пароль (например, CreateUser), а объект; тот же API, что и основной метод FirebaseSimpleLogin.
Итак, этот код:
$rootScope.loginObj.$login('password',userData.email,userData.password).then(...)
Должно выглядеть примерно так:
var options = {email: userData.email, password: userData.password};
$rootScope.loginObj.$login('password', options).then(...)
Смотрите Документы API в разделе $login для получения более подробной информации и примеров.