我正在使用firebaseUI将用户登录到我的Web应用程序。我正在使用重定向选项。成功登录后,用户将被重定向到signInSuccessUrl,这是我的Web应用程序的管理页面。但是,我希望能够将与用户关联的ID令牌传递到admin端点,在该端点可以进行身份验证并检查尝试登录的用户是否具有管理员权限(这是通过检查我的数据库)。
我考虑了其他一些选择,即:
在管理页面本身上使用firebase.auth()。onAuthStateChanged,检查用户是否已登录,并向后端发出请求以检查用户是否为管理员。如果满足这些条件,则渲染页面,否则,显示拒绝权限。 这种方法的问题是:
在firebase登录页面和管理主页之间创建一个虚拟页面。该虚拟页面将检查用户是否如上所述使用onAuthStateChanged登录,并向后端发出请求以检查用户是否具有管理权限,并根据结果重定向到管理主页或显示拒绝的权限,以及返回登录页面。 如果执行此操作,则配置将如下所示:
var uiConfig = {
signInSuccessUrl: '/admintestpage/',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID
]
}
/ admintestpage /端点将呈现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
]
}
问题的关键是,仅在我事先知道用户已登录并且是管理员的情况下,我才想呈现我的管理员主页。 我想知道从firebaseUI页面重定向到signInSuccessUrl时是否有一种将ID令牌作为基本auth头传递的方法,或者是否不需要发送ID令牌本身的想法,并且还有另一种更好的流程。
答案 0 :(得分:0)
我认为您在正确的轨道上。我一直在努力寻找一些优雅的方法来完成此任务,但最终我还是做了你所做的事情。理想情况下,我希望signInSuccessUrl
传递jwt有效负载,因此,后端服务器可以验证其真实性,然后可以查找用户,然后设置会话或拒绝会话。
许多API和文档都是在“首先使用Firebase”或“仅使用Firebase”的上下文中编写的,因此您必须开始与传统REST API集成创意。
我的情况有点相似。我是一个仅限移动设备的应用程序,使用Firebase身份验证卸载负载,作为交换,它随后链接到我自己的自定义令牌。最近,我需要创建一些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);
});
};