與Adobe Experience Manager(AEM)as a Cloud Service的整合必須能夠安全地驗證AEM服務。 AEM Developer Console授與服務憑證的存取權,這些憑證可協助外部應用程式、系統和服務以程式設計方式與AEM製作或透過HTTP發佈服務互動。
服務憑據可能顯示類似 本機開發存取權杖 但在幾個關鍵方面卻有所不同:
服務憑證及其產生的存取權杖,以及本機開發存取權杖,都應保持機密。 因為這三者皆可用來取得,所以可存取其各自的AEMas a Cloud Service環境。
服務憑證產生分為兩個步驟:
與本機開發存取權杖不同,服務憑證需先由Adobe組織IMS管理員建立技術帳戶,才能下載。 應為需要程式化存取AEM的每個用戶端建立獨立技術帳戶。
技術帳戶建立一次,但隨著時間推移,可用於管理與技術帳戶相關聯的服務憑證的私密金鑰也可管理。 例如,必須在當前私鑰過期之前生成新的私鑰/服務憑據,以便用戶能夠不間斷地訪問服務憑據。
初始化AEM作為Cloud Service環境的服務憑證後,您Adobe IMS組織中的其他AEM開發人員可以下載。
下載服務憑證遵循與初始化類似的步驟。
服務憑證提供產生JWT所需的詳細資訊,JWT會交換以取得存取權杖,以便透過AEMas a Cloud Service驗證。 服務憑證必須儲存在安全位置,外部應用程式、系統或服務可使用該位置來存取AEM。 每個客戶管理服務憑證的方式和位置都是唯一的。
為了簡單起見,本教學課程會透過命令列傳遞中的服務憑證。 不過,請與您的IT安全性團隊合作,了解如何根據貴組織的安全性准則儲存及存取這些憑證。
service_token.json
在項目根目錄中
服務憑證(完整格式的JSON物件)與JWT或存取權杖不同。 系統會改用服務憑證(包含私密金鑰)來產生JWT,並與Adobe IMS API交換以取得存取權杖。
若要使用服務憑證存取AEMas a Cloud Service,外部應用程式必須以三種方式更新:
在本教學課程中,Adobe @adobe/jwt-auth
npm模組用於兩者,(1)從服務憑證產生JWT,以及(2)以單一函式呼叫將其交換為存取權杖。 如果您的應用程式不是以JavaScript為基礎,請檢閱 其他語言的范常式式碼 以了解如何從服務憑證建立JWT,並與Adobe IMS交換以取得存取權杖。
檢閱 getCommandLineParams()
請參閱使用本機開發存取權杖JSON中用來讀取的相同程式碼來讀取服務憑證JSON檔案的方式。
function getCommandLineParams() {
...
// Read in the credentials from the provided JSON file
// Since both the Local Development Access Token and Service Credentials files are JSON, this same approach can be re-used
if (parameters.file) {
parameters.developerConsoleCredentials = JSON.parse(fs.readFileSync(parameters.file));
}
...
return parameters;
}
讀取服務憑證後,系統會使用這些憑證產生JWT,然後與Adobe IMS API交換以取得存取權杖。 然後,此存取權杖便可用來存取AEMas a Cloud Service。
此範例應用程式以Node.js為基礎,因此最好使用 @adobe/jwt-auth npm模組,以方便(1)產生JWT,以及(20)與Adobe IMS交換。 如果您的應用程式是使用其他語言開發的,請查看 適當的程式碼範例 了解如何使用其他程式設計語言,向Adobe IMS建構HTTP要求。
更新 getAccessToken(..)
檢查JSON檔案內容,並判斷其代表本機開發存取權杖或服務憑證。 這可借由檢查 .accessToken
屬性,僅存在於本機開發存取權杖JSON。
若已提供服務憑證,應用程式會產生JWT並與Adobe IMS交換JWT以取得存取權杖。 使用 @adobe/jwt-auth's auth(...)
函式,其產生JWT並在單一函式呼叫中將其交換為存取權杖。 參數 auth(..)
方法是 JSON物件,由特定資訊組成 可從服務憑證JSON取得,如下文的程式碼中所述。
async function getAccessToken(developerConsoleCredentials) {
if (developerConsoleCredentials.accessToken) {
// This is a Local Development access token
return developerConsoleCredentials.accessToken;
} else {
// This is the Service Credentials JSON object that must be exchanged with Adobe IMS for an access token
let serviceCredentials = developerConsoleCredentials.integration;
// Use the @adobe/jwt-auth library to pass the service credentials generated a JWT and exchange that with Adobe IMS for an access token.
// If other programming languages are used, please see these code samples: https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/JWT/samples/samples.md
let { access_token } = await auth({
clientId: serviceCredentials.technicalAccount.clientId, // Client Id
technicalAccountId: serviceCredentials.id, // Technical Account Id
orgId: serviceCredentials.org, // Adobe IMS Org Id
clientSecret: serviceCredentials.technicalAccount.clientSecret, // Client Secret
privateKey: serviceCredentials.privateKey, // Private Key to sign the JWT
metaScopes: serviceCredentials.metascopes.split(','), // Meta Scopes defining level of access the access token should provide
ims: `https://${serviceCredentials.imsEndpoint}`, // IMS endpoint used to obtain the access token from
});
return access_token;
}
}
現在,根據透過'file'命令列參數傳入的JSON檔案(本機開發存取權杖JSON或服務憑證JSON),應用程式將衍生存取權杖。
請記住,雖然服務憑證每365天過期,但JWT和對應的存取權杖會經常過期,且必須在過期前重新整理。 您可以使用「refresh_token」[由Adobe IMS提供](https://www.adobe.io/authentication/auth-methods.html#!AdobeDocs/adobeio-auth/master/OAuth/OAuth.md#access-tokens)來完成此操作。
完成這些變更後,服務憑證JSON便從AEM開發人員控制台下載,且為簡單起見,另存新檔 service_token.json
與此資料夾 index.js
. 現在,讓我們執行替換命令行參數的應用程式 file
with service_token.json
,以及更新 propertyValue
新值,以便在AEM中顯現效果。
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd-shared/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
輸出到終端的內容如下:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
403 - Forbidden @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
此 403 — 禁止 行,表示對AEMas a Cloud Service的HTTP API呼叫中發生錯誤。 嘗試更新資產的中繼資料時,會發生這些403禁止錯誤。
原因在於服務憑證衍生的存取權杖,會使用自動建立的技術帳戶AEM使用者驗證向AEM的要求,而依預設,該使用者僅具有讀取存取權。 若要提供AEM的應用程式寫入存取權,與存取權杖相關聯的技術帳戶AEM使用者必須在AEM中獲得權限。
服務憑證衍生的存取權杖使用的是具有 貢獻者 AEM使用者群組。
一旦AEM中存在技術帳戶AEM使用者(在具有存取權杖的第一個HTTP要求之後),此AEM使用者的權限便可與其他AEM使用者管理相同。
integration.email
值,看起來應類似: 12345678-abcd-9000-efgh-0987654321c@techacct.adobe.com
.在AEM中允許技術帳戶擁有資產寫入權限的情況下,重新執行應用程式:
$ node index.js \
aem=https://author-p1234-e5678.adobeaemcloud.com \
folder=/wknd-shared/en/adventures/napa-wine-tasting \
propertyName=metadata/dc:rights \
propertyValue="WKND Restricted Use" \
file=service_token.json
輸出到終端的內容如下:
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_277654931.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_286664352.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_239751461.jpg.json
200 - OK @ https://author-p1234-e5678.adobeaemcloud.com/api/assets/wknd-shared/en/adventures/napa-wine-tasting/AdobeStock_280313729.jpg.json
aem
命令行參數)folder
命令列參數,例如 WKND > 英文 > 冒險 > 納帕品酒會metadata/dc:rights
JCR屬性,現在會反映 propertyValue
參數,例如 WKND限制使用現在,我們已透過本機開發存取權杖,以及生產就緒服務對服務存取權杖,以程式設計方式存取AEMas a Cloud Service!