{"id":3749,"date":"2017-11-21T17:03:48","date_gmt":"2017-11-21T16:03:48","guid":{"rendered":"http:\/\/gpmfactory.com\/?p=3749"},"modified":"2017-11-24T21:40:04","modified_gmt":"2017-11-24T20:40:04","slug":"mise-en-oeuvre-des-applinks-dans-oracle-content-experience","status":"publish","type":"post","link":"https:\/\/gpmfactory.com\/index.php\/2017\/11\/21\/mise-en-oeuvre-des-applinks-dans-oracle-content-experience\/","title":{"rendered":"Mise en oeuvre des applinks dans Oracle Content Experience"},"content":{"rendered":"<p><b>Pr\u00e9sentation<\/b><\/p>\n<p>Une applink permet de cr\u00e9er, dans le contexte d&rsquo;une application existante (ex: portail services), un acc\u00e8s \u00e0 un folder ou bien un fichier de Oracle Content &amp; Experience Cloud (CEC). L&rsquo;UI de CEC est alors embarqu\u00e9e sous forme d&rsquo;iframe, mais l&rsquo;URL d&rsquo;acc\u00e8s ne peut pas \u00eatre d\u00e9rob\u00e9e et utilis\u00e9e en dehors de la fen\u00eatre parent. Remarque: il existe un temps d&rsquo;attente perceptible par l&rsquo;utilisateur de l&rsquo;ordre de 7 \u00e0 8 sec lors de la cr\u00e9ation d&rsquo;un applink.<\/p>\n<p>Un applink sera utile pour g\u00e9n\u00e9rer le visualisateur\/Downloader de fichier \u00e0 partir de l&rsquo;interface existante d&rsquo;une application.<!--more--><\/p>\n<p><b>Mise en oeuvre:<\/b><\/p>\n<p>Le code ci-dessous permet de valider le bon fonctionnement. Pour des raisons de confidentialit\u00e9, on utilise un token (Bearer) obtenu avec OAuth. Dans le cadre d&rsquo;une \u00e9change de serveur \u00e0 serveur, il faudra utiliser une Basic authentication \u00e0 la place, car il ne peut pas y avoir d&rsquo;interaction avec l&rsquo;utilisateur, et donc pas de demande d&rsquo;authentification.<\/p>\n<p>(Le <em>Client Credential Flow<\/em> ne semble pas etre propos\u00e9 dans CEC.)<\/p>\n<p>Les appels REST se feront \u00e0 partir d&rsquo;un compte technique.<\/p>\n<p>Pour faire fonctionner ce script, s&rsquo;authentifier sur CEC avec un compte technique, puis lancer l&rsquo;URL :<\/p>\n<pre>https:\/\/&lt;tenant&gt;\/documents\/web?IdcService=GET_OAUTH_TOKEN<\/pre>\n<p>et r\u00e9cup\u00e9rer le token Value et le remplacer ci-dessous.<\/p>\n<p>(Si c&rsquo;est une <em>Basic Authentication<\/em>, mettre \u00ab\u00a0Basic &lt;uid:pwd en base 64&gt;\u00a0\u00bb \u00e0 la place)<\/p>\n<pre>&lt;html&gt;\r\n\u00a0\u00a0\u00a0 &lt;!-- Test Applinks for Oracle Content &amp; Experience Cloud\r\n\u00a0\u00a0\u00a0 Patrick Monaco\r\n\u00a0\u00a0\u00a0 GPM Factory\r\n\u00a0\u00a0\u00a0 --&gt;\r\n&lt;head&gt;\r\n&lt;script src=\"\/\/code.jquery.com\/jquery-1.11.0.min.js\"&gt;&lt;\/script&gt;\r\n&lt;script&gt;\r\n\r\nvar dAppLinkUrl;\r\nvar dAppLinkAccessToken;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\nvar dAppLinkRefreshToken;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\nvar dAppLinkRoleName;\u00a0\u00a0\r\nfunction createAppLink(id, role, assignedUser){\u00a0\u00a0\r\nvar token=`Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXg1dCI6IlEzX0hJbUtZd0Z5RXBqcFlDejhSYWNwWHNhQSIsImtpZCI6ImZyY2F0aGV0ZXJ0cmlhbC5jZXJ0In0.eyJzdWIiOiJwbW8iLCJvcmFjbGUub2F1dGgudXNlcl9vcmlnaW5faWRfdHlwZSI6IkxEQVBfVUlEIiwib3JhY2xlLm9hdXRoLnVzZXJfb3JpZ2luX2lkIjoicG1vIiwiaXNzIjoiZnJjYXRoZXRlcnRyaWFsIiwib3JhY2xlLm9hdXRoLnN2Y19wX24iOiJmcmNhdGhldGVydHJpYWxTZXJ2aWNlUHJvZmlsZSIsImlhdCI6MTUxMTI3NjU1Nywib3JhY2xlLm9hdXRoLnBybi5pZF90eXBlIjoiTERBUF9VSUQiLCJvcmFjbGUub2F1dGgudGtfY29udGV4dCI6InJlc291cmNlX2FjY2Vzc190ayIsImV4cCI6MTUxMTg4MTM1NiwiYXVkIjpbImh0dHBzOi8vY29udGVudC1mcmNhdGhldGVydHJpYWwuZG9jdW1lbnRzLnVzMi5vcmFjbGVjbG91ZC5jb206NDQzL2RvY3VtZW50cyJdLCJvcmFjbGUub2F1dGguc3ViLmlkX3R5cGUiOiJMREFQX1VJRCIsInBybiI6InBtbyIsImp0aSI6ImE5MmUyOTU2LTY5ZjMtNDI0NS1hOWEwLTIyMzJiM2M4NzQ5NCIsIm9yYWNsZS5vYXV0aC5jbGllbnRfb3JpZ2luX2lkIjoiYjE5N2VkMjUtY2E0OC00MTZlLTlmYTAtYTk1Mjc3MTk2Nzk3Iiwib3JhY2xlLm9hdXRoLnNjb3BlIjoiaHR0cHM6Ly9jb250ZW50LWZyY2F0aGV0ZXJ0cmlhbC5kb2N1bWVudHMudXMyLm9yYWNsZWNsb3VkLmNvbTo0NDMvZG9jdW1lbnRzIiwidXNlci50ZW5hbnQubmFtZSI6ImZyY2F0aGV0ZXJ0cmlhbCIsIm9yYWNsZS5vYXV0aC5pZF9kX2lkIjoiNzg3NzE0MTYzNDcwOTQyMyJ9.AhmTxXszGWYyQDdu9DSBohyu8KY5LHwUGBdEO33EjAWvQcse23lcXWU8q97jgM4C4KUWLalokQ3KHjJvUrgDUaUp0PC0_hAarknr7MmczBdpCC5X-iByUyYU98T_Q87USCAM_e_N7-l--5S5nFUwBOI15PGC16iZjA0wDnXvu9ATyqB_Fmz8wDZP-XAwHSyy1dyy7OFcK_IYBwVFgdhcY2PTXM97XN6b_QXN4ZJ-F37U8vQMupF1kq958OgDSukRPKz4coY7sGMFUHRfwhnZQ6L-ZkLXvMgk2NAHQPweL5dbYKMiAEdpBei15Q3sFCKEJNTRqmKqEw87Acg8YaDH7Q`\r\n\u00a0\u00a0\u00a0 var payload = `{\r\n\u00a0\u00a0\u00a0 \"assignedUser\": \"` + assignedUser + `\",\r\n\u00a0\u00a0\u00a0 \"userLocale\": \"French\",\r\n\u00a0\u00a0\u00a0 \"role\": \"` + role +`\"\r\n\u00a0\u00a0\u00a0 }`;\r\n\u00a0\u00a0\u00a0 $.ajax({\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 type: \"POST\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 url: \"https:\/\/&lt;tenant&gt;.documents.us2.oraclecloud.com\/documents\/api\/1.2\/applinks\/file\/\" + id,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data: payload,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 processData: false,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers: {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Authorization\" : token\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cache: false,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DataType: \"html\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 success: function(response) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dAppLinkUrl = response.appLinkUrl;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dAppLinkAccessToken = response.accessToken;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dAppLinkRefreshToken = response.refreshToken;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dAppLinkRoleName = response.role;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0$('#content_frame').attr(\"src\", dAppLinkUrl);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 console.log(dAppLinkUrl);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 console.log('Role=' + dAppLinkRoleName);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 },\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 error: function (xhr, status) {\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 alert('SB001 - Unknown error - Status: ' + status + responseText);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 });\u00a0\u00a0\r\n}\u00a0\u00a0\u00a0\r\n&lt;\/script&gt;\u00a0\u00a0\u00a0\r\n&lt;\/head&gt;\u00a0\u00a0\u00a0\r\n&lt;body&gt;\r\n&lt;script&gt;\r\n\u00a0\u00a0\u00a0 $( document ).ready(function() {\r\n\u00a0\u00a0\u00a0 \/\/ folder -- var id = \"XXXXXXX21EAA21040E6FBAA684E9015A1C98104\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var id = \"XXXXXXXXXXX6913F16E4FBAA684E9015A1C98104\";\r\n\u00a0\u00a0\u00a0 var role = \"downloader\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var assignedUser = \"XXXXXXXXXX2C91FBAA684E9015\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Create Folder Applink or Create File Applink service\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var appLink\u00a0 = createAppLink(id, role, assignedUser);\r\n\u00a0\u00a0\u00a0 function OnMessage (evt) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/alert('evt= ' + evt.data.message);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 console.log(\"DOCSRestFilterSample: onMessage function \" + evt);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (evt.data.message === 'appLinkReady') {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/alert('appLink ready');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 console.log(\"OnMessage invoked for appLinkReady event...\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var embedPreview = \"true\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var iframe= document.getElementById(\"content_frame\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var iframewindow= iframe.contentWindow ? iframe.contentWindow : iframe.contentDocument.defaultView;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var msg = {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 message: 'setAppLinkTokens',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 appLinkRefreshToken:dAppLinkRefreshToken,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 appLinkAccessToken:dAppLinkAccessToken,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 appLinkRoleName:dAppLinkRoleName,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 embedPreview:embedPreview\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 console.log(\"DOCSRestFilterSample: sending message to iframe with access and refresh tokens\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iframewindow.postMessage(msg, '*');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 };\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 window.addEventListener &amp;&amp; window.addEventListener('message', OnMessage, false);\r\n});\u00a0\u00a0\u00a0\r\n&lt;\/script&gt;\r\n&lt;body&gt;\r\n\u00a0\u00a0\u00a0 &lt;iframe id=\"content_frame\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 src=\"\"\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 style=\"width: 100%; height: 620px; overflow: scroll;\" &gt;\r\n\u00a0\u00a0\u00a0 &lt;\/iframe&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9sentation Une applink permet de cr\u00e9er, dans le contexte d&rsquo;une application existante (ex: portail services), un acc\u00e8s \u00e0 un folder ou bien un fichier&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"ppma_author":[150],"class_list":["post-3749","post","type-post","status-publish","format-standard","hentry","category-dev"],"authors":[{"term_id":150,"user_id":1,"is_guest":0,"slug":"admin8700","display_name":"Patrick","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/209d5ed69b74d288390621ab4c1d3773?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/3749","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/comments?post=3749"}],"version-history":[{"count":3,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/3749\/revisions"}],"predecessor-version":[{"id":3918,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/3749\/revisions\/3918"}],"wp:attachment":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media?parent=3749"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/categories?post=3749"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/tags?post=3749"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=3749"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}