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

时间:2017-04-03 22:53:44

标签: authentication firebase firebase-authentication

我正在处理的网站使用Firebase身份验证,登录的不同用户对于可以访问的页面具有不同的权限。

登录的方式与此post类似:

  1. 用户使用两个参数登录 - " id"和"电子邮件"
  2. 服务器使用这些来创建自定义" uid",然后使用Firebase管理SDK创建发送回客户端的自定义令牌。
  3. 客户端使用Javascript Firebase SDK登录 - firebase.auth()。signInWithCustomToken()
  4. 现在用户已登录,他们可以点击不同的页面 - 即' / foo',' / bar'
  5. 我遇到的问题是,当他们访问新页面时,我试图将令牌从客户端传递回服务器(几乎与它在此{{3}中的完成方式相同) }),验证令牌&检查是否有权查看网页。

    我试图找出最好(也是最安全)的方法来做到这一点。我考虑过以下选项:

    • 使用令牌构建一个URL,但我听说这不是一个好习惯,因为令牌暴露出来并且会话劫持变得容易多了。

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

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

2 个答案:

答案 0 :(得分:7)

You can get the accessToken (idToken) on client side by:

var accessToken = null;

firebase.auth().currentUser
    .getIdToken()
    .then(function (token) {
        accessToken = token;
    });

and pass it in your request headers:

request.headers['Authorization'] = 'Bearer ' + accessToken;

and on your server side get the token with your prefered method and authenticate the request with Firebase Admin SDK, like (Node.js):

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

答案 1 :(得分:0)

如今,看来我们打算使用httpsCallable()客户端来获得预先授权的对象,以与您的端点进行对话。

例如:

// # ./functions/index.js
exports.yourFunc = functions.https.onCall((data, context) => {
  // Checking that the user is authenticated.
  if (!context.auth) {
    // Throwing an HttpsError so that the client gets the error details.
    throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
      'while authenticated.');
  }
  // ... rest of your method
});
// ./src/models/addMessage.js
const firebase = require("firebase");
require("firebase/functions");

firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FUNCTIONS PROJECT ID ###'
  databaseURL: 'https://### YOUR DATABASE NAME ###.firebaseio.com',
});
var functions = firebase.functions();

// This is the new code:
var yourFunc = firebase.functions().httpsCallable('yourFunc');
yourFunc({foo: bar}).then(function(result) {
  // ...
});


来自firebase documentation