You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用google-auth-library调用verifyIdToken时出现公钥类型错误

问题

使用google-auth-library在服务端验证谷歌登录凭证时,调用verifyIdToken函数触发以下错误:

8875 |   }
8876 | }), require_verify = __commonJS({
8877 |   "node_modules/browserify-sign/browser/verify.js"(exports, module) {
8878 |     var Buffer2 = require_safe_buffer().Buffer, BN = require_bn3(), EC = require_elliptic().ec, parseKeys = require_parse_asn1(), curves = require_curves2();
8879 | 
8880 |     function verify(sig, hash, key, signType, tag) {
                                         ^
error: wrong public key type
      at verify (node:crypto:8880:38)

验证代码如下:

import { OAuth2Client } from "google-auth-library";

const client = new OAuth2Client({
  clientId: process.env.GOOGLE_CLIENT_ID,
  clientSecret: process.env.GOOGLE_CLIENT_SECRET,
});

export const verifyGoogleCredential = async (credential: string) => {
  try {
    const ticket = await client.verifyIdToken({
      idToken: credential,
      audience: process.env.GOOGLE_CLIENT_ID,
    });
    const payload = ticket.getPayload();
    return payload;
  } catch (err) {
    console.log(err);
  }
};

怀疑未正确获取公钥导致验证失败,求解决方案。


解决思路

  • 排查浏览器端crypto污染:错误栈显示使用了browserify-sign(浏览器端crypto实现),但google-auth-library依赖Node.js原生crypto模块。检查项目配置(如webpack的resolve.alias、polyfill工具),移除强制替换crypto的设置,让库使用Node.js原生crypto。
  • 更新依赖版本:旧版google-auth-library可能存在公钥解析兼容问题,执行npm update google-auth-library升级到最新稳定版。
  • 简化客户端初始化:验证Id Token不需要clientSecret,仅传入clientId即可初始化OAuth2Client,减少不必要的逻辑干扰:
    const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
    
  • 确认凭证有效性:检查传入的credential是否为前端谷歌登录返回的完整Id Token,无截断或篡改。可通过谷歌官方Token Info服务手动验证凭证合法性。
  • 校验环境变量:确保process.env.GOOGLE_CLIENT_ID已正确加载,避免undefined或空值导致验证逻辑异常,可在函数内打印该变量确认。

内容的提问来源于stack exchange,提问作者Marcel Madden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:34