如何将Firebase Auth Token从客户端传递到服务器?

wol*_*239 15 authentication firebase firebase-authentication

我正在使用的网站使用Firebase身份验证,登录的不同用户对他们可以访问的页面拥有不同的权限.

登录的方式是设置类似于这篇文章:

  1. 用户使用两个参数登录 - "id"和"email"
  2. 服务器使用这些来创建自定义"uid",然后使用Firebase Admin SDK创建发送回客户端的自定义令牌.
  3. 客户端使用Javascript Firebase SDK登录 - firebase.auth().signInWithCustomToken()
  4. 现在用户已登录,他们可以点击不同的页面 - 即'/ foo','/ bar'

我遇到的问题是,当他们访问新页面时,我正在尝试将令牌从客户端传递回服务器(几乎与在此Firebase文档中完成的方式相同),验证令牌并检查是否存在有权查看网页.

我正在努力找出最好(也是最安全)的方法.我考虑过以下选项:

  • 用令牌构造一个URL,但我听说这不是一个好习惯,因为令牌暴露,会话劫持变得容易多了.

我一直在尝试在请求标头中传递令牌,但据我所知,当用户点击指向其他页面的链接时(或者如果它在javascript中重定向),您无法添加标头.同样的问题适用于使用POST.

如果用户点击指向其他页面的链接,我该如何安全地将此信息传递到服务器并检查权限?

小智 10

您可以通过以下方式获取客户端上的accessToken(idToken):

var accessToken = null;

firebase.auth().currentUser
    .getIdToken()
    .then(function (token) {
        accessToken = token;
    });
Run Code Online (Sandbox Code Playgroud)

并将其传递到您的请求标头中:

request.headers['Authorization'] = 'Bearer ' + accessToken;
Run Code Online (Sandbox Code Playgroud)

并在您的服务器端获取带有您首选方法的令牌,并使用Firebase Admin SDK验证请求,如(Node.js):

firebaseAdmin.auth()
    .verifyIdToken(accessToken)
    .then(decodedIdToken => {
        return firebaseAdmin.auth().getUser(decodedIdToken.uid);
    })
    .then(user => {
        // Do whatever you want with the user.
    });
Run Code Online (Sandbox Code Playgroud)