
{"id":10291,"date":"2022-06-21T09:29:25","date_gmt":"2022-06-21T09:29:25","guid":{"rendered":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/"},"modified":"2024-12-04T14:10:50","modified_gmt":"2024-12-04T14:10:50","slug":"thunder_security","status":"publish","type":"page","link":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/","title":{"rendered":"Thunder Security"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n <html><body><p>Thunder Security provides a way to control access to various RDK Services on the STBs for web and native apps. This requires apps to provide a security token as part of each request to a RDK Service.<\/p><p>This token is generated automatically by the WPE runtime for web apps. The security token contains details on the application context like app URL. Based on the access permissions configured, Thunder will check the security token as part of each incoming request and allow\/deny access to the RDK service. More details are explained below.<\/p><h2 class=\"wp-main-header wp-block-heading\">Figure 1:&nbsp; Component diagram.<\/h2><ul><li>Application &#8211; A Lightning\/web app (WPE runtime) or Lightning\/Spark app (Spark runtime) loaded from the web.<\/li><li>Thunder client &#8211; javascript client used by application<\/li><li>WPE\/Spark &#8211; Application Runtime Environments<\/li><li>Thunder &#8211; Web Platform for Embedded Framework for services<\/li><li>Security Agent &#8211; A thunder plugin.&nbsp; Accessible only by COM\/RPC only by application runtimes.<\/li><li>Plugin1 &#8211; Represents any plugin used as a service.&nbsp; Accessible by JSON\/RPC<\/li><li>thunder_permissions.conf &#8211; configuration for permissions of applications to access Thunder services.<\/li><\/ul><p>    \n\n<\/p><img decoding=\"async\" src=\"\/wp-content\/uploads\/sites\/16\/2023\/09\/ThunderSecurityAgentFlow.png\"><h2 class=\"wp-main-header wp-block-heading\">Figure 2.&nbsp; Sequence Diagram<\/h2><p>Notes:&nbsp; The Spark or WPE runtime loads the application.&nbsp; The application that wants to use Thunder services creates the ThunderClient.&nbsp; When the client is created, it requests a security token from the runtime.&nbsp; The runtime then requests the token directly from the security agent through COM\/RPC using the application context (the application&#8217;s URL).&nbsp; The security agent then creates and returns the token and returns it to the client.&nbsp; As noted, the token is not returned back to the application that creates the Thunder client.&nbsp; Once the application has created the Thunder Client, it then can invoke a service on a plugin&#8230; in this case Plugin1.foo().&nbsp; The Thunder Client creates the request to Thunder by including the security token.&nbsp; The Thunder Framework (not the actual plugin) checks with the security plugin to determine if the application can access this plugin based on the permissions file, and if so, allows the plugin to perform the request with the result being returned to the application.<\/p><p>    \n\n<\/p><img decoding=\"async\" src=\"\/wp-content\/uploads\/sites\/16\/2023\/09\/ThunderSecuritySequenceDiagram.png\"><h2 class=\"wp-main-header wp-block-heading\">Sending Security Token in JSON-RPC Requests<\/h2><h3 id=\"ThunderSecurity-WebApps\">Web Apps<\/h3><p>Web Apps that use ThunderJS to access plugins don&#8217;t have to do anything to pass the security token. This is handled by the WPE runtime and ThunderJS. WPE runtime will get details of the web app (URL) and send these details to WPEFramework process to get a security token. ThunderJS client will read this token and include it as part of each request.<\/p><h3 id=\"ThunderSecurity-NativeApps\">Native Apps<\/h3><p>a) Native apps can use the GetSecurityToken() API from <a href=\"http:\/\/libWPEFrameworkSecurityUtil.so\" class=\"external-link\" rel=\"nofollow\">libWPEFrameworkSecurityUtil.so<\/a> to get the security token.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>Send Security Token in Native App<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#include &lt;securityagent\/SecurityTokenUtil.h&gt;\n#define MAX_LENGTH 1024\n&nbsp;\n&nbsp;\nunsigned&nbsp;char&nbsp;buffer[MAX_LENGTH] = {0};\nint&nbsp;ret = GetSecurityToken(MAX_LENGTH,buffer);\nif(ret &gt; 0)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;string sToken = (char*)buffer;\n&nbsp;&nbsp;&nbsp;&nbsp;string query =&nbsp;\"token=\"&nbsp;+ sToken;\n&nbsp;&nbsp;&nbsp;&nbsp;auto thunderClient = WPEFramework::JSONRPC::LinkType&lt;WPEFramework::Core::JSON::IElement&gt;(\"org.rdk.DisplaySettings\",&nbsp;\"\",&nbsp;false, query);\n}<\/pre>\n<\/div><\/div><p><br><\/p><p>b) Native apps can use the WPEFrameworkSecurityUtility application to get a security token for localhost. This will give a security token as part of a json response as shown below.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>WPEFrameworkSecurityUtility<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/opt\/logs# \/usr\/bin\/WPEFrameworkSecurityUtility\n{\"token\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwOi8vbG9jYWxob3N0In0.u1b-drnYqxLlxAHqTLEFu8PmJ2iKNvrnvmyO0ofvrOI\",\"success\":true}<\/pre>\n<\/div><\/div><p>Native apps will have to send this token as a query string to JSONRPC::LinkType object as shown below.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>Send Security Token in Native App<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ assuming sToken contains the token retreived from WPEFrameworkSecurityUtility\nstring sToken;\n&nbsp;\nstring query =&nbsp;\"token=\"&nbsp;+ sToken;\nauto thunderClient = WPEFramework::JSONRPC::LinkType&lt;WPEFramework::Core::JSON::IElement&gt;(\"org.rdk.DisplaySettings\",&nbsp;\"\",&nbsp;false, query);<\/pre>\n<\/div><\/div><h2 class=\"wp-main-header wp-block-heading\">Sending Security Token in HTTP Requests<\/h2><p>Security Token can be passed in the header as part of REST API calls to thunder to access RDK Services. These HTTP calls are used during development, triage and testing.<\/p><p>Similar to native apps, we can run the WPEFrameworkSecurityUtility application to get a security token for localhost. This will give a security token as part of the json response which should be passed as part of Authorization header as shown below.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>HTTP Requests<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/opt\/logs# \/usr\/bin\/WPEFrameworkSecurityUtility\n{\"token\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwOi8vbG9jYWxob3N0In0.u1b-drnYqxLlxAHqTLEFu8PmJ2iKNvrnvmyO0ofvrOI\",\"success\":true}\n&nbsp;\n&nbsp;\ncd \/opt\/logs# curl -H \"Content-Type: application\/json\"&nbsp; -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1cmwiOiJodHRwOi8vbG9jYWxob3N0In0.u1b-drnYqxLlxAHqTLEFu8PmJ2iKNvrnvmyO0ofvrOI\" -X POST&nbsp;&nbsp; -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"org.rdk.DisplaySettings.1.getCurrentResolution\"}'&nbsp;http:\/\/127.0.0.1:9998\/jsonrpc\n&nbsp;\n{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"resolution\":\"1080p60\",\"success\":true}}<\/pre>\n<\/div><\/div><h2 class=\"wp-main-header wp-block-heading\">Additional Info on Security Token<\/h2><p>The security token generated on a device is only valid for that device. It cannot be used for another device. Also, the token needs to be regenerated if the device is rebooted or services are restarted.<\/p><h2 class=\"wp-main-header wp-block-heading\">Error Handling<\/h2><p>If no security token is passed in the request or invalid security token is passed, then WPEFramework::Core::ERROR_PRIVILIGED_REQUEST&nbsp;(24) error code is returned.<\/p><h3 id=\"ThunderSecurity-NativeApps.1\">Native Apps<\/h3><p>Any calls to WPEFramework::JSONRPC::LinkType APIs will return&nbsp;WPEFramework::Core::ERROR_PRIVILIGED_REQUEST if correct security token is not passed.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>Error code in Native App<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/\/ Error code when no security token is passed.\n&nbsp;\nauto thunderClient = WPEFramework::JSONRPC::LinkType&lt;WPEFramework::Core::JSON::IElement&gt;(\"org.rdk.DisplaySettings\",&nbsp;\"\");\nJsonObject joParams;\nJsonObject joResult;\nuint32_t status = thunderClient.Invoke(2000,&nbsp;\"getCurrentResolution\", joParams, joResult);\n&nbsp;\n&nbsp;\nif(status == WPEFramework::Core::ERROR_PRIVILIGED_REQUEST)\n{\n&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt;&nbsp;\"Access denied. Pass valid security token\"&nbsp;&lt;&lt; endl;\n}<\/pre>\n<\/div><\/div><h3 id=\"ThunderSecurity-HttpRequests\">Http Requests<\/h3><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>Error code for HTTP Requests<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/opt\/logs# curl -H \"Content-Type: application\/json\"&nbsp;&nbsp; -X POST&nbsp;&nbsp; -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"Controller.1.status@org.rdk.DisplaySettings\"}'&nbsp;http:\/\/127.0.0.1:9998\/jsonrpc\n&nbsp;\n{\"jsonrpc\":\"2.0\",\"id\":1,\"error\":{\"code\":24,\"message\":\"Request needs authorization. Missing or invalid token.\"}}<\/pre>\n<\/div><\/div><h2 class=\"wp-main-header wp-block-heading\">RFC Support<\/h2><p>Thunder Security can be enabled\/disabled using RFC&nbsp;<span>Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.ThunderSecurity.Enable<\/span>. When&nbsp;<span>Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.ThunderSecurity.Enable<\/span><span>&nbsp;<\/span>is set to true, then Thunder Security is enabled and disabled when set to false.&nbsp;<\/p><p>The RFC can be set using XCONF or locally on the STB using tr181 commands.&nbsp;STB needs to be rebooted after changing the RFC value.<\/p><h2 class=\"wp-main-header wp-block-heading\">Details on Security Permissions<\/h2><p>The Thunder security permissions or ACL are defined under \/etc\/thunder_acl.json. Sample permissions are shown below as an example. &#8220;assign&#8221; contains a list of urls for which different roles are assigned.&nbsp;<\/p><p>&#8220;roles&#8221; define each of the roles which specify the ACL as an allow and block list. For development and testing purposes \/etc\/thunder_acl.json file can be copied to \/opt\/thunder_acl.json and edited. This is allowed only on VBN builds.<\/p><div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\"><div class=\"codeHeader panelHeader pdl\"><b>Sample ACL<\/b><\/div><div class=\"codeContent panelContent pdl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">{  \n    \"assign\": [\n        {  \n            \"url\": \"*:\/\/localhost\",\n            \"role\": \"local\"\n        },\n        {  \n            \"url\": \"*:\/\/testurl1.com\/*\",\n            \"role\": \"restricted1\"\n        },\n        {  \n            \"url\": \"*:\/\/testurl2.com\/*\",\n            \"role\": \"restricted2\"\n        },\n        {                                                 \n            \"url\": \"*\",                  \n            \"role\": \"default\"    \n        }                 \n    ]\n\"roles\": {\n        \"default\": {                  \n            \"thunder\": {    \n                \"block\": [\n                    \"*\"\n                ]                       \n            }               \n        },\n        \"local\": {           \n            \"thunder\": {  \n                \"allow\": [\n                    \"*\"\n                ]                     \n            }            \n        },            \n        \"restricted1\": {           \n            \"thunder\": {  \n                \"allow\": [\n                    \"org.rdk.DisplaySettings\",\n                    \"org.rdk.Timer\"\n                ]                     \n            }            \n        },            \n         \"restricted2\": {           \n            \"thunder\": { \n            \"allow\": [\n                    \"*\"\n                ],                     \n                \"block\": [\n                    \"org.rdk.SystemServices\",\n                    \"org.rdk.StorageManager\"\n                ]                     \n            }            \n        }            \n    }\n}<\/pre>\n<\/div><\/div><\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>Thunder Security provides a way to control access to various RDK Services on the STBs [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"parent":10275,"menu_order":5,"comment_status":"open","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-10291","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Thunder Security - RDK Documentation Portal | Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Thunder Security - RDK Documentation Portal | Documentation\" \/>\n<meta property=\"og:description\" content=\"Thunder Security provides a way to control access to various RDK Services on the STBs [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/\" \/>\n<meta property=\"og:site_name\" content=\"RDK Documentation Portal | Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2024-12-04T14:10:50+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/\",\"name\":\"Thunder Security - RDK Documentation Portal | Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\"},\"datePublished\":\"2022-06-21T09:29:25+00:00\",\"dateModified\":\"2024-12-04T14:10:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RDK Video\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Sub-Systems\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/?page_id=10158\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"RDKServices\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/\"},{\"@type\":\"ListItem\",\"position\":6,\"name\":\"Thunder Security\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/\",\"name\":\"RDK Documentation Portal | Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Thunder Security - RDK Documentation Portal | Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/","og_locale":"en_US","og_type":"article","og_title":"Thunder Security - RDK Documentation Portal | Documentation","og_description":"Thunder Security provides a way to control access to various RDK Services on the STBs [&hellip;]","og_url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/","og_site_name":"RDK Documentation Portal | Documentation","article_modified_time":"2024-12-04T14:10:50+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/","url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/","name":"Thunder Security - RDK Documentation Portal | Documentation","isPartOf":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website"},"datePublished":"2022-06-21T09:29:25+00:00","dateModified":"2024-12-04T14:10:50+00:00","breadcrumb":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/thunder_security\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":3,"name":"RDK Video","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/"},{"@type":"ListItem","position":4,"name":"Sub-Systems","item":"https:\/\/developer.rdkcentral.com\/documentation\/?page_id=10158"},{"@type":"ListItem","position":5,"name":"RDKServices","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/sub-systems\/rdkservices\/"},{"@type":"ListItem","position":6,"name":"Thunder Security"}]},{"@type":"WebSite","@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website","url":"https:\/\/developer.rdkcentral.com\/documentation\/","name":"RDK Documentation Portal | Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/10291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/comments?post=10291"}],"version-history":[{"count":1,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/10291\/revisions"}],"predecessor-version":[{"id":10294,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/10291\/revisions\/10294"}],"up":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/10275"}],"wp:attachment":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/media?parent=10291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}