【问题标题】:Unable to verifyIdToken with firebase.auth()无法使用 firebase.auth() 验证 IdToken
【发布时间】:2018-11-10 15:12:00
【问题描述】:

在我的客户端上将 OAuth 与 Github 结合使用,我向我的服务器发送带有生成令牌的获取请求。我按预期获取令牌,但无法执行 firebase.auth().verifyIdToken 来获取令牌。我的 SDK 使用 admin SDK setup 之后的证书凭据进行身份验证。

我的 clientAuth 中间件:

const firebase = require('firebase-admin');

const db = require('../db');

module.exports = async (req, res, next) => {
  try {
    const tokenId = req.get('Authorization').split('Bearer ')[1];
    console.log(tokenId) //yay, token
    const validToken = await firebase.auth().verifyIdToken(tokenId);
    console.log(validToken.uid) //error

    return (validToken && validTeam) ? next() : res.status(401).end();   
  } catch (e) {
    res.status(401).end();
  }
};

我得到的错误是“解码 Firebase ID 令牌失败。确保您传递了代表 ID 令牌的整个字符串 JWT。如何验证/解码此令牌?

【问题讨论】:

  • 由于 JWT 是透明的,您能否确保从 console.log(tokenId) 获得的内容是有效的 JWT?您可以使用像 jwt.io 这样的工具来帮助解决这个问题。如果是有效的 JWT,aud 声明是否与证书凭证 json 文件中的 project-id 匹配?
  • 不,它不是 JWT。所以我想我不能使用 .verifyIdToken(),但是我到底要如何验证这个东西呢?
  • 我怀疑传递给服务器的令牌是 Github 令牌,而不是 Firebase 令牌。您是否在前端使用此方法获取令牌? firebase.google.com/docs/reference/js/firebase.User#getIdToken本指南也可能有帮助:firebase.google.com/docs/auth/web/github-auth

标签: firebase firebase-authentication


【解决方案1】:

我觉得这个可能不错,请用google复制这个函数

const admin = require('firebase-admin')
exports.validateFirebaseIdToken = async (req, res, next) => {
    console.log('Check if request is authorized with Firebase ID token');

    if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
        !(req.cookies && req.cookies.__session)) {
        console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
            'Make sure you authorize your request by providing the following HTTP header:',
            'Authorization: Bearer <Firebase ID Token>',
            'or by passing a "__session" cookie.');
        res.status(403).send('Unauthorized');
        return;
    }

    let idToken;
    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
        console.log('Found "Authorization" header');
        // Read the ID Token from the Authorization header.
        idToken = req.headers.authorization.split('Bearer ')[1];
    } else if (req.cookies) {
        console.log('Found "__session" cookie');
        // Read the ID Token from cookie.
        idToken = req.cookies.__session;
    } else {
        // No cookie
        res.status(403).send('Unauthorized');
        return;
    }


    try {
        const decodedIdToken = await admin.auth().verifyIdToken(idToken);
        //console.log('ID Token correctly decoded', decodedIdToken);
        req.user = decodedIdToken;
        next();
        return;
    } catch (error) {
        console.error('Error while verifying Firebase ID token:', error);
        res.status(403).send('Unauthorized');
        return;
    }
};

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 2019-09-30
    • 2022-12-11
    • 2019-03-09
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多