Firebase身份验证:在后端获取用户信息

时间:2018-07-11 13:13:19

标签: node.js firebase firebase-authentication

我正在尝试通过标准UI将Firebase身份验证添加到我的node.js应用中。 在我的登录页面上,我添加了以下代码:

// Initialize Firebase
var config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "..."
};
firebase.initializeApp(config);

var ui = new firebaseui.auth.AuthUI(firebase.auth());

ui.start('#firebaseui-auth-container', {
    signInOptions: [
        // List of OAuth providers supported.
        firebase.auth.GoogleAuthProvider.PROVIDER_ID,
        /*firebase.auth.FacebookAuthProvider.PROVIDER_ID,
        firebase.auth.TwitterAuthProvider.PROVIDER_ID,
        firebase.auth.GithubAuthProvider.PROVIDER_ID*/
    ],
    signInSuccessUrl: "firebase-login"
})

到目前为止,一切都很好。显示“使用Google登录”,“ Facebook”等按钮,并且在登录(例如,使用Google)后,将我带回到登录页面,并在一秒钟后将我重定向到firebase-login上面的signInSuccessUrl参数。

现在,在我的背面,我有以下内容:

app.get("/firebase-login", function(req, res){
    res.json("ok");
});

那么如何在firebase-login路由中形成有关登录用户的信息?我需要这样做,以便检查用户是否已经注册等。

1 个答案:

答案 0 :(得分:0)

好吧,我做到了。

在客户端,我必须向ui.start配置添加回调,以检索已登录用户的idToken并将其发布到后端,例如:

ui.start('#firebaseui-auth-container', {
    callbacks: {
        signInSuccessWithAuthResult: function(authResult, redirectUrl) {
            firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
                var form = document.body.appendChild(document.createElement("form"));
                form.action = "/firebase-login";
                form.method = "POST";
                var input = form.appendChild(document.createElement("input"));
                input.type = "hidden";
                input.name = "idToken";
                input.value = idToken;
                form.submit();
            }).catch(function(error) {
                console.error(error);
            });
            return false;
        }
    }, ...

然后在背面,我使用firebase-admin从客户端发布的idToken中获取用户信息,如下所示:

const admin = require('firebase-admin');
var serviceAccount = require('path/to/serviceAccont.json');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://<MY-APP-ID>.firebaseio.com"
});

app.post("/firebase-login", function(req, res){
    admin.auth().verifyIdToken(req.body.idToken)
    .then(function(decodedToken) {
        console.log(JSON.stringify(decodedToken));
    }).catch(function(error) {
        res.json(error);
    });
});

等等! decodedToken包含了我需要的有关用户的所有信息(例如全名,电子邮件,图片url等);