Node.js调用Google Sheets API遇error:1E08010C解码错误求助
解决Node.js连接Google Sheets时的error:1E08010C:DECODER routines::unsupported错误
错误原因分析
这个错误通常和私钥格式问题或Node.js 17+版本使用的OpenSSL 3.0兼容性有关——OpenSSL 3.0对部分旧签名算法或非标准格式的私钥支持有限。
解决方案
1. 检查并修正私钥格式
确保strava-test-credentials.json中的key字段是标准PEM格式:
- 必须包含完整的
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----头/尾 - 私钥内容的换行符必须正确(不要全部挤成一行)
如果格式有问题,建议将私钥单独保存为private-key.pem文件,通过文件读取使用:
const { google } = require("googleapis"); const fs = require('fs'); const keys = require("./strava-test-credentials.json"); const privateKey = fs.readFileSync('./private-key.pem', 'utf8'); const client = new google.auth.JWT(keys.web.client_email, null, privateKey, [ "https://www.googleapis.com/auth/spreadsheets", ]); client.authorize(function (err, tokens) { if (err) { console.error('授权失败:', err); return; } gsrun(client); }); async function gsrun(cl) { const gsapi = google.sheets({ version: "v4", auth: cl }); const opt = { spreadsheetId: "1G8W0h8axQLWt-2UmABL72j4y1et3vCB6BpQvg1OUTe0", range: "Data!A1:B5", }; try { let data = await gsapi.spreadsheets.values.get(opt); console.log(data.data.values); } catch (err) { console.error('获取数据失败:', err); } }
2. 启用OpenSSL兼容模式
Node.js 17+默认使用OpenSSL 3.0,部分旧算法被禁用,启动时添加兼容参数:
- Linux/Mac:
NODE_OPTIONS=--openssl-legacy-provider node your-script.js - Windows命令行:
set NODE_OPTIONS=--openssl-legacy-provider node your-script.js - Windows PowerShell:
$env:NODE_OPTIONS="--openssl-legacy-provider" node your-script.js
3. 更新依赖包版本
旧版本的Google认证库可能和Node.js 21不兼容,更新到最新版:
npm install googleapis@latest google-auth-library@latest
4. 验证服务账号权限
确认服务账号(client_email对应的邮箱)已被添加到目标Google Sheets的共享列表,且拥有编辑权限(仅查看权限可能导致后续更新失败)。
原问题代码
const { google } = require("googleapis"); const keys = require("./strava-test-credentials.json"); const client = new google.auth.JWT(keys.web.client_email, null, keys.web.key, [ "https://www.googleapis.com/auth/spreadsheets", ]); client.authorize(function (err, tokens) { gsrun(client); }); async function gsrun(cl) { const gsapi = google.sheets({ version: "v4", auth: cl }); const opt = { spreadsheetId: "1G8W0h8axQLWt-2UmABL72j4y1et3vCB6BpQvg1OUTe0", range: "Data!A1:B5", }; let data = await gsapi.spreadsheets.values.get(opt); console.log(data.data.values); }
原错误栈信息
(node:9692) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead. (Use `node --trace-deprecation ...` to show where the warning was created) node:internal/crypto/sig:128 const ret = this[kHandle].sign(data, format, type, passphrase, rsaPadding, ^ Error: error:1E08010C:DECODER routines::unsupported at Sign.sign (node:internal/crypto/sig:128:29) at Object.sign (C:\Users\user\strava-api\node_modules\gtoken\node_modules\jwa\index.js:152:45) at Object.jwsSign [as sign] (C:\Users\user\strava-api\node_modules\gtoken\node_modules\jws\lib\sign-stream.js:32:24) at GoogleToken.requestToken (C:\Users\user\strava-api\node_modules\gtoken\build\src\index.js:224:31) at GoogleToken.getTokenAsyncInner (C:\Users\user\strava-api\node_modules\gtoken\build\src\index.js:158:21) at GoogleToken.getTokenAsync (C:\Users\user\strava-api\node_modules\gtoken\build\src\index.js:137:55) at GoogleToken.getToken (C:\Users\user\strava-api\node_modules\gtoken\build\src\index.js:96:21) at JWT.refreshTokenNoCache (C:\Users\user\strava-api\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:36) at JWT.refreshToken (C:\Users\user\strava-api\node_modules\google-auth-library\build\src\auth\oauth2client.js:150:24) at JWT.getRequestMetadataAsync (C:\Users\user\strava-api\node_modules\google-auth-library\build\src\auth\oauth2client.js:295:28) { library: 'DECODER routines', reason: 'unsupported', code: 'ERR_OSSL_UNSUPPORTED' } Node.js v21.6.0
内容的提问来源于stack exchange,提问作者Slimane Latreche
相关产品推荐
相关产品推荐

