Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成用于Adobe用户管理API的有效Oauth JWT_Api_Google Apps Script_Oauth_Adobe_Jwt - Fatal编程技术网

生成用于Adobe用户管理API的有效Oauth JWT

生成用于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

我试图从GoogleApps脚本中调用Adobe用户管理API,但生成有效的JWT时遇到问题

我已经在上完成了“一次性设置”-我创建了集成和服务帐户,创建了自签名证书,复制了API密钥/凭据,等等

我在使用我创建的JWTs时遇到此错误:

{"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());
  }

}