{"id":1282,"date":"2023-03-24T00:19:43","date_gmt":"2023-03-23T11:19:43","guid":{"rendered":"https:\/\/blog.wiseowls.co.nz\/?p=1282"},"modified":"2023-04-01T00:22:37","modified_gmt":"2023-03-31T11:22:37","slug":"azure-swa-authentication-for-blazor","status":"publish","type":"post","link":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/","title":{"rendered":"Azure SWA Authentication for Blazor"},"content":{"rendered":"\n<h5 class=\"wp-block-heading\">Getting Blazor AuthorizeView to work with Azure Static Web App<\/h5>\n\n\n\n<p>Recently, we inherited an Azure Static Web App project with a Blazor WASM frontend. The previous developer had given up on configuring the built-in authentication that comes bundled with Static Web Apps and was about to ditch the whole platform and rewrite the API backend for ASP.NET and App Services. This would have meant we could use ASP.NET Membership and be in full control of the user lifecycle. At the same time, we would have implemented our own user management layer which would be redundant in our case. We would also have missed features like AzureAD Auth and a user invite system that we get for free with SWA.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inventory inspection<\/h2>\n\n\n\n<p>Ultimately, we have two puzzle pieces here: Static Web Apps authentication and Blazor.<\/p>\n\n\n\n<p>Azure Static Web Apps <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/static-web-apps\/user-information?tabs=csharp\">provide built-in authentication<\/a> and authorization for web applications. This allows users to authenticate with their preferred identity provider such as Azure Active Directory, GitHub, Twitter, Facebook, and Google, to access resources on the app. When a user logs in, Azure Static Web Apps takes care of tokens and exposes an API that returns user information and authentication status in a simple JSON format:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">{\n  \"identityProvider\": \"github\",\n  \"userId\": \"d75b260a64504067bfc5b2905e3b8182\",\n  \"userDetails\": \"username\",\n  \"userRoles\": [\"anonymous\", \"authenticated\"],\n  \"claims\": [{\n    \"typ\": \"name\",\n    \"val\": \"Azure Static Web Apps\"\n  }]\n}<\/code><\/pre>\n\n\n\n<p><br>All that we care about here is the fact that the <code>userRoles<\/code> property is provided for both the API and frontend via an <code>\/.auth\/me<\/code> endpoint.<\/p>\n\n\n\n<p>Moving on to the consumer side, Blazor offers the <a href=\"https:\/\/learn.microsoft.com\/en-us\/aspnet\/core\/blazor\/security\/?view=aspnetcore-7.0\"><code>AuthorizeView<\/code> <\/a>component to show content only to authorized users. When an unauthorized user tries to access a page, Blazor will render the contents of the <code>NotAuthorized<\/code> tag, which is likely going to point to a login page. Decision on whether a given user is authorized to see a page is delegated to the <code>AuthenticationStateProvider<\/code> service. Default implementation plugs into ASP.NET membership, which is exactly what we&#8217;re trying to avoid.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Making changes<\/h2>\n\n\n\n<p>Luckily, writing a custom Provider and injecting it instead of the stock one is a matter of configuring the DI container at startup:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">var builder = WebAssemblyHostBuilder.CreateDefault(args);\nbuilder.Services.AddAuthorizationCore();\nbuilder.Services.AddScoped&lt;AuthenticationStateProvider, CustomAuthStateProvider&gt;();<\/code><\/pre>\n\n\n\n<p>The provider would then look something like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">public class SwaPrincipalResponse\n{\n    public ClientPrincipal? ClientPrincipal { get; set; }\n}\n\npublic class AuthStateProvider : AuthenticationStateProvider\n{\n    private readonly HttpClient _httpClient;\n    private readonly AuthenticationState _anonymous;\n \n    public AuthStateProvider(HttpClient httpClient)\n    {\n        _httpClient = httpClient;\n        _anonymous = new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));\n    }\n    \n    public override async Task&lt;AuthenticationState&gt; GetAuthenticationStateAsync()\n    {\n        var principalResponse = await _httpClient.GetStringAsync(\"\/.auth\/me\");\n        var kv = JsonSerializer.Deserialize&lt;SwaPrincipalResponse&gt;(principalResponse, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });\n        var principal = kv!.ClientPrincipal;\n        \n        if (principal == null || string.IsNullOrWhiteSpace(principal.IdentityProvider))\n            return _anonymous;\n \n        principal.UserRoles = principal.UserRoles?.Except(new[] { \"anonymous\" }, StringComparer.CurrentCultureIgnoreCase).ToList();\n \n        if (!principal.UserRoles?.Any() ?? true)\n        {\n            return _anonymous;\n        }\n \n        var identity = new ClaimsIdentity(principal.IdentityProvider);\n        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, principal.UserId));\n        identity.AddClaim(new Claim(ClaimTypes.Name, principal.UserDetails));\n        identity.AddClaims(principal!.UserRoles!.Select(r =&gt; new Claim(ClaimTypes.Role, r)));\n \n        return new AuthenticationState(new ClaimsPrincipal(identity));\n    }\n}<\/code><\/pre>\n\n\n\n<p>And this unlocks pages with <code>AuthorizeView<\/code> for us. <\/p>\n\n\n\n<p>In conclusion, if you&#8217;re working with a Blazor frontend and Azure Static Web Apps, take advantage of the built-in Azure SWA Authentication for Blazor. It can save you from having to rewrite your API backend and allows for easy integration with various identity providers.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Getting Blazor AuthorizeView to work with Azure Static Web App Recently, we inherited an Azure Static Web App project with a Blazor WASM frontend. The previous developer had given up on configuring the built-in authentication that comes bundled with Static Web Apps and was about to ditch the whole platform and rewrite the API backend &hellip; <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Azure SWA Authentication for Blazor&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1298,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[11],"tags":[48,12],"class_list":["post-1282","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-azure","tag-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Azure SWA Authentication for Blazor - Timur and associates<\/title>\n<meta name=\"description\" content=\"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you&#039;ll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure SWA Authentication for Blazor - Timur and associates\" \/>\n<meta property=\"og:description\" content=\"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you&#039;ll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/\" \/>\n<meta property=\"og:site_name\" content=\"Timur and associates\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-23T11:19:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-03-31T11:22:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"598\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"timur\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TimurKh\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/\"},\"author\":{\"name\":\"timur\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"headline\":\"Azure SWA Authentication for Blazor\",\"datePublished\":\"2023-03-23T11:19:43+00:00\",\"dateModified\":\"2023-03-31T11:22:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/\"},\"wordCount\":391,\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/20221220_165634479_iOS_cr.jpg\",\"keywords\":[\"azure\",\"c#\"],\"articleSection\":[\"Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/\",\"name\":\"Azure SWA Authentication for Blazor - Timur and associates\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/20221220_165634479_iOS_cr.jpg\",\"datePublished\":\"2023-03-23T11:19:43+00:00\",\"dateModified\":\"2023-03-31T11:22:37+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"description\":\"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you'll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/20221220_165634479_iOS_cr.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2023\\\/04\\\/20221220_165634479_iOS_cr.jpg\",\"width\":1920,\"height\":598,\"caption\":\"A modern five-story building with a glass facade and angular shapes, the Stuttgart library stands tall against the blue sky. The building features a rooftop terrace and a unique interior design with colorful bookshelves, reading areas, and natural light.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2023\\\/03\\\/24\\\/azure-swa-authentication-for-blazor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Azure SWA Authentication for Blazor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\",\"name\":\"Timur and associates\",\"description\":\"Notes of an IT contractor\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\",\"name\":\"timur\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"caption\":\"timur\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TimurKh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Azure SWA Authentication for Blazor - Timur and associates","description":"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you'll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.","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:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/","og_locale":"en_US","og_type":"article","og_title":"Azure SWA Authentication for Blazor - Timur and associates","og_description":"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you'll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.","og_url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/","og_site_name":"Timur and associates","article_published_time":"2023-03-23T11:19:43+00:00","article_modified_time":"2023-03-31T11:22:37+00:00","og_image":[{"width":1920,"height":598,"url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg","type":"image\/jpeg"}],"author":"timur","twitter_card":"summary_large_image","twitter_creator":"@TimurKh","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#article","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/"},"author":{"name":"timur","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"headline":"Azure SWA Authentication for Blazor","datePublished":"2023-03-23T11:19:43+00:00","dateModified":"2023-03-31T11:22:37+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/"},"wordCount":391,"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg","keywords":["azure","c#"],"articleSection":["Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/","url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/","name":"Azure SWA Authentication for Blazor - Timur and associates","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#primaryimage"},"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg","datePublished":"2023-03-23T11:19:43+00:00","dateModified":"2023-03-31T11:22:37+00:00","author":{"@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"description":"Learn how to setup Azure SWA Authentication for Blazor WASM frontend in this step-by-step guide. Discover how to leverage the built-in authentication provided by Azure Static Web Apps and implement a custom AuthenticationStateProvider service for Blazor. By the end of this tutorial, you'll have a better understanding of how to handle user authentication in a Blazor app deployed on Azure.","breadcrumb":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#primaryimage","url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg","contentUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2023\/04\/20221220_165634479_iOS_cr.jpg","width":1920,"height":598,"caption":"A modern five-story building with a glass facade and angular shapes, the Stuttgart library stands tall against the blue sky. The building features a rooftop terrace and a unique interior design with colorful bookshelves, reading areas, and natural light."},{"@type":"BreadcrumbList","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2023\/03\/24\/azure-swa-authentication-for-blazor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.wiseowls.co.nz\/"},{"@type":"ListItem","position":2,"name":"Azure SWA Authentication for Blazor"}]},{"@type":"WebSite","@id":"https:\/\/blog.wiseowls.co.nz\/#website","url":"https:\/\/blog.wiseowls.co.nz\/","name":"Timur and associates","description":"Notes of an IT contractor","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.wiseowls.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59","name":"timur","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","caption":"timur"},"sameAs":["https:\/\/x.com\/TimurKh"]}]}},"_links":{"self":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=1282"}],"version-history":[{"count":11,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1282\/revisions"}],"predecessor-version":[{"id":1300,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1282\/revisions\/1300"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media\/1298"}],"wp:attachment":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=1282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/categories?post=1282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/tags?post=1282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}