生成用于Adobe用户管理API的有效Oauth JWT
我试图从GoogleApps脚本中调用Adobe用户管理API,但生成有效的JWT时遇到问题 我已经在上完成了“一次性设置”-我创建了集成和服务帐户,创建了自签名证书,复制了API密钥/凭据,等等 我在使用我创建的JWTs时遇到此错误:生成用于Adobe用户管理API的有效Oauth JWT,api,google-apps-script,oauth,adobe,jwt,Api,Google Apps Script,Oauth,Adobe,Jwt,我试图从GoogleApps脚本中调用Adobe用户管理API,但生成有效的JWT时遇到问题 我已经在上完成了“一次性设置”-我创建了集成和服务帐户,创建了自签名证书,复制了API密钥/凭据,等等 我在使用我创建的JWTs时遇到此错误: {"error_code":"401013","message":"Oauth token is not valid"} 以下是我编写的代码,用作指南并使用创建令牌: var DOMAIN_NAME = 'xx
{"error_code":"401013","message":"Oauth token is not valid"}
以下是我编写的代码,用作指南并使用创建令牌:
var DOMAIN_NAME = 'xxxxxxxxxx.com';
var ADOBE_API_CLIENT_ID_API_KEY = '1e0a15027994xxxxxxxxxxxxxxxxxxxx';
var ADOBE_API_CLIENT_SECRET = '5528fe1f-3a1c-4exxxxxxxxxxxxxxxxxxxx';
var ADOBE_ORGANIZATION_ID = '79FAxxxxxxxxxxxxxxxxxxxx@AdobeOrg';
var ADOBE_JWT_SUBJECT = '4A8Bxxxxxxxxxx@techacct.adobe.com';
var ADOBE_JWT_AUDIENCE = 'https://ims-na1.adobelogin.com/c/1e0a15027994xxxxxxxxxxxxxxxxxxxx';
var ADOBE_API_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==\n-----END PRIVATE KEY-----\n";
var ADOBE_IO_CONSOLE_GENERATED_JWT_TOKEN = 'eyJhbGciOixxxxxxxxxx.ew0KICAgICJleHAxxxxxxxxxxxxxxxxxxxx';
var ADOBE_API_BASE_URL = 'https://usermanagement.adobe.io/v2/usermanagement/';
function getAdobeUser(email) {
var payload = {
"exp": new Date().getTime() + 3600,
"iss": ADOBE_ORGANIZATION_ID,
"sub": ADOBE_JWT_SUBJECT,
"https://ims-na1.adobelogin.com/s/ent_user_sdk": true,
"aud": ADOBE_JWT_AUDIENCE
};
var requestBody = {};
requestBody.method = "POST";
requestBody.payload = payload;
requestBody.muteHttpExceptions = false;
var service = OAuth2.createService('adobe')
.setTokenUrl(ADOBE_JWT_AUDIENCE)
.setClientId(ADOBE_ORGANIZATION_ID)
.setClientSecret(ADOBE_API_CLIENT_SECRET)
.setSubject(ADOBE_JWT_SUBJECT)
.setPrivateKey(ADOBE_API_PRIVATE_KEY)
.setScope('https://ims-na1.adobelogin.com/s/ent_user_sdk')
var signedJwtToken = service.createJwt_();
var url = 'https://ims-na1.adobelogin.com/ims/exchange/jwt?client_id=' + ADOBE_API_CLIENT_ID_API_KEY + '&client_secret=' + ADOBE_API_CLIENT_SECRET + '&jwt_token=' + signedJwtToken;
// var url = 'https://ims-na1.adobelogin.com/ims/exchange/jwt?client_id=' + ADOBE_API_CLIENT_ID_API_KEY + '&client_secret=' + ADOBE_API_CLIENT_SECRET + '&jwt_token=' + ADOBE_IO_CONSOLE_GENERATED_JWT_TOKEN;
try {
var response = UrlFetchApp.fetch(url, requestBody);
var access_token = JSON.parse(response.getContentText());
} catch(e) {
console.log('failed while getting access_token: ' + e.message);
}
var user = null;
var url = ADOBE_API_BASE_URL + 'organizations/' + ADOBE_ORGANIZATION_ID + '/users/' + encodeURIComponent(email) + '?domain=' + DOMAIN_NAME;
var requestBody = {};
requestBody.headers = { "X-Api-Key": ADOBE_API_CLIENT_ID_API_KEY, "Authorization": "Bearer " + access_token };
requestBody.method = "GET";
requestBody.muteHttpExceptions = false;
try {
var response = UrlFetchApp.fetch(url, requestBody);
user = JSON.parse(response.getContentText());
} catch(e) {
console.log('failed while getting user: ' + e.message);
}
}
}
我相当确信发送的有效负载是正确的,因为Adobe I/O控制台中有一个面板,其中显示了一个示例有效负载(我已确保值与我的有效负载匹配),您可以粘贴到私钥中以生成JWT:
当我复制这里生成的JWT并使用它而不是Oauth2库生成的JWT时,令牌工作,API调用工作
因此,我尝试将该页面上的
exp
值更改为1840060800
(未来10年),并生成一个新的JWT,该JWT也可以工作,但在24小时后仍然过期,尽管我为exp
设置了更高的值,但我怀疑oauth2应用程序脚本客户端库是为与Google API一起使用而定制的。因此,该库要求设置一个基本url
但是Adobe的OAuth2实现看起来有点不同,因为它只需要JWT交换的一个端点
您可能需要创建一个自定义实现来管理刷新令牌。此外,Adobe文档规定,到期时间上限为24小时(设置为10年也无济于事);因此,您需要一个系统,可以在令牌过期后刷新令牌。我已经构建了一个用于集成Adobe Analytics API的Google应用程序脚本库。它在一个包中为您管理身份验证和函数调用 文件如下: 欢迎反馈 要使用库显式获取令牌,请执行以下操作:
function getAdobeAnalyticsClient () {
return AdobeAnalyticsClient.init()
.setClientId('') // set client ID
.setClientSecret('') // set client secret
.setPrviatekey('') // string format private key, replace line breaks with /n, generated when Adobe IO integration was created with JWT
.setIss('') // set iss
.setSub('') // set sub
.setAud('') // set aud
.setTokenLifeSec(); // set bearer token lifetime in seconds
}
function getToken () {
var client = getAdobeAnalyticsClient();
if(client.bearerTokenReady()){ // verify bearer token is received when token is exchanged
Logger.log("Ready");
Logger.log(client.getBearerToken());
Logger.log(client.getTokenExpireIn());
}
}