我正在使用firebaseui登录我的Web应用程序。我正在使用重定向选项。成功登录后,用户被重定向到SignInsuccessurl,这是我的Web应用程序的管理页面。但是,我希望能够将与用户关联的ID令牌传递给管理员端点,在此可以对其进行身份验证并检查是否试图登录的用户是否具有管理员权限(这是我通过检查用户权限在我的数据库(。
我已经考虑了其他一些选项,即:
-
使用firebase.auth((。onauthstatatechanged在管理页面本身上,检查用户是否已登录,然后向后端提出请求以检查用户是否是管理员。如果满足这些条件,请渲染页面,否则会显示拒绝的权限。这种方法的问题是:
- 它将AUTH的很大一部分移至客户端
- 我不能限制端点级别本身的访问。相比之下,如果我发送ID令牌,我可以检查用户是否是管理员,并因此确定渲染内容,而不是始终呈现管理页面,然后检查客户端是否登录并为管理员
-
在Firebase登录页面和管理主页之间制作一个虚拟页面。此虚拟页面将检查用户是否在使用上述使用的Onauthstatatechange中签名,如上所述,向后端请求检查用户是否具有admin权限,并根据结果,将其重定向到Admin Homepem Pagg或Show by nater Plage或Show拒绝和显示返回登录页面。如果我这样做的话,这就是配置的样子:
var uiConfig = {
signInSuccessUrl: '/admintestpage/',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID
]
}
/admandIntestPage/endpoint将渲染test.html,它的代码类似于:
<script type="text/javascript">
initApp = function() {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
idToken = user.getIdToken();
/*Send idToken to a backend api to check if the corresponding user is an admin*/
/*redirect to https://my-app.com/adminpage/ if user is an admin, otherwise, redirect to https://my-app.com/login/ */
} else {
/*user is signed-off, redirect to https://my-app.com/login */
}
}
</script>
我将其保留为最后一个选择,因为它看起来不像一个很好的流程。
这是我的Uiconfig现在的外观:
var uiConfig = {
signInSuccessUrl: '/adminpage/',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID
]
}
关键是,我只想在我事先知道用户已登录并且是管理员时才渲染我的管理主页。我想知道,当将ID令牌作为基本验证标头传递到firebaseui页面上的标志库库时,还是发送ID令牌本身的想法是不需要的,并且还有其他更好的流程。
我认为您在正确的轨道上。我一直在努力寻找优雅的事情来做到这一点,但是我最终做了您所做的事情。理想情况下,我希望signInSuccessUrl
通过JWT有效负载,因此,我的后端服务器可以验证其真实性,然后我可以查找用户,然后设置会话或拒绝会话。
许多API和文档都是在" Firebase First"或" Firebase"的背景下编写的
我的上下文有些相似。我是一个仅使用移动设备的应用程序,它使用Firebase Auth卸下Auth,以交换,然后链接到我自己的自定义令牌。最近,我需要制作一些Web属性,并希望在传统的客户端/服务器同步REST页面中实现我自己的会话管理的相同交换。
window.initApp = function() {
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
user.getIdToken().then(function(accessToken) {
redirectPost("/login", {"access_token": accessToken, "authenticity_token": $("meta[name='csrf-token']").attr('content')})
});
} else {
// User is signed out.
}
}, function(error) {
console.log(error);
});
};