如何在节点 js 后端验证 Google 登录(通过 Firebase)id 令牌?

How to verify Google signin (via Firebase) idToken in nodejs backend?

正在尝试验证在 nodejs 服务器中通过 firebase 身份验证(Google 登录)登录的用户的 idToken。服务器抛出 Firebase ID token has invalid signature.

尝试使用 firebase-admin 以及 jsonwebtoken 以及来自 url 的 public 密钥进行验证:https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com。这两种方法都非常适合使用密码登录的用户,但如果用户通过 google.

登录,则会抛出 'Invalid Signature'

我做错了什么吗?我需要用 google-auth-library 来验证吗?

代码:

import * as admin from "firebase-admin";

admin.initializeApp({
  credential: admin.credential.cert(require("../../serviceAccount")), // file received from firebase project settings page
  databaseURL: "as mentioned in the firebase project settings page",
});

// Some code here

var token = "token received from client side";
var decoded = await admin.auth().verifyIdToken(token);

PS:

OP在这里,

我很笨

我正在使用 flutter 的 print() 函数来记录令牌并自己调用 API。不知道 Flutter 的打印功能有输出字符限制。使用密码登录会给出较小的令牌,因此会记录整个令牌。但是Google sign in给出了一个更长的token,比print的输出字符数限制要长。

解决方案:使用'dart:developer'包中的日志功能。

import 'dart:developer';

// 

log(await _auth.idToken);
const { OAuth2Client } = require("google-auth-library");

const client = new OAuth2Client(googleClient[process.env.ENV])
let token = 123456789011-crhch2kuum79bk0qr3usa39f7b9chikc.apps.googleusercontent.com

async function googleLoginVerify(token) {
  try {
    const ticket = await client.verifyIdToken({
      idToken: token,
      audience: googleClient[process.env.ENV], 
    });
      const payLoad = ticket.getPayload();

    return {
      success: true,
      data: payLoad,
    };

  } catch (err) {
    console.log(err.message);
    return {
      success: false,
      message: err.message,
    };
  }
}