在Google Apps Script中生成Adobe用户管理API有效OAuth JWT遇401013错误
嘿,我之前也踩过Adobe JWT 401013这个坑,咱们一步步来排查和解决:
排查Adobe User Management API JWT 401013错误的核心步骤
1. 先确认JWT Payload的必填字段完全正确
Adobe的JWT对字段要求非常严格,少一个或者错一个都会导致令牌无效,核心字段必须精准:
iss: 你的API密钥(也就是Client ID)sub: 服务账号的完整邮箱(必须是你在Adobe控制台创建的那个服务账号的邮箱,不能写错)aud: 受众格式必须是https://ims-na1.adobelogin.com/c/[你的Client ID],注意域名要和你控制台的环境一致(比如部分地区是ims-na2)exp: 过期时间戳,必须是秒级(Google Apps Script里Date.now()是毫秒,要除以1000取整),且有效期不能超过24小时- 必须添加User Management API专属的scope:
"https://ims-na1.adobelogin.com/s/ent_user_sdk": true
举个正确的Payload示例:
const payload = { "iss": "YOUR_CLIENT_ID", "sub": "service-account@your-domain.com", "aud": "https://ims-na1.adobelogin.com/c/YOUR_CLIENT_ID", "exp": Math.floor(Date.now() / 1000) + 3600, // 设置1小时过期 "https://ims-na1.adobelogin.com/s/ent_user_sdk": true };
2. 检查私钥的格式和内容
Google Apps Script里必须用PEM格式的私钥,不能用下载的p12文件。如果只有p12文件,可以用OpenSSL转换成PEM:
openssl pkcs12 -in your-cert.p12 -nocerts -nodes -out private-key.pem
在脚本里存储私钥时,要确保完整保留头部和尾部,不要有多余的换行或空格:
const privateKey = `-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...(你的私钥内容) -----END PRIVATE KEY-----`;
3. 签名算法和编码必须符合要求
Adobe要求用RS256算法签名,且所有base64编码必须是URL安全的,还要去掉签名末尾的等号:
// 生成JWT头部 const header = JSON.stringify({ "alg": "RS256", "typ": "JWT" }); // 拼接签名输入 const signatureInput = Utilities.base64EncodeWebSafe(header) + "." + Utilities.base64EncodeWebSafe(JSON.stringify(payload)); // 生成签名 const signatureBytes = Utilities.computeRsaSha256Signature(signatureInput, privateKey); const signature = Utilities.base64EncodeWebSafe(signatureBytes).replace(/=+$/, ""); // 去掉末尾的等号 // 组装完整JWT const jwt = `${Utilities.base64EncodeWebSafe(header)}.${Utilities.base64EncodeWebSafe(JSON.stringify(payload))}.${signature}`;
4. 获取访问令牌的请求格式不能错
生成JWT后,向Adobe令牌端点发送请求时,必须用application/x-www-form-urlencoded的表单格式,不能发JSON:
const tokenUrl = "https://ims-na1.adobelogin.com/ims/exchange/jwt/"; const payloadData = { client_id: "YOUR_CLIENT_ID", client_secret: "YOUR_CLIENT_SECRET", jwt_token: jwt }; const options = { method: "POST", payload: payloadData, contentType: "application/x-www-form-urlencoded" }; const response = UrlFetchApp.fetch(tokenUrl, options); const tokenData = JSON.parse(response.getContentText());
5. 确认服务账号的权限配置
最后别忘了检查:你的服务账号已经被添加到Adobe Admin Console的对应产品中,并且拥有User Management Administrator权限。权限不足的话,哪怕JWT正确也会返回401。
如果排查完这些还是有问题,可以把你的代码片段贴出来,我帮你再细查~
内容的提问来源于stack exchange,提问作者Employee
相关产品推荐
相关产品推荐

