2016-09-30 21 views
7

Tôi hiện đang sử dụng Angular 1.5.8, Firebase 3.3.0AngularFire 2.0.2. Khi tôi gọi $firebaseAuth.$signInWithPopup, lời hứa sẽ trả về với người dùng Firebase bao gồm firebase.user.idToken, nhưng khi tôi gọi $onAuthStateChanged, người dùng Firebase không trở về với thuộc tính .user. Mã thông báo chính xác để sử dụng cho xác thực máy chủ từ hàm $ onAuthStateChanged là gì?

Tôi đã sử dụng thuộc tính md, nhưng sau đó nó ngừng hoạt động và chuyển sang thuộc tính kd và tôi nhận ra rằng không phải mọi người dùng đều có điều đó. Có phải tài sản là _lat không? Dường như nó hoạt động theo cách này, nhưng tôi dường như không tìm thấy bất kỳ tài liệu nào xung quanh nó. Hoặc đây không phải là cách chính xác để sử dụng mã thông báo trên một Thay đổi trạng thái Auth? Có cách nào tốt nhất không? Đây là đối tượng tôi đã được trả lời từ lời hứa.

enter image description here

tôi appologize cho hình ảnh, nhưng những gì là kỳ lạ là nếu tôi JSON.stringify (firebaseUser) và in nó, tôi kết thúc với một đối tượng hoàn toàn khác nhau, nơi firebaseUser.stsTokenManager.accessToken sẽ cho tôi chìa khóa đúng, nhưng nếu tôi thử firebaseUser.stsTokenManager.accessToken nó nói rằng stsTokenManager là không xác định.

{ 
    "uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "displayName": "Luke Schlangen", 
    "photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "email": "[email protected]", 
    "emailVerified": true, 
    "isAnonymous": false, 
    "providerData": [ 
    { 
     "uid": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
     "displayName": "Luke Schlangen", 
     "photoURL": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
     "email": "[email protected]", 
     "providerId": "google.com" 
    } 
    ], 
    "apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "appName": "[DEFAULT]", 
    "authDomain": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "stsTokenManager": { 
    "apiKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "refreshToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "accessToken": "XXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "expirationTime": XXXXXXXXXXXXXXXXXXXXXXXXXX 
    }, 
    "redirectEventId": null 
} 

Hiện tại, tất cả mã có vẻ hoạt động và dường như đang hoạt động cho mọi người dùng, nhưng tôi tự hỏi, có cách nào tốt nhất cho việc này không? Tôi có nên sử dụng JSON để chuyển đổi và sau đó chọn thuộc tính từ đối tượng đó? Hoặc là _lat cách thích hợp để lấy khóa này?

var app = angular.module("sampleApp", ["firebase"]); 
app.controller("SampleCtrl", function($scope, $firebaseArray, 

$firebaseAuth, $http) { 
    var auth = $firebaseAuth(); 

    $scope.logIn = function login(){ 
    auth.$signInWithPopup("google").then(function(firebaseUser) { 
     console.log("Signed in as:", firebaseUser.user.displayName); 
    }).catch(function(error) { 
     console.log("Authentication failed: ", error); 
    }); 
    }; 

    auth.$onAuthStateChanged(function(firebaseUser){ 
    // firebaseUser will be null if not logged in 
    if(firebaseUser) { 
     // This is where we make our call to our server 
     $http({ 
     method: 'GET', 
     url: '/secretData', 
     headers: { 
      id_token: firebaseUser._lat 
     } 
     }).then(function(response){ 
     $scope.secretData = response.data; 
     }); 
    }else{ 
     console.log('Not logged in.'); 
     $scope.secretData = "Log in to get some secret data." 
    } 

    }); 

    $scope.logOut = function(){ 
    auth.$signOut().then(function(){ 
     console.log('Logging the user out!'); 
    }); 
    }; 
}); 

Mã đầy đủ có thể được tìm thấy tại github

+0

Chúng tôi đang làm việc với phiên bản nào? Tôi đoán đây là AngularFire nhưng nó thậm chí không được đề cập ở đây. – Kato

+0

Các phiên bản mới nhất kéo hôm nay. Repo của tôi có tại GitHub.com/LukeSchlangen/nodeFire –

+2

Góc 1.5.8, Firebase 3.3.0 và AngularFire 2.0.2. – Kato

Trả lời

8

Nó không phải là rõ ràng những gì bạn đang cố gắng làm. Không truy cập các thuộc tính nội bộ bị xáo trộn vì chúng sẽ thay đổi. Bạn đã nhận thấy điều đó. Cách chính xác là gọi getToken trong trình nghe onAuthStateChanged:

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    user.getIdToken().then(function(idToken) { 
     console.log(idToken); 
    }); 
    } 
}); 
+0

firebase.User.prototype.getToken không được dùng nữa. Vui lòng sử dụng firebase.User.prototype.getIdToken để thay thế. – flashsnake

+0

Tôi đã cập nhật câu trả lời. – bojeil

Các vấn đề liên quan