{"id":687,"date":"2021-11-22T00:53:46","date_gmt":"2021-11-22T00:53:46","guid":{"rendered":"http:\/\/192.168.8.123\/?p=687"},"modified":"2022-02-11T11:15:39","modified_gmt":"2022-02-11T11:15:39","slug":"manage-cognitive-services-security","status":"publish","type":"post","link":"https:\/\/exceedthecloud.com\/?p=687","title":{"rendered":"Manage Cognitive Services Security"},"content":{"rendered":"\n<p>Security is a critical consideration for any application, and as a developer you should ensure that access to resources such as cognitive services is restricted to only those who require it.<\/p>\n\n\n\n<p>Access to cognitive services is typically controlled through authentication keys, which are generated when you initially create a cognitive services resource.<\/p>\n\n\n\n<p>Prerequisites for this labs : <a rel=\"noreferrer noopener\" href=\"https:\/\/azure.microsoft.com\/en-us\/free\/\" target=\"_blank\">Azure Account<\/a> \/ <a href=\"http:\/\/192.168.8.123\/index.php\/2021\/11\/20\/setting-up-windows-10-environment-for-ai-apps-with-azure-cognitive-services\/\" target=\"_blank\" rel=\"noreferrer noopener\">Setting up Windows 10 environment for AI Apps with Azure Cognitive Services<\/a><\/p>\n\n\n\n<p><strong>Clone the repository for this course<\/strong><\/p>\n\n\n\n<p>If you have already cloned <strong>AI-102-AIEngineer<\/strong> code repository to the environment where you&#8217;re working on this lab, open it in Visual Studio Code; otherwise, follow these steps to clone it now.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Start Visual Studio Code.<\/li><li>Open the palette (SHIFT+CTRL+P) and run a <strong>Git: Clone<\/strong> command to clone the https:\/\/github.com\/MicrosoftLearning\/AI-102-AIEngineer repository to a local folder (it doesn&#8217;t matter which folder).<\/li><li>When the repository has been cloned, open the folder in Visual Studio Code.<\/li><li>Wait while additional files are installed to support the C# code projects in the repo.<\/li><\/ul>\n\n\n\n<p><strong>Note<\/strong>: If you are prompted to add required assets to build and debug, select <strong>Not Now<\/strong>.<\/p>\n\n\n\n<p><strong>Provision a Cognitive Services resource<\/strong><\/p>\n\n\n\n<p>If you don&#8217;t already have one in your subscription, you&#8217;ll need to provision a <strong>Cognitive Services<\/strong> resource.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Open the Azure portal at https:\/\/portal.azure.com, and sign in using the Microsoft account associated with your Azure subscription.<\/li><li>Select the <strong>\uff0bCreate a resource<\/strong> button, search for <em>cognitive services<\/em>, and create a <strong>Cognitive Services<\/strong> resource with the following settings:<ul><li><strong>Subscription<\/strong>: <em>Your Azure subscription<\/em><\/li><li><strong>Resource group<\/strong>: <em>Choose or create a resource group (if you are using a restricted subscription, you may not have permission to create a new resource group &#8211; use the one provided)<\/em><\/li><li><strong>Region<\/strong>: <em>Choose any available region<\/em><\/li><li><strong>Name<\/strong>: <em>Enter a unique name<\/em><\/li><li><strong>Pricing tier<\/strong>: Standard S0<\/li><\/ul><\/li><li>Select the required checkboxes and create the resource.<\/li><li>Wait for deployment to complete, and then view the deployment details.<\/li><\/ul>\n\n\n\n<p><strong>Manage authentication keys<\/strong><\/p>\n\n\n\n<p>When you created your cognitive services resource, two authentication keys were generated. You can manage these in the Azure portal or by using the Azure command line interface (CLI).<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>In the Azure portal, go to your cognitive services resource and view its <strong>Keys and Endpoint<\/strong> page. This page contains the information that you will need to connect to your resource and use it from applications you develop. Specifically:<ul><li>An HTTP <em>endpoint<\/em> to which client applications can send requests.<\/li><li>Two <em>keys<\/em> that can be used for authentication (client applications can use either of the keys. A common practice is to use one for development, and another for production. You can easily regenerate the development key after developers have finished their work to prevent continued access).<\/li><li>The <em>location<\/em> where the resource is hosted. This is required for requests to some (but not all) APIs.<\/li><\/ul><\/li><li>In Visual Studio Code, right-click the <strong>02-cognitive-security<\/strong> folder and open an integrated terminal. Then enter the following command to sign into your Azure subscription by using the Azure CLI.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>az login<\/code><\/pre>\n\n\n\n<p>A web browser tab will open and prompt you to sign into Azure. Do so, and then close the browser tab and return to Visual Studio Code.<\/p>\n\n\n\n<p><strong>Tip<\/strong>: If you have multiple subscriptions, you&#8217;ll need to ensure that you are working in the one that contains your cognitive services resource. Use this command to determine your current subscription &#8211; its unique ID is the <strong>id<\/strong> value in the JSON that gets returned<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img1-4.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>Warning<\/strong>: If you are getting a certificate verfication failure for az login, try waiting a few minutes and trying again.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>az account show<\/code><\/pre>\n\n\n\n<p>If you need to change the subscription, run this command, changing <em>&lt;Your_Subscription_Id&gt;<\/em> to the correct subscription ID.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>az account set --subscription &lt;Your_Subscription_Id&gt;<\/code><\/pre>\n\n\n\n<p>Alternatively, you can explicitly specify the subscription ID as a <em>&#8211;subscription<\/em> parameter in each Azure CLI command that follows.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Now you can use the following command to get the list of cognitive services keys, replacing <em>&lt;resourceName&gt;<\/em> with the name of your cognitive services resource, and <em>&lt;resourceGroup&gt;<\/em> with the name of the resource group in which you created it.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>az cognitiveservices account keys list --name cs-exceed20112021 --resource-group rg-exceed20112021<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img2-4.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>The command returns a list of the keys for your cognitive services resource &#8211; there are two keys, named <strong>key1<\/strong> and <strong>key2<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"4\"><li>To test your cognitive service, you can use <strong>curl<\/strong> &#8211; a command line tool for HTTP requests. In the <strong>02-cognitive-security<\/strong> folder, open <strong>rest-test.cmd<\/strong> and edit the <strong>curl<\/strong> command it contains (shown below), replacing <em>&lt;yourEndpoint&gt;<\/em> and <em>&lt;yourKey&gt;<\/em> with your endpoint URI and <strong>Key1<\/strong> key to use the Text Analytics API in your cognitive services resource.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST \"&lt;yourEndpoint&gt;\/text\/analytics\/v3.0\/languages?\" -H \"Content-Type: application\/json\" -H \"Ocp-Apim-Subscription-Key: &lt;yourKey&gt;\" --data-ascii \"{'documents':&#91;{'id':1,'text':'hello'}]}\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"5\"><li>Save your changes, and then in the integrated terminal for the <strong>02-cognitive-security<\/strong> folder, run the following command:<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>rest-test<\/code><\/pre>\n\n\n\n<p>The command returns a JSON document containing information about the language detected in the input data (which should be English).<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"6\"><li>If a key becomes compromised, or the developers who have it no longer require access, you can regenerate it in the portal or by using the Azure CLI. Run the following command to regenerate your <strong>key1<\/strong> key (replacing <em>&lt;resourceName&gt;<\/em> and <em>&lt;resourceGroup&gt;<\/em> for your resource).<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>az cognitiveservices account keys regenerate --name &lt;resourceName&gt; --resource-group &lt;resourceGroup&gt; --key-name key1<\/code><\/pre>\n\n\n\n<p>The list of keys for your cognitive services resource is returned &#8211; note that <strong>key1<\/strong> has changed since you last retrieved them.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"7\"><li>Re-run the <strong>rest-test<\/strong> command with the old key (you can use the <strong>^<\/strong> key to cycle through previous commands), and verify that it now fails.<\/li><li>Edit the <em>curl<\/em> command in <strong>rest-test.cmd<\/strong> replacing the key with the new <strong>key1<\/strong> value, and save the changes. Then rerun the <strong>rest-test<\/strong> command and verify that it succeeds.<\/li><\/ul>\n\n\n\n<p><strong>Tip<\/strong>: In this exercise, you used the full names of Azure CLI parameters, such as <strong>&#8211;resource-group<\/strong>. You can also use shorter alternatives, such as <strong>-g<\/strong>, to make your commands less verbose (but a little harder to understand). The <a href=\"https:\/\/docs.microsoft.com\/cli\/azure\/cognitiveservices?view=azure-cli-latest\">Cognitive Services CLI command reference<\/a> lists the parameter options for each cognitive services CLI command.<\/p>\n\n\n\n<p><strong>Secure key access with Azure Key Vault<\/strong><\/p>\n\n\n\n<p>You can develop applications that consume cognitive services by using a key for authentication. However, this means that the application code must be able to obtain the key. One option is to store the key in an environment variable or a configuration file where the application is deployed, but this approach leaves the key vulnerable to unauthorized access. A better approach when developing applications on Azure is to store the key securely in Azure Key Vault, and provide access to the key through a <em>managed identity<\/em> (in other words, a user account used by the application itself).<\/p>\n\n\n\n<p><strong>Create a key vault and add a secret<\/strong><\/p>\n\n\n\n<p>First, you need to create a key vault and add a <em>secret<\/em> for the cognitive services key.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Make a note of the <strong>key1<\/strong> value for your cognitive services resource (or copy it to the clipboard).<\/li><li>In the Azure portal, on the <strong>Home<\/strong> page, select the <strong>\uff0bCreate a resource<\/strong> button, search for <em>Key Vault<\/em>, and create a <strong>Key Vault<\/strong> resource with the following settings:<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img3-3-1024x440.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li><strong>Subscription<\/strong>: <em>Your Azure subscription<\/em><\/li><li><strong>Resource group<\/strong>: <em>The same resource group as your cognitive service resource<\/em><\/li><li><strong>Key vault name<\/strong>: <em>Enter a unique name<\/em><\/li><li><strong>Region<\/strong>: <em>The same region as your cognitive service resource<\/em><\/li><li><strong>Pricing tier<\/strong>: Standard<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img4-3-1024x463.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Wait for deployment to complete and then go to your key vault resource.<\/li><li>In the left navigation pane, select <strong>Secrets<\/strong> (in the Settings section).<\/li><li>Select <strong>+ Generate\/Import<\/strong> and add a new secret with the following settings :<ul><li><strong>Upload options<\/strong>: Manual<\/li><li><strong>Name<\/strong>: Cognitive-Services-Key <em>(it&#8217;s important to match this exactly, because later you&#8217;ll run code that retrieves the secret based on this name)<\/em><\/li><li><strong>Value<\/strong>: <em>Your <strong>key1<\/strong> cognitive services key<\/em><\/li><\/ul><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img5-3-1024x469.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>Create a service principal<\/strong><\/p>\n\n\n\n<p>To access the secret in the key vault, your application must use a service principal that has access to the secret. You&#8217;ll use the Azure command line interface (CLI) to create the service principal and grant access to the secret in Azure Vault.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Return to Visual Studio Code, and in the integrated terminal for the <strong>02-cognitive-security<\/strong> folder, run the following Azure CLI command, replacing <em>&lt;spName&gt;<\/em> with a suitable name for an application identity (for example, <em>ai-app<\/em>). Also replace <em>&lt;subscriptionId&gt;<\/em> and <em>&lt;resourceGroup&gt;<\/em> with the correct values for your subscription ID and the resource group containing your cognitive services and key vault resources:<\/li><\/ul>\n\n\n\n<p><strong>Tip<\/strong>: If you are unsure of your subscription ID, use the <strong>az account show<\/strong> command to retrieve your subscription information &#8211; the subscription ID is the <strong>id<\/strong> attribute in the output.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>az ad sp create-for-rbac -n \"api:\/\/&lt;spName&gt;\" --role owner --scopes subscriptions\/&lt;subscriptionId&gt;\/resourceGroups\/&lt;resourceGroup&gt;<\/code><\/pre>\n\n\n\n<p>The output of this command includes information about your new service principal. It should look similar to this:<\/p>\n\n\n\n<p>&#8220;`<\/p>\n\n\n\n<p>{<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;appId&#8221;: &#8220;abcd12345efghi67890jklmn&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;displayName&#8221;: &#8220;ai-app&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;name&#8221;: &#8220;http:\/\/ai-app&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;password&#8221;: &#8220;1a2b3c4d5e6f7g8h9i0j&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; &#8220;tenant&#8221;: &#8220;1234abcd5678fghi90jklm&#8221;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img6-3-1024x305.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Make a note of the <strong>appId<\/strong>, <strong>password<\/strong>, and <strong>tenant<\/strong> values &#8211; you will need them later (if you close this terminal, you won&#8217;t be able to retrieve the password; so it&#8217;s important to note the values now &#8211; you can paste the output into a new text file in Visual Studio Code to ensure you can find the values you need later!)<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"2\"><li>To assign permission for your new service principal to access secrets in your Key Vault, run the following Azure CLI command, replacing <em>&lt;keyVaultName&gt;<\/em> with the name of your Azure Key Vault resource and <em>&lt;spName&gt;<\/em> with the same value you provided when creating the service principal.<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>az keyvault set-policy -n kv-exceed20112021 --spn \"api:\/\/ai-app\" --secret-permissions get list<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img7-3.png\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>Use the service principal in an application<\/strong><\/p>\n\n\n\n<p>Now you&#8217;re ready to use the service principal identity in an application, so it can access the secret congitive services key in your key vault and use it to connect to your cognitive services resource.<\/p>\n\n\n\n<p><strong>Note<\/strong>: In this exercise, we&#8217;ll store the service principal credentials in the application configuration and use them to authenticate a <strong>ClientSecretCredential<\/strong> identity in your application code. This is fine for development and testing, but in a real production application, an administrator would assign a <em>managed identity<\/em> to the application so that it uses the service principal identity to access resources, without caching or storing the password.<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>In Visual Studio Code, expand the <strong>02-cognitive-security<\/strong> folder and the <strong>C-Sharp<\/strong> or <strong>Python<\/strong> folder depending on your language preference.<\/li><li>Right-click the <strong>keyvault-client<\/strong> folder and open an integrated terminal. Then install the packages you will need to use Azure Key Vault and the Text Analytics API in your cognitive services resource by running the appropriate command for your language preference:<\/li><\/ul>\n\n\n\n<p><strong>C#<\/strong><\/p>\n\n\n\n<p>dotnet add package Azure.AI.TextAnalytics &#8211;version 5.0.0<\/p>\n\n\n\n<p>dotnet add package Azure.Identity &#8211;version 1.3.0<\/p>\n\n\n\n<p>dotnet add package Azure.Security.KeyVault.Secrets &#8211;version 4.2.0-beta.3<\/p>\n\n\n\n<p><strong>Python<\/strong><\/p>\n\n\n\n<p>pip install azure-ai-textanalytics==5.0.0<\/p>\n\n\n\n<p>pip install azure-identity==1.5.0<\/p>\n\n\n\n<p>pip install azure-keyvault-secrets==4.2.0<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img8-3-1024x537.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>View the contents of the <strong>keyvault-client<\/strong> folder, and note that it contains a file for configuration settings:<ul><li><strong>C#<\/strong>: appsettings.json<\/li><li><strong>Python<\/strong>: .env<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Open the configuration file and update the configuration values it contains to reflect the following settings:<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>The <strong>endpoint<\/strong> for your Cognitive Services resource<\/li><li>The name of your <strong>Azure Key Vault<\/strong> resource<\/li><li>The <strong>tenant<\/strong> for your service principal<\/li><li>The <strong>appId<\/strong> for your service principal<\/li><li>The <strong>password<\/strong> for your service principal<\/li><\/ul>\n\n\n\n<p>Save your changes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img9-3-1024x202.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>Note that the <strong>keyvault-client<\/strong> folder contains a code file for the client application:<ul><li><strong>C#<\/strong>: Program.cs<\/li><li><strong>Python<\/strong>: keyvault-client.py<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Open the code file and review the code it contains, noting the following details:<\/p>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>The namespace for the SDK you installed is imported<\/li><li>Code in the <strong>Main<\/strong> function retrieves the application configuration settings, and then it uses the service principal credentials to get the cognitive services key from the key vault.<\/li><li>The <strong>GetLanguage<\/strong> function uses the SDK to create a client for the service, and then uses the client to detect the language of the text that was entered.<\/li><li>Return to the integrated terminal for the <strong>keyvault-client<\/strong> folder, and enter the following command to run the program:<\/li><\/ul>\n\n\n\n<p><strong>C#<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dotnet run<\/code><\/pre>\n\n\n\n<p><strong>Python<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python keyvault-client.py<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\" start=\"3\"><li>When prompted, enter some text and review the language that is detected by the service. For example, try entering &#8220;Hello&#8221;, &#8220;Bonjour&#8221;, and &#8220;Hola&#8221;.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2022\/02\/img10-3.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\" type=\"1\"><li>When you have finished testing the application, enter &#8220;quit&#8221; to stop the program.<\/li><\/ul>\n\n\n\n<p><mark class=\"kt-highlight\"><strong>Reminder<\/strong>: Don\u2019t forget to delete or shutdown all unused Azure resources after your labs for cost saving<\/mark><\/p>\n\n\n\n<p><strong>More information<\/strong><\/p>\n\n\n\n<p>For more information about securing cognitive services, see the <a href=\"https:\/\/docs.microsoft.com\/azure\/cognitive-services\/cognitive-services-security\" target=\"_blank\" rel=\"noreferrer noopener\">Cognitive Services security documentation<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Security is a critical consideration for any application, and as a developer you should ensure that access to resources such as cognitive services is restricted to only those who require it. Access to cognitive services is typically controlled through authentication &hellip; <a href=\"https:\/\/exceedthecloud.com\/?p=687\">Continued<\/a><\/p>\n","protected":false},"author":1,"featured_media":867,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"kt_blocks_editor_width":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[15,4,18],"tags":[7,8,57,53,59,55,58],"class_list":["post-687","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cognitive-services","category-practical-labs-series","category-security","tag-ai","tag-azure","tag-cognitive-service","tag-git","tag-key-vault","tag-python","tag-security"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/exceedthecloud.com\/wp-content\/uploads\/2021\/11\/cognitive-security.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=687"}],"version-history":[{"count":3,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions"}],"predecessor-version":[{"id":2333,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions\/2333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=\/wp\/v2\/media\/867"}],"wp:attachment":[{"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exceedthecloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}