{"id":2600,"date":"2024-08-07T20:00:07","date_gmt":"2024-08-07T18:00:07","guid":{"rendered":"http:\/\/agilno.local\/?p=2600"},"modified":"2024-08-08T19:31:10","modified_gmt":"2024-08-08T17:31:10","slug":"implementing-magic-links-for-passwordless-authentication-in-our-application","status":"publish","type":"post","link":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/","title":{"rendered":"Implementing Magic Links for Passwordless Authentication in Our Application"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">At Agilno, we are dedicated to developing innovative solutions that simplify user experiences. For one of our applications, we implemented Magic Links as a form of passwordless authentication. This approach facilitates the easier creation and management of multiple user accounts by our application&#8217;s facilitators when organizing retreats.<\/span><\/p>\n<h2><b>Project Overview<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Our application is a platform designed for therapists and facilitators who organize retreats. It allows them to efficiently manage their clients by sending out forms to fill out, documents to sign, and keeping all relevant information in one centralized location. This streamlined process enhances both the facilitators&#8217; and clients&#8217; experiences, ensuring that all necessary documentation and communications are handled smoothly and securely.<\/span><\/p>\n<h2><b>What are Magic Links?<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Magic Links are a passwordless authentication method that allows users to log in to an application without needing to remember a password. Instead, a unique, cryptographically safe link is generated and sent to the user&#8217;s email address. By clicking on this link, the user is authenticated and granted access to the application.<\/span><\/p>\n<h2><b>Tools used:<\/b><\/h2>\n<h3><b>Django and Django Rest Framework (DRF)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">We used Django, a high-level Python web framework, along with Django Rest Framework (DRF) to build a secure and scalable backend for our application.<\/span><\/p>\n<h3><b>Sendgrid<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Sendgrid was integrated for reliable email delivery, ensuring that Magic Links are sent efficiently and consistently to users&#8217; email addresses.<\/span><\/p>\n<h3><b>Celery<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Celery was used to create asynchronous email-sending tasks, offloading the email sending process to a background task to maintain application responsiveness.<\/span><\/p>\n<h3><b>Python&#8217;s Secrets Module<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">The `secrets` module was utilized to generate cryptographically secure random strings, ensuring the security of our Magic Links.<\/span><\/p>\n<h3><b>Summary of Tools<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">We utilized Django and DRF for our backend, Sendgrid for email delivery, Celery for task management, and Python&#8217;s `secrets` module for secure token generation.<\/span><\/p>\n<h2><b>Generating the Magic Link<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">When a user attempts to log in to our application, we generate a random, cryptographically secure string of numbers and letters. This string serves as a unique token for the user\u2019s login attempt. We use Python&#8217;s `secrets` module to ensure the randomness and security of the generated string:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import secrets\r\n\r\ndef generate_magic_link_token():\r\n\u00a0 \u00a0 return secrets.token_urlsafe(64)<\/pre>\n<p><span style=\"font-weight: 400;\">This token is then stored in our database, associated with the user\u2019s account, and included in a URL that is emailed to the user.<\/span><\/p>\n<h2><b>Sending the Magic Link<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">For sending the Magic Link, we utilize Celery to create an email-sending task and integrate Sendgrid to handle the actual email delivery. This ensures reliable and efficient email processing, even during high-traffic periods.<\/span><\/p>\n<h3><b>Celery Task<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">We define a Celery task to handle the email-sending process. This allows us to offload the email sending to a background task, improving the responsiveness of our application.<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from celery import shared_task\r\nfrom django.conf import settings\r\nimport sendgrid\r\nfrom sendgrid.helpers.mail import Mail\r\n\r\n@shared_task\r\ndef send_magic_link(user_email, token):\r\n\u00a0 \u00a0 sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY)\r\n\u00a0 \u00a0 magic_link = f\"{settings.SITE_URL}\/login\/{token}\"\r\n\u00a0 \u00a0 message = Mail(\r\n\u00a0 \u00a0 \u00a0 \u00a0 from_email=settings.DEFAULT_FROM_EMAIL,\r\n\u00a0 \u00a0 \u00a0 \u00a0 to_emails=user_email,\r\n\u00a0 \u00a0 \u00a0 \u00a0 subject=\"Your Magic Link for Our Application\",\r\n\u00a0 \u00a0 \u00a0 \u00a0 plain_text_content=f\"Click the following link to log in: {magic_link}\"\r\n\u00a0 \u00a0 )\r\n\u00a0 \u00a0 response = sg.send(message)\r\n\u00a0 \u00a0 return response.status_code<\/pre>\n<h2><b>Handling Login Attempts<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">When the user clicks on the Magic Link, they are redirected to our application with the token in the URL. Our backend then verifies the token:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from django.shortcuts import redirect\r\nfrom django.contrib.auth import login\r\nfrom django.utils import timezone\r\n\r\ndef login_with_magic_link(request, token):\r\n\u00a0 \u00a0 user = authenticate_with_token(token)\r\n\u00a0 \u00a0 if user:\r\n\u00a0 \u00a0 \u00a0 \u00a0 login(request, user)\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('dashboard')\r\n\u00a0 \u00a0 else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 # Handle invalid or expired token\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('login')\r\n\r\ndef authenticate_with_token(token):\r\n\u00a0 \u00a0 try:\r\n\u00a0 \u00a0 \u00a0 \u00a0 user_token = UserToken.objects.get(token=token, used=False, expires_at__gt=timezone.now())\r\n\u00a0 \u00a0 \u00a0 \u00a0 user_token.used = True\r\n\u00a0 \u00a0 \u00a0 \u00a0 user_token.save()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return user_token.user\r\n\u00a0 \u00a0 except UserToken.DoesNotExist:\r\n\u00a0 \u00a0 \u00a0 \u00a0 return None<\/pre>\n<h2><b>Security Considerations<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">To ensure the security of our Magic Links:<\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\"><strong>Token Expiration:<\/strong> Each token is given an expiration time. This limits the window during which the token can be used.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><strong>Single Use:<\/strong> Tokens are marked as used after a successful login, preventing reuse.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><strong>Cryptographic Security:<\/strong> The use of the `secrets` module ensures that our tokens are cryptographically secure.<\/span><\/li>\n<\/ol>\n<h2><b>Benefits of Magic Links<\/b><\/h2>\n<ol>\n<li><span style=\"font-weight: 400;\"><strong>Enhanced User Experience:<\/strong> Users do not need to remember passwords, reducing the friction associated with login processes.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><strong>Increased Security:<\/strong> By eliminating passwords, we reduce the risk of password-related attacks such as brute force or credential stuffing.<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><strong>Simplified Account Management:<\/strong> Facilitators can easily create and manage multiple user accounts without needing to distribute and manage passwords.<\/span><\/li>\n<\/ol>\n<h2><b>Conclusion<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Implementing Magic Links in our application has significantly improved our user authentication process. This passwordless approach not only enhances the user experience but also provides a secure and efficient way for facilitators to manage user accounts. At Agilno, we continue to leverage innovative technologies to deliver superior solutions for our clients.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For more information about our services or to discuss how we can help with your next project, contact us at <a href=\"mailto:hello@agilno.com\">hello@agilno.com<\/a>.\u00a0<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>At Agilno, we are dedicated to developing innovative solutions that simplify user experiences. For one of our applications, we implemented<\/p>\n","protected":false},"author":16,"featured_media":2602,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[11],"tags":[],"class_list":["post-2600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Implementing Magic Links for Passwordless Authentication in Our Application - Agilno<\/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:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing Magic Links for Passwordless Authentication in Our Application - Agilno\" \/>\n<meta property=\"og:description\" content=\"At Agilno, we are dedicated to developing innovative solutions that simplify user experiences. For one of our applications, we implemented\" \/>\n<meta property=\"og:url\" content=\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\" \/>\n<meta property=\"og:site_name\" content=\"Agilno\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-07T18:00:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-08T17:31:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Marija\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marija\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\"},\"author\":{\"name\":\"Marija\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715\"},\"headline\":\"Implementing Magic Links for Passwordless Authentication in Our Application\",\"datePublished\":\"2024-08-07T18:00:07+00:00\",\"dateModified\":\"2024-08-08T17:31:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\"},\"wordCount\":670,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg\",\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\",\"url\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\",\"name\":\"Implementing Magic Links for Passwordless Authentication in Our Application - Agilno\",\"isPartOf\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg\",\"datePublished\":\"2024-08-07T18:00:07+00:00\",\"dateModified\":\"2024-08-08T17:31:10+00:00\",\"author\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715\"},\"breadcrumb\":{\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage\",\"url\":\"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg\",\"contentUrl\":\"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg\",\"width\":2560,\"height\":1540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/makeit.com.hr\/agilno\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing Magic Links for Passwordless Authentication in Our Application\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/#website\",\"url\":\"https:\/\/makeit.com.hr\/agilno\/\",\"name\":\"Agilno\",\"description\":\"We build experiences, products, and businesses that create results\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/makeit.com.hr\/agilno\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715\",\"name\":\"Marija\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g\",\"caption\":\"Marija\"},\"url\":\"https:\/\/makeit.com.hr\/agilno\/author\/marija\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing Magic Links for Passwordless Authentication in Our Application - Agilno","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:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/","og_locale":"en_US","og_type":"article","og_title":"Implementing Magic Links for Passwordless Authentication in Our Application - Agilno","og_description":"At Agilno, we are dedicated to developing innovative solutions that simplify user experiences. For one of our applications, we implemented","og_url":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/","og_site_name":"Agilno","article_published_time":"2024-08-07T18:00:07+00:00","article_modified_time":"2024-08-08T17:31:10+00:00","og_image":[{"width":2560,"height":1540,"url":"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg","type":"image\/jpeg"}],"author":"Marija","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Marija","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#article","isPartOf":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/"},"author":{"name":"Marija","@id":"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715"},"headline":"Implementing Magic Links for Passwordless Authentication in Our Application","datePublished":"2024-08-07T18:00:07+00:00","dateModified":"2024-08-08T17:31:10+00:00","mainEntityOfPage":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/"},"wordCount":670,"commentCount":0,"image":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage"},"thumbnailUrl":"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg","articleSection":["Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/","url":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/","name":"Implementing Magic Links for Passwordless Authentication in Our Application - Agilno","isPartOf":{"@id":"https:\/\/makeit.com.hr\/agilno\/#website"},"primaryImageOfPage":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage"},"image":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage"},"thumbnailUrl":"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg","datePublished":"2024-08-07T18:00:07+00:00","dateModified":"2024-08-08T17:31:10+00:00","author":{"@id":"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715"},"breadcrumb":{"@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#primaryimage","url":"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg","contentUrl":"https:\/\/makeit.com.hr\/agilno\/wp-content\/uploads\/2024\/08\/ivan-ivandic.jpg","width":2560,"height":1540},{"@type":"BreadcrumbList","@id":"https:\/\/makeit.com.hr\/agilno\/blog\/implementing-magic-links-for-passwordless-authentication-in-our-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/makeit.com.hr\/agilno\/"},{"@type":"ListItem","position":2,"name":"Implementing Magic Links for Passwordless Authentication in Our Application"}]},{"@type":"WebSite","@id":"https:\/\/makeit.com.hr\/agilno\/#website","url":"https:\/\/makeit.com.hr\/agilno\/","name":"Agilno","description":"We build experiences, products, and businesses that create results","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/makeit.com.hr\/agilno\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/makeit.com.hr\/agilno\/#\/schema\/person\/974127270f2ed3dd1687a8077493d715","name":"Marija","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb138071e84e3a8e95a4b9e008f46076f9b525fc4df1cbaff6eb2c0d2b36cf80?s=96&d=mm&r=g","caption":"Marija"},"url":"https:\/\/makeit.com.hr\/agilno\/author\/marija\/"}]}},"_links":{"self":[{"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/posts\/2600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/comments?post=2600"}],"version-history":[{"count":13,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/posts\/2600\/revisions"}],"predecessor-version":[{"id":2616,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/posts\/2600\/revisions\/2616"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/media\/2602"}],"wp:attachment":[{"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/media?parent=2600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/categories?post=2600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/makeit.com.hr\/agilno\/wp-json\/wp\/v2\/tags?post=2600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}