使用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
相关产品推荐
相关产品推荐

