{"id":92,"date":"2025-10-04T18:54:00","date_gmt":"2025-10-04T18:54:00","guid":{"rendered":"https:\/\/wordpress.joeltan.me\/?p=92"},"modified":"2026-01-26T11:26:52","modified_gmt":"2026-01-26T11:26:52","slug":"choosing-the-right-identity-for-testing-why-i-stopped-using-my-own-account","status":"publish","type":"post","link":"https:\/\/joeltan.me\/?p=92","title":{"rendered":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account"},"content":{"rendered":"\n<p>A few years ago, I was testing an Azure Function that pulled secrets from Key Vault. It worked flawlessly on my machine \u2014 every run, every time.<\/p>\n\n\n\n<p>Confident, I pushed the changes to the build pipeline. The deployment succeeded. But a few minutes later, the production logs screamed <strong>\u201cAuthentication failed.\u201d<\/strong><\/p>\n\n\n\n<p>I stared at the error, confused. How could something that worked perfectly in VS Code break the moment it hit the cloud?<\/p>\n\n\n\n<p>That was the day I learned a painful truth about identity in Azure: <strong>it\u2019s not just about whether it works \u2014 it\u2019s about <em>who<\/em> it works for.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Developer\u2019s Shortcut<\/h2>\n\n\n\n<p>Like most engineers, I started with the path of least resistance.<\/p>\n\n\n\n<p>I\u2019d log into Azure CLI with my personal user account, run the app locally, and watch everything connect smoothly. From my perspective, that felt like \u201ctesting early.\u201d I was validating my code and the Key Vault access logic before deploying it.<\/p>\n\n\n\n<p>But in reality, I wasn\u2019t testing what production would experience \u2014 I was testing what <em>I<\/em> was allowed to do.<\/p>\n\n\n\n<p>As a user, I had Contributor access. I could read, write, and even delete the vault if I wanted. My access token was a golden key. So of course my tests passed \u2014 the system wasn\u2019t proving my permissions, it was simply trusting them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The False Sense of Security<\/h2>\n\n\n\n<p>In production, that same app didn\u2019t run as <em>me<\/em>. It ran under a <strong>Managed Identity<\/strong> with very limited Key Vault access \u2014 just enough to read secrets, not manage them.<\/p>\n\n\n\n<p>That subtle difference was enough to break everything. The Managed Identity wasn\u2019t assigned the correct Key Vault role, and since my local tests ran under my overprivileged user identity, the issue never surfaced until it hit PROD.<\/p>\n\n\n\n<p>That\u2019s the danger of developer-led identity testing \u2014 it feels like you\u2019re being proactive, but you\u2019re really just validating your own access, not the system\u2019s configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Shift to Service Principals<\/h2>\n\n\n\n<p>After that outage, I stopped using my personal account for anything beyond local tinkering. I created a <strong>Service Principal (SPN)<\/strong> that mimicked the production identity\u2019s permissions \u2014 nothing more, nothing less.<\/p>\n\n\n\n<p>It was a small change that made a huge difference. A Service Principal is like a synthetic identity. It doesn\u2019t belong to a person; it belongs to the system. It uses a <em>client credential flow<\/em> instead of a login session, and it only has access to what you explicitly grant it.<\/p>\n\n\n\n<p>That means when I test Key Vault access with an SPN, I\u2019m testing exactly what my app will experience \u2014 same flow, same limitations, same RBAC boundaries.<\/p>\n\n\n\n<p>Suddenly, my early tests became meaningful. When they passed, I knew my Managed Identity in SIT or PROD would pass too. When they failed, it was for the right reason.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Culture of Repeatable Testing<\/h2>\n\n\n\n<p>As my team adopted this approach, something else changed: consistency.<\/p>\n\n\n\n<p>Before, one developer\u2019s \u201clocal success\u201d didn\u2019t guarantee another\u2019s. Our CI\/CD pipelines often failed because they ran under different credentials from what we used locally.<\/p>\n\n\n\n<p>By switching all early access tests \u2014 like Key Vault, Storage, or SQL authentication \u2014 to use SPN credentials, we gained <strong>repeatability<\/strong>. The same pytest suite that passed on my laptop would pass on the build agent and in the SIT environment, because the identity context was identical.<\/p>\n\n\n\n<p>It also aligned beautifully with our <strong>principle of least privilege<\/strong>. Developers didn\u2019t need high-level access just to run tests \u2014 the SPN handled that, and we could scope it tightly to the resources we needed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Three-Stage Identity Pattern<\/h2>\n\n\n\n<p>Looking back, the lesson feels obvious, but it reshaped how I approach cloud testing:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Stage<\/th><th>Identity Used<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td><strong>Local Dev<\/strong><\/td><td>Your AAD User<\/td><td>Iterate quickly, debug logic<\/td><\/tr><tr><td><strong>Automated Testing (CI\/CD)<\/strong><\/td><td>Service Principal (SPN)<\/td><td>Validate access, repeatably and securely<\/td><\/tr><tr><td><strong>Runtime (SIT\/PROD)<\/strong><\/td><td>Managed Identity (MI)<\/td><td>Enforce least privilege and environment parity<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>That pattern gives you the best of all worlds: speed during development, accuracy in testing, and security in production.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Testing Across Identity Types<\/h3>\n\n\n\n<p>Here\u2019s how the same test can be adapted across those three stages using <code>pytest<\/code> and <code>azure-identity<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Local Dev \u2014 Your AAD User<\/h4>\n\n\n\n<p>Run locally after <code>az login<\/code> in VS Code or CLI. Ideal for testing logic flow and secret retrieval.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# test_keyvault_user_identity.py\nimport os, pytest\nfrom azure.identity import DefaultAzureCredential\nfrom azure.keyvault.secrets import SecretClient\n\ndef test_keyvault_access_as_user():\n    &quot;&quot;&quot;Runs locally using your AAD user token (via az login).&quot;&quot;&quot;\n    vault_name = os.getenv(&quot;KEY_VAULT_NAME&quot;, &quot;kv-dev-app01&quot;)\n    kv_uri = f&quot;https:\/\/{vault_name}.vault.azure.net&quot;\n    credential = DefaultAzureCredential(exclude_managed_identity_credential=True)\n    client = SecretClient(vault_url=kv_uri, credential=credential)\n    secret = client.get_secret(&quot;db-connection-string&quot;)\n    assert secret.value, &quot;Secret retrieval failed under user identity&quot;\n<\/pre><\/div>\n\n\n<p>\u2705 <strong>Use Case:<\/strong> Early dev loop<br>\u26a0\ufe0f <strong>Limitation:<\/strong> May mask permission issues (too much privilege)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. CI\/CD \u2014 Service Principal (SPN)<\/h4>\n\n\n\n<p>Run automatically during pipeline build\/test stages. Mimics production access with fixed credentials.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# test_keyvault_spn_identity.py\nimport os, pytest\nfrom azure.identity import ClientSecretCredential\nfrom azure.keyvault.secrets import SecretClient\n\ndef test_keyvault_access_as_spn():\n    &quot;&quot;&quot;Validates Key Vault access using Service Principal credentials.&quot;&quot;&quot;\n    tenant_id = os.getenv(&quot;AZURE_TENANT_ID&quot;)\n    client_id = os.getenv(&quot;AZURE_CLIENT_ID&quot;)\n    client_secret = os.getenv(&quot;AZURE_CLIENT_SECRET&quot;)\n    vault_name = os.getenv(&quot;KEY_VAULT_NAME&quot;)\n    kv_uri = f&quot;https:\/\/{vault_name}.vault.azure.net&quot;\n\n    credential = ClientSecretCredential(tenant_id, client_id, client_secret)\n    client = SecretClient(vault_url=kv_uri, credential=credential)\n    secret = client.get_secret(&quot;db-connection-string&quot;)\n    assert secret.value, &quot;SPN lacks access to required secret&quot;\n<\/pre><\/div>\n\n\n<p>\u2705 <strong>Use Case:<\/strong> CI\/CD validation, environment readiness<br>\u26a0\ufe0f <strong>Tip:<\/strong> Scope the SPN to least privilege<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Runtime \u2014 Managed Identity (MI)<\/h4>\n\n\n\n<p>Run from within an Azure resource (Function, Container, or VM) to test the real identity bound to that resource.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# test_keyvault_managed_identity.py\nimport os, pytest\nfrom azure.identity import ManagedIdentityCredential\nfrom azure.keyvault.secrets import SecretClient\n\ndef test_keyvault_access_as_mi():\n    &quot;&quot;&quot;Validates Key Vault access using the resource\u2019s Managed Identity.&quot;&quot;&quot;\n    vault_name = os.getenv(&quot;KEY_VAULT_NAME&quot;, &quot;kv-sit-app01&quot;)\n    kv_uri = f&quot;https:\/\/{vault_name}.vault.azure.net&quot;\n    credential = ManagedIdentityCredential()\n    client = SecretClient(vault_url=kv_uri, credential=credential)\n    secret = client.get_secret(&quot;db-connection-string&quot;)\n    assert secret.value, &quot;Managed Identity missing permission to Key Vault&quot;\n<\/pre><\/div>\n\n\n<p>\u2705 <strong>Use Case:<\/strong> Integration \/ SIT<br>\u26a0\ufe0f <strong>Requirement:<\/strong> Must run <em>inside<\/em> Azure with MI enabled<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why This Test Matters More Than It Looks<\/h3>\n\n\n\n<p>Here\u2019s the obvious part that often goes unsaid \u2014 but it\u2019s the real payoff of all this testing.<\/p>\n\n\n\n<p>If your test successfully retrieves a secret like <code>db-connection-string<\/code>, it\u2019s not just proving that Key Vault access works. It\u2019s also confirming that:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The secret <strong>exists<\/strong> and is <strong>named consistently<\/strong> across environments.<\/li>\n\n\n\n<li>The <strong>identity has the right permissions<\/strong> to read it.<\/li>\n\n\n\n<li>The <strong>value inside<\/strong> (for example, your SQL or Storage connection string) is present and ready to be used \u2014 meaning the app will be able to reach its target resource once deployed.<\/li>\n<\/ol>\n\n\n\n<p>That last point is subtle but critical: when Key Vault returns a connection string successfully, your app can authenticate to the downstream system <strong>without touching a single line of code<\/strong>.<\/p>\n\n\n\n<p>In other words, your test doesn\u2019t just validate secrets \u2014 it validates <em>connectivity, configuration, and permission boundaries<\/em> all at once.<\/p>\n\n\n\n<p>But there\u2019s an important boundary here \u2014 and it\u2019s worth making explicit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Core Principle<\/h3>\n\n\n\n<p>If your Key Vault test successfully retrieves a secret, that confirms <strong>authentication and authorization to Key Vault<\/strong> \u2014 not necessarily <strong>validity of the secret\u2019s contents<\/strong>.<\/p>\n\n\n\n<p>In other words:<\/p>\n\n\n\n<p>\u2705 You\u2019ve proven the <strong>identity<\/strong> (SPN\/MI\/user) can access Key Vault and read the secret.<br>\u274c You haven\u2019t yet proven that the <strong>secret value<\/strong> points to a reachable or correctly-permissioned downstream resource.<\/p>\n\n\n\n<p>That second part is <em>intentionally out of scope<\/em> for this kind of early identity test. Those deeper checks \u2014 validating that the connection string actually connects to SQL, or that a read-only role can\u2019t perform writes \u2014 belong to a different testing layer: the <strong>integration and security QA stages<\/strong>.<\/p>\n\n\n\n<p>This keeps the boundaries clean:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Identity tests<\/strong> \u2192 confirm the right entity can authenticate to Key Vault and retrieve what it needs.<\/li>\n\n\n\n<li><strong>Integration tests<\/strong> \u2192 confirm the retrieved secret works when connecting to the target resource.<\/li>\n\n\n\n<li><strong>Security QA tests<\/strong> \u2192 confirm role-based restrictions behave as intended.<\/li>\n<\/ul>\n\n\n\n<p>That separation means your early \u201cshift-left\u201d tests stay fast, safe, and focused \u2014 while downstream testing covers the rest of the trust chain.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lessons Learned<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>If it works under your user account, that proves nothing.<\/strong> You\u2019re testing your own permissions, not your system\u2019s configuration.<\/li>\n\n\n\n<li><strong>Use SPNs for all automated and environment tests.<\/strong> They replicate the production flow and catch misconfigured RBAC early.<\/li>\n\n\n\n<li><strong>Treat identity testing as part of \u201cshift left\u201d security.<\/strong> Access issues are easy to fix in SIT \u2014 and painful in PROD.<\/li>\n\n\n\n<li><strong>Automate SPN-based tests.<\/strong> Integrate them into your pipeline so every deployment validates access before the code goes live.<\/li>\n\n\n\n<li><strong>Successful secret retrieval = validated downstream connectivity (up to the Key Vault boundary).<\/strong> Connection and role-based permission testing belong further down the pipeline \u2014 owned by integration and security QA.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Closing Thoughts<\/h2>\n\n\n\n<p>The irony is that the closer I tried to \u201ctest like production,\u201d the more I relied on my own identity \u2014 until I realised that was the problem. Identity testing isn\u2019t about <em>you<\/em>. It\u2019s about <em>replicating who your system really is<\/em>.<\/p>\n\n\n\n<p>So if your Key Vault, Storage, or database tests are still running under your account, enjoy that comfort while it lasts. Because one day, when PROD doesn\u2019t trust you anymore, it\u2019s not going to be your code that fails \u2014 it\u2019s your assumptions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few years ago, I was testing an Azure Function that pulled secrets from Key Vault. It worked flawlessly on&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":93,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[3],"tags":[],"class_list":["post-92","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-engineering-systems-that-stay-up"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs<\/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:\/\/joeltan.me\/?p=92\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs\" \/>\n<meta property=\"og:description\" content=\"A few years ago, I was testing an Azure Function that pulled secrets from Key Vault. It worked flawlessly on&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/joeltan.me\/?p=92\" \/>\n<meta property=\"og:site_name\" content=\"Joel Tan Tech Blogs\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-04T18:54:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-26T11:26:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Joel Tan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Tan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/joeltan.me\/?p=92#article\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/?p=92\"},\"author\":{\"name\":\"Joel Tan\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"headline\":\"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account\",\"datePublished\":\"2025-10-04T18:54:00+00:00\",\"dateModified\":\"2026-01-26T11:26:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=92\"},\"wordCount\":1335,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=92#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg\",\"articleSection\":[\"Data Engineering: Systems That Stay Up\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/joeltan.me\/?p=92#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/joeltan.me\/?p=92\",\"url\":\"https:\/\/joeltan.me\/?p=92\",\"name\":\"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs\",\"isPartOf\":{\"@id\":\"https:\/\/joeltan.me\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/joeltan.me\/?p=92#primaryimage\"},\"image\":{\"@id\":\"https:\/\/joeltan.me\/?p=92#primaryimage\"},\"thumbnailUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg\",\"datePublished\":\"2025-10-04T18:54:00+00:00\",\"dateModified\":\"2026-01-26T11:26:52+00:00\",\"author\":{\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\"},\"breadcrumb\":{\"@id\":\"https:\/\/joeltan.me\/?p=92#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/joeltan.me\/?p=92\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/?p=92#primaryimage\",\"url\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg\",\"contentUrl\":\"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg\",\"width\":2560,\"height\":1440,\"caption\":\"Multiple security cameras on a pole with a clear blue sky backdrop.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/joeltan.me\/?p=92#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/joeltan.me\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/joeltan.me\/#website\",\"url\":\"https:\/\/joeltan.me\/\",\"name\":\"Joel Tan Tech Blogs\",\"description\":\"Building systems that survive real life\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/joeltan.me\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743\",\"name\":\"Joel Tan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/joeltan.me\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g\",\"caption\":\"Joel Tan\"},\"sameAs\":[\"http:\/\/192.168.1.146\"],\"url\":\"https:\/\/joeltan.me\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs","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:\/\/joeltan.me\/?p=92","og_locale":"en_US","og_type":"article","og_title":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs","og_description":"A few years ago, I was testing an Azure Function that pulled secrets from Key Vault. It worked flawlessly on&#46;&#46;&#46;","og_url":"https:\/\/joeltan.me\/?p=92","og_site_name":"Joel Tan Tech Blogs","article_published_time":"2025-10-04T18:54:00+00:00","article_modified_time":"2026-01-26T11:26:52+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg","type":"image\/jpeg"}],"author":"Joel Tan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Joel Tan","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/joeltan.me\/?p=92#article","isPartOf":{"@id":"https:\/\/joeltan.me\/?p=92"},"author":{"name":"Joel Tan","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"headline":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account","datePublished":"2025-10-04T18:54:00+00:00","dateModified":"2026-01-26T11:26:52+00:00","mainEntityOfPage":{"@id":"https:\/\/joeltan.me\/?p=92"},"wordCount":1335,"commentCount":0,"image":{"@id":"https:\/\/joeltan.me\/?p=92#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg","articleSection":["Data Engineering: Systems That Stay Up"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/joeltan.me\/?p=92#respond"]}]},{"@type":"WebPage","@id":"https:\/\/joeltan.me\/?p=92","url":"https:\/\/joeltan.me\/?p=92","name":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account - Joel Tan Tech Blogs","isPartOf":{"@id":"https:\/\/joeltan.me\/#website"},"primaryImageOfPage":{"@id":"https:\/\/joeltan.me\/?p=92#primaryimage"},"image":{"@id":"https:\/\/joeltan.me\/?p=92#primaryimage"},"thumbnailUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg","datePublished":"2025-10-04T18:54:00+00:00","dateModified":"2026-01-26T11:26:52+00:00","author":{"@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743"},"breadcrumb":{"@id":"https:\/\/joeltan.me\/?p=92#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/joeltan.me\/?p=92"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/?p=92#primaryimage","url":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg","contentUrl":"https:\/\/joeltan.me\/wp-content\/uploads\/2026\/01\/multiple-security-cameras-on-a-pole-with-a-clear-blue-sky-backdrop.-179993-scaled.jpg","width":2560,"height":1440,"caption":"Multiple security cameras on a pole with a clear blue sky backdrop."},{"@type":"BreadcrumbList","@id":"https:\/\/joeltan.me\/?p=92#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/joeltan.me\/"},{"@type":"ListItem","position":2,"name":"Choosing the Right Identity for Testing: Why I Stopped Using My Own Account"}]},{"@type":"WebSite","@id":"https:\/\/joeltan.me\/#website","url":"https:\/\/joeltan.me\/","name":"Joel Tan Tech Blogs","description":"Building systems that survive real life","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/joeltan.me\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/joeltan.me\/#\/schema\/person\/db13342201787db723bfdeadcd792743","name":"Joel Tan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/joeltan.me\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9b5d1ab218cb2478280027d371ea60543f6551132d31a8cbd45a5a5b3fbadc9?s=96&d=mm&r=g","caption":"Joel Tan"},"sameAs":["http:\/\/192.168.1.146"],"url":"https:\/\/joeltan.me\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/92","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=92"}],"version-history":[{"count":1,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":94,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/posts\/92\/revisions\/94"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=\/wp\/v2\/media\/93"}],"wp:attachment":[{"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/joeltan.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}