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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:10:41