将ID令牌发送到firebaseui中的signInSuccessUrl

时间:2019-06-27 04:44:09

标签: javascript firebase firebase-authentication firebaseui

我正在使用firebaseUI将用户登录到我的Web应用程序。我正在使用重定向选项。成功登录后,用户将被重定向到signInSuccessUrl,这是我的Web应用程序的管理页面。但是,我希望能够将与用户关联的ID令牌传递到admin端点,在该端点可以进行身份​​验证并检查尝试登录的用户是否具有管理员权限(这是通过检查我的数据库)。

我考虑了其他一些选择,即:

  1. 在管理页面本身上使用firebase.auth()。onAuthStateChanged,检查用户是否已登录,并向后端发出请求以检查用户是否为管理员。如果满足这些条件,则渲染页面,否则,显示拒绝权限。 这种方法的问题是:

    • 它将身份验证的重要部分移至客户端
    • 我不能在端点级别本身上限制访问。相反,如果发送ID令牌,则可以检查用户是否为管理员,并据此决定要呈现什么内容,而不是始终呈现管理页面,然后在客户端检查用户是否登录并管理员。
  2. 在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令牌本身的想法,并且还有另一种更好的流程。

1 个答案:

答案 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);
  });
};