我正在使用Node.js / Express托管的移动站点,该站点通过Firebase电话身份验证得到“轻度”保护。首次加载时,该站点基本上是空的。在初始Firebase Phone身份验证之后,JWT令牌通过AJAX调用发送到节点服务器。服务器检查令牌,验证用户是否已授权,然后发回该站点的html内容。
到目前为止,太好了。这是保护简单单页Web应用程序上显示内容的好方法。
但这是我目前的困境。我现在想从站点上的表单提交数据。空白表格是通过第一个AJAX调用创建的。
提交表单后,我想重新提交相同的JWT令牌,以伴随将数据提交到服务器的其他AJAX请求。我不清楚如何获取令牌。我不再处于首先让我获得令牌的链式承诺中……(即,我不再有权访问User Object。)我可以看到令牌存储在IndexedDB-> FirebaseLocalStorageDB- > FirebaseLocalStorage对象->键:值(fbase_key.value.stsTokenManager.accessToken)
这是我在Chrome浏览器中的开发工具的屏幕截图。
我真的不确定如何从浏览器客户端的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似乎已经过时,或者我做错了。具体的提示表示赞赏。
答案 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更新中失败?)