こんにちは、私は AngularJS + Firebase を Angular Fire で使用しており、AngularJS の内外を学ぶためのシンプルな tumblr のようなブログ アプリを作成しようとしています。angular-seed を使用したり、特定のチュートリアルから離れたりするのではなく、必要に応じて学習するだけです。
$firebase シンプル ログイン システムが動作するようになりました。簡単なユーザー登録フォームを作成し、ユーザーが送信すると、機能する $createUser() を起動し、ユーザーが入力したすべてのプロファイル データを、createUser promise によって返された user.id を使用してデータ セットに読み込みます。APIドキュメントには、空白のままにすると、作成後にユーザーが自動的にログインする引数であると書かれていますが、これが削除され、ドキュメントが更新されていないことをいくつかの場所で読みました。また、通常の Firebase API では、アカウントの作成後にユーザーがログインする必要があることが言及されています。次のように、返されたアカウント作成の promise 内で $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 && next.needsAuth){
$location.path('/login');
}
}, function(error){
console.log(error);
});
});
currentUser という別の変数を作成し、createUser 関数によって返されたユーザー データをロードして、ホーム ビューに移動するときにそれもチェックすることで、問題を回避しようとしました。それは機能しますが、ユーザーが更新すると、セッションに保存されていないため、その情報が失われます。これは $login が行うことです。