Node.js调用OCI Vault API返回NotAuthenticated错误求助
OCI Vault API Node.js调用NotAuthenticated错误排查与修复
核心问题与修复步骤
替换Authorization头部的认证方案
OCI API要求使用Signature而非Bearer作为认证方案,这是导致认证失败的关键原因。
修正请求头部:headers: { Authorization: `Signature ${jwtToken}`, },修正JWT的Audience(aud)参数
OCI要求aud必须是区域级服务端点,而非具体资源路径。比如伦敦区Vault服务的aud应为https://secrets.vaults.uk-london-1.oci.oraclecloud.com,而非拼接后的资源URL。
修正payload:const payload = { iss: tenancyId, sub: authUserId, aud: vaultUrl, // 直接使用根服务端点 iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 3600, };确保私钥与指纹格式正确
- 确认
oci_private_key.pem包含完整的-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----标识,无格式损坏。 - 检查
keyFingerprint环境变量为OCI控制台中显示的冒号分隔十六进制字符串,无多余空格或字符。
- 确认
显式指定JWT签名算法
避免jsonwebtoken库使用默认算法,显式指定RS256:const jwtToken = jwt.sign(payload, privateKey, { algorithm: 'RS256', header });
修正后的完整代码
const jwt = require('jsonwebtoken'); const fs = require('fs'); const request = require('request'); const dotenv = require('dotenv'); dotenv.config(); const vaultUrl = process.env.vaultUrl; const secretBundleUrl = `${vaultUrl}/${process.env.secretBundle}/${process.env.vaultSecret}`; const tenancyId = process.env.tenancyId; const authUserId = process.env.authUserId; const keyFingerprint = process.env.keyFingerprint; const privateKey = fs.readFileSync('./oci_private_key.pem', 'utf8'); const header = { alg: 'RS256', typ: 'JWT', kid: keyFingerprint, }; const payload = { iss: tenancyId, sub: authUserId, aud: vaultUrl, iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 3600, }; const jwtToken = jwt.sign(payload, privateKey, { algorithm: 'RS256', header }); const options = { method: 'GET', url: secretBundleUrl, headers: { Authorization: `Signature ${jwtToken}`, }, }; request(options, function (error, response) { if (error) throw new Error(error); console.log(response.body); });
内容的提问来源于stack exchange,提问作者CCC
相关产品推荐
相关产品推荐

