{"id":427,"date":"2025-07-02T19:29:40","date_gmt":"2025-07-02T18:29:40","guid":{"rendered":"https:\/\/codebounce.debojyotichatterjee.com\/?p=427"},"modified":"2025-07-02T19:29:40","modified_gmt":"2025-07-02T18:29:40","slug":"sso","status":"publish","type":"post","link":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/2025\/07\/02\/sso\/","title":{"rendered":"What is SSO (Single Sign-On)? How SSO Works?"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">What is Single Sign-On (SSO)?<\/h2>\n\n\n\n<p>We all know ho we can log into Gmail and then access YouTube, Google Drive, and Google Maps without entering your password again? That&#8217;s the what we can call Single Sign-On (SSO) at work. We use dozens of applications on a daily basis, SSO has become a important method for both users and organizations.<\/p>\n\n\n\n<p>Single Sign-On (SSO) is an authentication method that allows users to access multiple applications or services using a uniform way login and keep single credentials. Instead of storing various usernames and passwords, users log in using SSO and it seamlessly grants access to authorized resources. It improves the user experience in many ways.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key Characteristics of SSO<\/h2>\n\n\n\n<p>SSO systems incorporates several important characteristics that make them effective:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Centralized Authentication: All user credentials are managed from a single source.<\/li>\n\n\n\n<li>Trust Relationships: Secure connections between identity providers and service providers.<\/li>\n\n\n\n<li>Token-Based Access: Digital tokens verify user identity across applications.<\/li>\n\n\n\n<li>Session Management: Single logout terminates access to all connected systems.<\/li>\n<\/ul>\n\n\n\n<p>SSO Authentication Flow Diagram<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Core Components of SSO<\/h2>\n\n\n\n<p>Identity Provider (IDP)<br>The Identity Provider is the authentication server that verifies user credentials and issues security tokens.<br>Some popular IDPs are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Azure Active Directory<\/li>\n\n\n\n<li>Okta<\/li>\n\n\n\n<li>Auth0<\/li>\n\n\n\n<li>Google<br>The IdP maintains user profiles at their end, handles authentication, and returns secure tokens containing user information for the application to consume.<\/li>\n<\/ul>\n\n\n\n<p>Service Provider (SP)<br>Service Providers are the applications that users access via SSO login. They can be webApps, other services or applications. Service Providers trust the IDPs to authenticate users and rely on the tokens provided to grant access.<\/p>\n\n\n\n<p>Authentication Tokens<br>Tokens are digital data that contain user&#8217;s identity information. These tokens are tamper proof. Some common token formats are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SAML claims<\/li>\n\n\n\n<li>JWT tokens<\/li>\n\n\n\n<li>OAuth access tokens<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">The SSO Authentication Flow<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"611\" src=\"https:\/\/codebounce.debojyotichatterjee.com\/wp-content\/uploads\/2025\/07\/Drawing-2025-07-02-22.03.17.excalidraw-1024x611.png\" alt=\"\" class=\"wp-image-435\" srcset=\"https:\/\/codebounce.debojyotichatterjee.com\/wp-content\/uploads\/2025\/07\/Drawing-2025-07-02-22.03.17.excalidraw-1024x611.png 1024w, https:\/\/codebounce.debojyotichatterjee.com\/wp-content\/uploads\/2025\/07\/Drawing-2025-07-02-22.03.17.excalidraw-300x179.png 300w, https:\/\/codebounce.debojyotichatterjee.com\/wp-content\/uploads\/2025\/07\/Drawing-2025-07-02-22.03.17.excalidraw-768x458.png 768w, https:\/\/codebounce.debojyotichatterjee.com\/wp-content\/uploads\/2025\/07\/Drawing-2025-07-02-22.03.17.excalidraw.png 1027w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A typical SSO authentication workflow follows the steps below:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>User Access Request: A user attempts to access a protected application or service.<\/li>\n\n\n\n<li>Redirect to IDP: The application redirects the user to the Identity Provider for authentication.<\/li>\n\n\n\n<li>User Authentication: The user enters their credentials at the IDP login page.<\/li>\n\n\n\n<li>Token Generation: The IDP creates a secure token containing user information upon successful authentication.<\/li>\n\n\n\n<li>Token Validation: The application receives the token and validates it from the IDP again.<\/li>\n\n\n\n<li>Access Granted: Upon successful validation, the user gains access to the application.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">SSO Protocols and Standards<\/h2>\n\n\n\n<p>Different protocols power SSO implementations, each with its own strengths and use cases. Understanding these protocols helps you choose the right approach for your organization.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>PROPERTY<\/td><td>SAML<\/td><td>OAuth<\/td><td>OpenID Connect<\/td><\/tr><tr><td>Purpose<\/td><td>XML based Authenticationand AUthorization<\/td><td>AuthorizationProtocol<\/td><td>AuthenticationProtocol<\/td><\/tr><tr><td>Use Case<\/td><td>Secure and Centralizedauthentication.<\/td><td>Grant access to resources.<\/td><td>Authenticate users across applications.<\/td><\/tr><tr><td>Technology<\/td><td>XML based standard<\/td><td>Authorization framework.<\/td><td>Built on top of OAuth2.o<\/td><\/tr><tr><td>Tokens<\/td><td>SAML Assertions.<\/td><td>Access tokens.<\/td><td>JSON Web tokens(JWTs).<\/td><\/tr><tr><td>Actors<\/td><td>Identity Provider(IDP)Service Provider(SP)<\/td><td>Resource Owner, Client and Authorization Server<\/td><td>Identity Provider(IDP)Service Provider(SP)<\/td><\/tr><tr><td>Scenarios<\/td><td>Enterprise SSO, Federated SSO<\/td><td>API access, Third-Party authorization<\/td><td>Single Sign On Social logins.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">SAML (Security Assertion Markup Language)<\/h2>\n\n\n\n<p>SAML is an XML-primarily based wellknown this is particularly famous in company environments. It presents sturdy protection capabilities and distinct characteristic sharing abilities. SAML is ideal for corporations requiring strict compliance and precise audit trails.<\/p>\n\n\n\n<p>Key Features of SAML:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>XML-primarily based assertions for precise user information.<\/li>\n\n\n\n<li>Strong digital signature for protection.<\/li>\n\n\n\n<li>Excellent for enterprise SSO use cases.<\/li>\n\n\n\n<li>Supports both Service Provider-initiated and IDP-initiated flows.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">OAuth 2.0<\/h2>\n\n\n\n<p>OAuth 2.0 is primarily an authorization framework instead of protocol. It&#8217;s extensively used for API access and third-party integrations. OAuth excels in scenarios wherein applications want to get access with out exposing credentials.<\/p>\n\n\n\n<p>Key Features of OAuth 2.0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JSON-based tokens for lightweight communication.<\/li>\n\n\n\n<li>Excellent for mobile apps and webApps.<\/li>\n\n\n\n<li>Supports various grant types for different scenarios.<\/li>\n\n\n\n<li>Widely adopted by social media platforms.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">OpenID Connect (OIDC)<\/h2>\n\n\n\n<p>OpenID Connect is built on top of OAuth 2.0 and adds an authentication layer. It provides simplicity with proper authentication capabilities. OIDC is becoming the preferred choice for modern web applications.<\/p>\n\n\n\n<p>Key Features of OpenID Connect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ID tokens for user authentication.<\/li>\n\n\n\n<li>JSON Web Token (JWT) format for easy parsing.<\/li>\n\n\n\n<li>Standardized endpoints for user info.<\/li>\n\n\n\n<li>Perfect for modern web and mobile applications.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Code Examples<\/h2>\n\n\n\n<p>Let&#8217;s look at practical code examples for implementing SSO using different protocols.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SAML Implementation Example<\/h2>\n\n\n\n<p>Here&#8217;s a Python Flask application implementing SAML-based SSO:<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Python Code Snippet with Copy Button<\/title>\n    \n    <!-- Prism.js CSS for syntax highlighting -->\n    <link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/themes\/prism.min.css\" rel=\"stylesheet\" \/>\n    <!-- Optional theme - choose one you like -->\n    <link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/themes\/prism-okaidia.min.css\" rel=\"stylesheet\" \/>\n    \n    <style>\n        .code-container {\n            position: relative;\n            margin: 20px 0;\n            border-radius: 5px;\n            overflow: hidden;\n        }\n        \n        .code-header {\n            background: #2d2d2d;\n            color: #ccc;\n            padding: 5px 10px;\n            font-family: sans-serif;\n            font-size: 0.8em;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        \n        .copy-btn {\n            background: #4CAF50;\n            color: white;\n            border: none;\n            padding: 5px 10px;\n            border-radius: 3px;\n            cursor: pointer;\n            font-size: 0.8em;\n            transition: background 0.3s;\n        }\n        \n        .copy-btn:hover {\n            background: #45a049;\n        }\n        \n        .copy-btn.copied {\n            background: #2196F3;\n        }\n        \n        pre {\n            margin: 0;\n        }\n        \n        code {\n            font-family: 'Courier New', Courier, monospace;\n        }\n    <\/style>\n<\/head>\n<body>\n    <h1>Python Code Snippet Example<\/h1>\n    \n    <div class=\"code-container\">\n        <div class=\"code-header\">\n            <span>Python Example<\/span>\n            <button class=\"copy-btn\">Copy<\/button>\n        <\/div>\n        <pre><code class=\"language-python\">\n# Python example of SAML-based SSO implementation using python3-saml library\n\nfrom flask import Flask, request, redirect, session\nfrom onelogin.saml2.auth import OneLogin_Saml2_Auth\nfrom onelogin.saml2.settings import OneLogin_Saml2_Settings\nimport os\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'your-secret-key'\napp.config['SAML_PATH'] = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'saml')\n\ndef init_saml_auth(req):\n    auth = OneLogin_Saml2_Auth(req, custom_base_path=app.config['SAML_PATH'])\n    return auth\n\ndef prepare_flask_request(request):\n    return {\n        'https': 'on' if request.scheme == 'https' else 'off',\n        'http_host': request.host,\n        'server_port': request.environ.get('SERVER_PORT', ''),\n        'script_name': request.path,\n        'get_data': request.args.copy(),\n        'post_data': request.form.copy(),\n        'query_string': request.query_string\n    }\n\n@app.route('\/login')\ndef login():\n    req = prepare_flask_request(request)\n    auth = init_saml_auth(req)\n    return redirect(auth.login())\n\n@app.route('\/acs', methods=['POST'])\ndef acs():\n    req = prepare_flask_request(request)\n    auth = init_saml_auth(req)\n    auth.process_response()\n    errors = auth.get_errors()\n    \n    if len(errors) == 0:\n        session['user_data'] = auth.get_attributes()\n        return redirect('\/dashboard')\n    else:\n        return f\"Authentication failed: {errors}\"\n\n        <\/code><\/pre>\n    <\/div>\n\n    <!-- Prism.js JS for syntax highlighting -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/prism.min.js\"><\/script>\n    <!-- Add Python language support -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/components\/prism-python.min.js\"><\/script>\n    \n    <!-- Copy button functionality -->\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            const copyButtons = document.querySelectorAll('.copy-btn');\n            \n            copyButtons.forEach(button => {\n                button.addEventListener('click', function() {\n                    const codeBlock = this.parentElement.nextElementSibling;\n                    const code = codeBlock.querySelector('code').textContent;\n                    \n                    navigator.clipboard.writeText(code).then(() => {\n                        \/\/ Visual feedback\n                        const originalText = this.textContent;\n                        this.textContent = 'Copied!';\n                        this.classList.add('copied');\n                        \n                        setTimeout(() => {\n                            this.textContent = originalText;\n                            this.classList.remove('copied');\n                        }, 2000);\n                    }).catch(err => {\n                        console.error('Failed to copy: ', err);\n                    });\n                });\n            });\n        });\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<p>This example demonstrates the basic structure of a SAML SP implementation. The code handles authentication requests, processes SAML responses, and manages user sessions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OAuth 2.0 Implementation Example<\/h2>\n\n\n\n<p>Here&#8217;s an OAuth implementation using Flask and Authlib:<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Python Code Snippet with Copy Button<\/title>\n    \n    <!-- Prism.js CSS for syntax highlighting -->\n    <link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/themes\/prism.min.css\" rel=\"stylesheet\" \/>\n    <!-- Optional theme - choose one you like -->\n    <link href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/themes\/prism-okaidia.min.css\" rel=\"stylesheet\" \/>\n    \n    <style>\n        .code-container {\n            position: relative;\n            margin: 20px 0;\n            border-radius: 5px;\n            overflow: hidden;\n        }\n        \n        .code-header {\n            background: #2d2d2d;\n            color: #ccc;\n            padding: 5px 10px;\n            font-family: sans-serif;\n            font-size: 0.8em;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n        \n        .copy-btn {\n            background: #4CAF50;\n            color: white;\n            border: none;\n            padding: 5px 10px;\n            border-radius: 3px;\n            cursor: pointer;\n            font-size: 0.8em;\n            transition: background 0.3s;\n        }\n        \n        .copy-btn:hover {\n            background: #45a049;\n        }\n        \n        .copy-btn.copied {\n            background: #2196F3;\n        }\n        \n        pre {\n            margin: 0;\n        }\n        \n        code {\n            font-family: 'Courier New', Courier, monospace;\n        }\n    <\/style>\n<\/head>\n<body>\n    <h1>Python Code Snippet Example<\/h1>\n    \n    <div class=\"code-container\">\n        <div class=\"code-header\">\n            <span>Python Example<\/span>\n            <button class=\"copy-btn\">Copy<\/button>\n        <\/div>\n        <pre><code class=\"language-python\">\n# OAuth 2.0 SSO implementation with Google\n\nfrom flask import Flask, redirect, url_for, session\nfrom authlib.integrations.flask_client import OAuth\n\napp = Flask(__name__)\napp.secret_key = 'your-secret-key'\n\noauth = OAuth(app)\noauth.register(\n    name='google',\n    client_id='YOUR_GOOGLE_CLIENT_ID',\n    client_secret='YOUR_GOOGLE_CLIENT_SECRET',\n    access_token_url='https:\/\/accounts.google.com\/o\/oauth2\/token',\n    authorize_url='https:\/\/accounts.google.com\/o\/oauth2\/auth',\n    api_base_url='https:\/\/www.googleapis.com\/oauth2\/v1\/',\n    client_kwargs={'scope': 'openid email profile'},\n)\n\n@app.route('\/login')\ndef login():\n    redirect_uri = url_for('authorize', _external=True)\n    return oauth.google.authorize_redirect(redirect_uri)\n\n@app.route('\/authorize')\ndef authorize():\n    token = oauth.google.authorize_access_token()\n    resp = oauth.google.get('userinfo')\n    user_info = resp.json()\n    session['user_info'] = user_info\n    return redirect('\/dashboard')\n        <\/code><\/pre>\n    <\/div>\n\n    <!-- Prism.js JS for syntax highlighting -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/prism.min.js\"><\/script>\n    <!-- Add Python language support -->\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/prism\/1.24.1\/components\/prism-python.min.js\"><\/script>\n    \n    <!-- Copy button functionality -->\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            const copyButtons = document.querySelectorAll('.copy-btn');\n            \n            copyButtons.forEach(button => {\n                button.addEventListener('click', function() {\n                    const codeBlock = this.parentElement.nextElementSibling;\n                    const code = codeBlock.querySelector('code').textContent;\n                    \n                    navigator.clipboard.writeText(code).then(() => {\n                        \/\/ Visual feedback\n                        const originalText = this.textContent;\n                        this.textContent = 'Copied!';\n                        this.classList.add('copied');\n                        \n                        setTimeout(() => {\n                            this.textContent = originalText;\n                            this.classList.remove('copied');\n                        }, 2000);\n                    }).catch(err => {\n                        console.error('Failed to copy: ', err);\n                    });\n                });\n            });\n        });\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<p>This OAuth example shows how to integrate with Google&#8217;s OAuth service for user authentication.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SSO Security Challenges and Best Practices<\/h2>\n\n\n\n<p>While SSO has its own benefits, it also comes with a few security considerations that must be addressed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Common Security Challenges<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single Point of Failure<\/strong><br>If the SSO system goes down or fails, users would not be able to access any connected applications. This makes high availability crucial for SSO implementations it can affect on a very large scale.<\/li>\n\n\n\n<li><strong>Increased Attack Surface<\/strong><br>A compromised SSO account potentially provides access to all the connected systems. This increases the impact of security breaches for other connected applications.<\/li>\n\n\n\n<li><strong>Complex Token Management<\/strong><br>Tokens must be properly validated, secured, stored, and expired. Improper token handling can lead to security vulnerabilities.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Security Best Practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Enforcing Multi-Factor Authentication (MFA)<\/strong><br>MFA significantly reduces the risk of unauthorized access, even if credentials are compromised.<\/li>\n\n\n\n<li><strong>Use Strong Token Security<\/strong><br>Follow token best practices including proper and timely expiration, secure storage, and HTTPS transmission. Token payloads should never contain sensitive data.<\/li>\n\n\n\n<li><strong>Regular Security Audits<\/strong><br>Regular reviews of user access rights and SSO configurations must be conducted. It is also a good idea to implement automated monitoring for suspicious authentication patterns.<\/li>\n\n\n\n<li><strong>Adopt Least Privilege Access<\/strong><br>Users should only be granted the minimum required access or permissions necessary for their roles.<\/li>\n\n\n\n<li><strong>Plan for Disaster Recovery<\/strong><br>Implementation of a backup authentication method is highly advisable. One should ensure that a user can access the application even if SSO fails.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Emerging Trends<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zero Trust Security Models<\/strong><br>Single Sign-On (SSO) is becoming a key part of zero trust architectures. Every access request is verified, no matter where it comes from.<\/li>\n\n\n\n<li><strong>Passwordless Authentication<\/strong><br>Integration of biometric authentication and hardware tokens is also being adopted by many platforms that are more concerned about security standards, reducing reliance on traditional passwords.<\/li>\n\n\n\n<li><strong>AI-Powered Security<\/strong><br>Machine learning algorithms are being used to detect abnormality in authentication patterns and raising alarms before any potential security threats happen.<\/li>\n\n\n\n<li><strong>Mobile-First Design<\/strong><br>SSO solutions are increasingly designed with mobile devices as the primary access method.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Providing secure, centralized access to multiple applications, SSO maintains security and user experience while reducing security overhead for an application.<\/p>\n\n\n\n<p>The important part of SSO implementation are planning, proper security measures, and ongoing monitoring. While challenges exist, the benefits are more than the risks when SSO is implemented correctly.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is Single Sign-On (SSO)? We all know ho we can log into Gmail and then access YouTube, Google Drive, and Google Maps without entering your password again? That&#8217;s the what we can call Single Sign-On (SSO) at work. We use dozens of applications on a daily basis, SSO has become a important method for [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":433,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/posts\/427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/comments?post=427"}],"version-history":[{"count":6,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/posts\/427\/revisions"}],"predecessor-version":[{"id":436,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/posts\/427\/revisions\/436"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/media\/433"}],"wp:attachment":[{"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/media?parent=427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/categories?post=427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codebounce.debojyotichatterjee.com\/index.php\/wp-json\/wp\/v2\/tags?post=427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}