如何从IndexDB中获取Firebase Auth令牌以进行Ajax调用

时间:2019-04-29 06:31:09

标签: javascript ajax firebase jwt indexeddb

我正在使用Node.js / Express托管的移动站点,该站点通过Firebase电话身份验证得到“轻度”保护。首次加载时,该站点基本上是空的。在初始Firebase Phone身份验证之后,JWT令牌通过AJAX调用发送到节点服务器。服务器检查令牌,验证用户是否已授权,然后发回该站点的html内容。

到目前为止,太好了。这是保护简单单页Web应用程序上显示内容的好方法。

但这是我目前的困境。我现在想从站点上的表单提交数据。空白表格是通过第一个AJAX调用创建的。

提交表单后,我想重新提交相同的JWT令牌,以伴随将数据提交到服务器的其他AJAX请求。我不清楚如何获取令牌。我不再处于首先让我获得令牌的链式承诺中……(即,我不再有权访问User Object。)我可以看到令牌存储在IndexedDB-> FirebaseLocalStorageDB- > FirebaseLocalStorage对象->键:值(fbase_key.value.stsTokenManager.accessToken)

这是我在Chrome浏览器中的开发工具的屏幕截图。

Chrome Browser Dev Tools Screen Print

我真的不确定如何从浏览器客户端的JavaScript中访问该令牌。关于如何从这里到达那里有任何想法吗?

注意:我所有的初始客户端脚本代码都包含在

$(document).ready(function () {
...
}

由于时间和功能.on()的绑定,我的数据表单的后续脚本内容是在初始Ajax调用后身份验证之后提供的。

初始AJAX提交的示例代码...显然,提交到服务器的表单数据将包含JSON对象有效负载。

    var authUserAjaxRequest = function (jwt) {
        console.log("authUserAjaxRequest started...");
        $.ajax({
            type: "POST", 
            url: '/fb', //the url to call
            data: {
                data: 'testData'
            }, //Data sent to server
            dataType: "json",
            beforeSend: function (xhr) { //Include the bearer token in header
                xhr.setRequestHeader("Authorization", 'Bearer ' + jwt)
            }
        }).then(function (response) {
            $('#admin_note_loc').html(response.admin_note);
            $('#page2_data').html(response.page2_data);
            $('#page3_summary').html(response.page3_summary);
            $('#page4_team').html(response.page4_team);
        }).fail(function (err) {  //Error during request
        console.log("AuthUserReq Error: ", err);
    });

这里是reference.,还有另一个。这个reference似乎已经过时,或者我做错了。具体的提示表示赞赏。

2 个答案:

答案 0 :(得分:1)

firebase.auth().currentUser.getIdToken(true)
.then((tokenId)=>{
//Your code
})

https://firebase.google.com/docs/auth/admin/verify-id-tokens#web

答案 1 :(得分:0)

这是一个解决方案,但这可能不是最佳解决方案。

我有一个小范围问题。对于我所有的原始javascript代码,我都使用

$(document).ready(function () {
...
}

该代码很好用,可以验证,获取令牌,重新提交等。

我在那里有一些代码

var handleSignedInUser = function (user) {
    // do stuff to display / block key elements on the site.

    user.getIdToken().then(function (token) {
        console.log("getIdToken(): ", token);  // <--  I added this line
        authUserAjaxRequest(token);
    })
};

不幸的是,由于我添加的Ajax的性质,我无法在$(document).ready()包装中包含其控制JavaScript。在将$().on('click'..)函数绑定到新创建的表单元素时出现了一些问题。

嗯。还记得我们使用Microsoft基础类(MFC)并添加句柄链接关键功能的美好时光吗?那给了我一个主意。

我在var firebaseGlobalObject = {};之前的原始脚本中添加了一个全局变量$(document).ready(function () {...

初始化Firebase身份验证工具后,我将其复制到Global变量...

// Initialize Firebase
var config = {
    apiKey: "...",
    authDomain: "....firebaseapp.com",
    databaseURL: "https://....firebaseio.com",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "..."
};
firebase.initializeApp(config);
firebaseGlobalObject = firebase;   // <--- total hack

然后是时候在Chrome Dev Tools Console中玩了...

我想到了这个美女...

console.log(firebaseGlobalObject.auth().currentUser.qa)

完全破解,但它确实显示与getIdToken()完全相同的令牌(在我的初始代码中),并且显示在IndexedDB-> FirebaseLocalStorageDB-> FirebaseLocalStorage对象->键:值(fbase_key。 value.stsTokenManager.accessToken)

很明显,当我使用控制台时,我处于全局环境中。所以我想我可以做这个工作。我会说,我不知道为什么有人选择.qa作为该索引。 firebaseGlobalObject.auth().currentUser处可见许多描述性属性;只是不是那个令牌。

除了黑客入侵之外,还有谁能解决这个难题?(可能会在X个月后的下一次Firebase更新中失败?)