{"id":83,"date":"2018-09-26T09:34:15","date_gmt":"2018-09-26T09:34:15","guid":{"rendered":"http:\/\/fredborg.org\/?p=83"},"modified":"2018-10-04T06:20:13","modified_gmt":"2018-10-04T06:20:13","slug":"two-factor-authentication-step-1-nav","status":"publish","type":"post","link":"https:\/\/fredborg.org\/?p=83","title":{"rendered":"Two Factor Authentication Step 1: NAV"},"content":{"rendered":"<p>This is the second post in the series if you have not read the first post please do so <a href=\"https:\/\/fredborg.org\/?p=79\">here<\/a>.<\/p>\n<p>Now let us get started with writing some code \ud83d\ude42 In this post I will show you the code needed in NAV to make the Two Factor Authentication work, now all the code below is written in AL code and can be found here on <a href=\"https:\/\/github.com\/dfredborg\/TwoAuthAlCode\/\">GIT HUB.<\/a> Even though the code is written as an extension in AL code, then there is nothing that I do in my code that you can not also do in C\/AL code. This code will work from NAV 2009 and up.<\/p>\n<p>First off we need a table to setup the users, this table will hold the NAV user name, a secret Token which is used later to bind the mobile app with a NAV user, then we need a Login Token, which is where the code needed to login will be stored, and last a field to store for how long a given token is valid. My table looks like this:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ntable 50100 &quot;2 Factor Users&quot;\r\n{\r\n    DataPerCompany = false;\r\n    fields\r\n    {\r\n        field(1; &quot;User ID&quot;; Code&#x5B;50])\r\n        {\r\n            TableRelation = User.&quot;User Name&quot;;\r\n        }\r\n\r\n        field(2; &quot;Secret Token&quot;; Code&#x5B;10])\r\n        {\r\n            trigger OnValidate();\r\n            var &quot;2FactorUser&quot; : Record &quot;2 Factor Users&quot;;\r\n            begin\r\n                &quot;2FactorUser&quot;.SetRange(&quot;Secret Token&quot;,&quot;Secret Token&quot;);\r\n                if &quot;2FactorUser&quot;.FindLast then\r\n                    Error('The Secret Token must be uniq');        \r\n            end;\r\n        }\r\n\r\n        field(3; Expire; Datetime)\r\n        {\r\n\r\n        }\r\n\r\n        field(4; &quot;Login Token&quot;; Code&#x5B;10])\r\n        {\r\n            trigger OnValidate();\r\n            begin\r\n                Expire := CreateDateTime(Today,Time+300000);\r\n            end;\r\n        }\r\n    }\r\n\r\n    keys\r\n    {\r\n        key(PK; &quot;User ID&quot;)\r\n        {\r\n            Clustered = true;\r\n        }\r\n    }\r\n\r\n    var\r\n        \r\n\r\n    trigger OnInsert();\r\n    begin\r\n    end;\r\n\r\n    trigger OnModify();\r\n    begin\r\n    end;\r\n\r\n    trigger OnDelete();\r\n    begin\r\n    end;\r\n\r\n    trigger OnRename();\r\n    begin\r\n    end;\r\n\r\n}\r\n<\/pre>\n<p>As you can see there is nothing magical in this table, I have added some code to the Secret Token validate trigger, that will make sure that your Secret Token is unique, and then there is added some code to Login Token validate trigger that updates the expire date, which will set your token to expire after 5 minutes.<\/p>\n<p>Once you have created your table you will need two pages, one to show a login page and one to let you enter data into your new table. Theses pages could look as follows:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npage 50100 &quot;2 Factor Login&quot;\r\n{\r\n    PageType = Card;\r\n\r\n    layout\r\n    {\r\n        area(content)\r\n        {\r\n            group(Login)\r\n            {\r\n                field(Token; Token)\r\n                {\r\n                    trigger OnValidate();\r\n                    var\r\n                        &quot;2factorSetup&quot;: Record &quot;2 Factor Users&quot;;\r\n                    begin\r\n                        if &quot;2factorSetup&quot;.GET(UserId) then begin\r\n                            if &quot;2factorSetup&quot;.&quot;Login Token&quot; = Token then\r\n                                ERROR('WRONG TOKEN');\r\n                        end else\r\n                            ERROR('No VAILD USER');\r\n                    end;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n    }\r\n\r\n    var\r\n        Token: Code&#x5B;20];\r\n\r\n    trigger OnQueryClosePage(CloseAction: Action): Boolean;\r\n    var\r\n        &quot;2factorSetup&quot;: Record &quot;2 Factor Users&quot;;\r\n    begin\r\n        if &quot;2factorSetup&quot;.GET(UserId) then begin\r\n            if &quot;2factorSetup&quot;.&quot;Login Token&quot; = Token then\r\n                ERROR('WRONG TOKEN');\r\n            if &quot;2factorSetup&quot;.Expire &lt; CurrentDateTime then\r\n                Error('Your token has expired');    \r\n        end else\r\n            ERROR('No VAILD USER');\r\n        EXIT(true);\r\n    end;\r\n}\r\n<\/pre>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\npage 50101 &quot;2 Factor Users&quot;\r\n{\r\n    PageType = List;\r\n    SourceTable = &quot;2 Factor Users&quot;;\r\n    UsageCategory=Lists;\r\n    ApplicationArea=all;\r\n\r\n    layout\r\n    {\r\n        area(content)\r\n        {\r\n            repeater(Group)\r\n            {\r\n                field(&quot;User ID&quot;;&quot;User ID&quot;)\r\n                {\r\n                    \r\n                }\r\n\r\n                field(&quot;Secret Token&quot;;&quot;Secret Token&quot;)\r\n                {\r\n\r\n                }\r\n\r\n                field(&quot;Login Token&quot;;&quot;Login Token&quot;)\r\n                {\r\n\r\n                }\r\n\r\n                field(Expire;Expire)\r\n                {\r\n\r\n                }\r\n            }\r\n        }\r\n        \r\n    }\r\n\r\n}\r\n<\/pre>\n<p>On the page &#8220;2 Factor Login&#8221; there is written some code that will throw an error if you do not enter the correct Token for your user,<br \/>\nor throw an error if your token has expired, and again there are many ways to accomplish the same result, this is just my take on a solution.<br \/>\nThe last thing that you will need is a codeunit, that will be called on before your NAV opens, and in my case I have chosen to subscribe to codeunit 1<br \/>\non the OnBeforeCompanyOpen Event.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ncodeunit 50100 &quot;2FactorMgt&quot;\r\n{\r\n    EventSubscriberInstance = StaticAutomatic;\r\n\r\n    &#x5B;EventSubscriber(ObjectType::Codeunit, Codeunit::ApplicationManagement, 'OnBeforeCompanyOpen', '', true, true)]\r\n    local procedure OnBeforeCompanyOpen()\r\n    var\r\n        &quot;2FactorUsers&quot;: Record &quot;2 Factor Users&quot;;\r\n    begin\r\n        if GuiAllowed then\r\n            if &quot;2FactorUsers&quot;.FindFirst then\r\n                if Page.RunModal(50100) = Action::LookupOK then\r\n                    Message('Your In')\r\n                else\r\n                    Error('Wrong Token');\r\n    end;\r\n}\r\n<\/pre>\n<p>What is important here is that you add the IF GUIALLOWED otherwise your web service will not work, since a web service does not support GUI.<br \/>\nAnd your done with your NAV code, if you work in extensions like my example, you can also add an XML file that will automatically<br \/>\nsetup the web service, when you install the Extension.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;ExportedData&gt;\r\n    &lt;TenantWebServiceCollection&gt;\r\n        &lt;TenantWebService&gt;\r\n            &lt;ObjectType&gt;Page&lt;\/ObjectType&gt;\r\n            &lt;ObjectID&gt;50101&lt;\/ObjectID&gt;\r\n            &lt;ServiceName&gt;TwoFactor&lt;\/ServiceName&gt;\r\n            &lt;Published&gt;true&lt;\/Published&gt;\r\n        &lt;\/TenantWebService&gt;        \r\n    &lt;\/TenantWebServiceCollection&gt;\r\n&lt;\/ExportedData&gt;\r\n<\/pre>\n<p>Now all you have to do is setup your users in the new 2 factor users table, and your done:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-109 size-full\" src=\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/2FacBlank.png\" alt=\"\" width=\"2332\" height=\"252\" srcset=\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/2FacBlank.png 2332w, https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/2FacBlank-300x32.png 300w, https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/2FacBlank-768x83.png 768w, https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/2FacBlank-1024x111.png 1024w\" sizes=\"auto, (max-width: 2332px) 100vw, 2332px\" \/><br \/>\nOn this page you must setup your NAV user with a secret Token, and that is it, do not worry about the other two fields for now, we will use these in<br \/>\nthe next post.<br \/>\nOnce you have setup a user in this table you will be meet with the following dialog when you start your NAV.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-110 \" src=\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/login.png\" alt=\"\" width=\"442\" height=\"356\" srcset=\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/login.png 1008w, https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/login-300x242.png 300w, https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/login-768x619.png 768w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><br \/>\nAnd that is it for this post, in the next post we will create our Master Service, which will allow us to generate a token, so stay tuned \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the second post in the series if you have not read the first post please do so here&#8230;. <a class=\"read-more\" href=\"https:\/\/fredborg.org\/?p=83\" rel=\"nofollow\"> Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":148,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-83","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","shapla-grid-item"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Two Factor Authentication Step 1: NAV - Fredborg<\/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:\/\/fredborg.org\/?p=83\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Two Factor Authentication Step 1: NAV - Fredborg\" \/>\n<meta property=\"og:description\" content=\"This is the second post in the series if you have not read the first post please do so here.... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fredborg.org\/?p=83\" \/>\n<meta property=\"og:site_name\" content=\"Fredborg\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-26T09:34:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-10-04T06:20:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"322\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"dfredborg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dfredborg\" \/>\n<meta name=\"twitter:site\" content=\"@dfredborg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"dfredborg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fredborg.org\/?p=83#article\",\"isPartOf\":{\"@id\":\"https:\/\/fredborg.org\/?p=83\"},\"author\":{\"name\":\"dfredborg\",\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d\"},\"headline\":\"Two Factor Authentication Step 1: NAV\",\"datePublished\":\"2018-09-26T09:34:15+00:00\",\"dateModified\":\"2018-10-04T06:20:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fredborg.org\/?p=83\"},\"wordCount\":916,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d\"},\"image\":{\"@id\":\"https:\/\/fredborg.org\/?p=83#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fredborg.org\/?p=83#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fredborg.org\/?p=83\",\"url\":\"https:\/\/fredborg.org\/?p=83\",\"name\":\"Two Factor Authentication Step 1: NAV - Fredborg\",\"isPartOf\":{\"@id\":\"https:\/\/fredborg.org\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fredborg.org\/?p=83#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fredborg.org\/?p=83#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg\",\"datePublished\":\"2018-09-26T09:34:15+00:00\",\"dateModified\":\"2018-10-04T06:20:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fredborg.org\/?p=83#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fredborg.org\/?p=83\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fredborg.org\/?p=83#primaryimage\",\"url\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg\",\"contentUrl\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg\",\"width\":600,\"height\":322},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fredborg.org\/?p=83#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fredborg.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Two Factor Authentication Step 1: NAV\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fredborg.org\/#website\",\"url\":\"https:\/\/fredborg.org\/\",\"name\":\"Fredborg\",\"description\":\"Business Central and Azure\",\"publisher\":{\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fredborg.org\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d\",\"name\":\"dfredborg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2023\/06\/download.png\",\"contentUrl\":\"https:\/\/fredborg.org\/wp-content\/uploads\/2023\/06\/download.png\",\"width\":256,\"height\":256,\"caption\":\"dfredborg\"},\"logo\":{\"@id\":\"https:\/\/fredborg.org\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:fredborg.org\",\"https:\/\/www.linkedin.com\/in\/dfredborg\/\",\"https:\/\/x.com\/dfredborg\",\"https:\/\/www.youtube.com\/channel\/UCUNZglLDMjBlOK_T9JtI8UA\"],\"url\":\"https:\/\/fredborg.org\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Two Factor Authentication Step 1: NAV - Fredborg","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:\/\/fredborg.org\/?p=83","og_locale":"en_US","og_type":"article","og_title":"Two Factor Authentication Step 1: NAV - Fredborg","og_description":"This is the second post in the series if you have not read the first post please do so here.... Read more","og_url":"https:\/\/fredborg.org\/?p=83","og_site_name":"Fredborg","article_published_time":"2018-09-26T09:34:15+00:00","article_modified_time":"2018-10-04T06:20:13+00:00","og_image":[{"width":600,"height":322,"url":"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg","type":"image\/jpeg"}],"author":"dfredborg","twitter_card":"summary_large_image","twitter_creator":"@dfredborg","twitter_site":"@dfredborg","twitter_misc":{"Written by":"dfredborg","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fredborg.org\/?p=83#article","isPartOf":{"@id":"https:\/\/fredborg.org\/?p=83"},"author":{"name":"dfredborg","@id":"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d"},"headline":"Two Factor Authentication Step 1: NAV","datePublished":"2018-09-26T09:34:15+00:00","dateModified":"2018-10-04T06:20:13+00:00","mainEntityOfPage":{"@id":"https:\/\/fredborg.org\/?p=83"},"wordCount":916,"commentCount":0,"publisher":{"@id":"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d"},"image":{"@id":"https:\/\/fredborg.org\/?p=83#primaryimage"},"thumbnailUrl":"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fredborg.org\/?p=83#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fredborg.org\/?p=83","url":"https:\/\/fredborg.org\/?p=83","name":"Two Factor Authentication Step 1: NAV - Fredborg","isPartOf":{"@id":"https:\/\/fredborg.org\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fredborg.org\/?p=83#primaryimage"},"image":{"@id":"https:\/\/fredborg.org\/?p=83#primaryimage"},"thumbnailUrl":"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg","datePublished":"2018-09-26T09:34:15+00:00","dateModified":"2018-10-04T06:20:13+00:00","breadcrumb":{"@id":"https:\/\/fredborg.org\/?p=83#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fredborg.org\/?p=83"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fredborg.org\/?p=83#primaryimage","url":"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg","contentUrl":"https:\/\/fredborg.org\/wp-content\/uploads\/2018\/09\/BC-twoFactor.jpg","width":600,"height":322},{"@type":"BreadcrumbList","@id":"https:\/\/fredborg.org\/?p=83#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fredborg.org\/"},{"@type":"ListItem","position":2,"name":"Two Factor Authentication Step 1: NAV"}]},{"@type":"WebSite","@id":"https:\/\/fredborg.org\/#website","url":"https:\/\/fredborg.org\/","name":"Fredborg","description":"Business Central and Azure","publisher":{"@id":"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fredborg.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/fredborg.org\/#\/schema\/person\/59a5520cbf04c6bd1267f30b4488e71d","name":"dfredborg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fredborg.org\/#\/schema\/person\/image\/","url":"https:\/\/fredborg.org\/wp-content\/uploads\/2023\/06\/download.png","contentUrl":"https:\/\/fredborg.org\/wp-content\/uploads\/2023\/06\/download.png","width":256,"height":256,"caption":"dfredborg"},"logo":{"@id":"https:\/\/fredborg.org\/#\/schema\/person\/image\/"},"sameAs":["https:fredborg.org","https:\/\/www.linkedin.com\/in\/dfredborg\/","https:\/\/x.com\/dfredborg","https:\/\/www.youtube.com\/channel\/UCUNZglLDMjBlOK_T9JtI8UA"],"url":"https:\/\/fredborg.org\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fredborg.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=83"}],"version-history":[{"count":28,"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":156,"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/posts\/83\/revisions\/156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fredborg.org\/index.php?rest_route=\/wp\/v2\/media\/148"}],"wp:attachment":[{"href":"https:\/\/fredborg.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fredborg.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fredborg.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}