<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Xiao Yijun</title>
    <description>The latest articles on DEV Community by Xiao Yijun (@xiaoyijun).</description>
    <link>https://dev.to/xiaoyijun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1022242%2F00cd304a-b89e-4c42-bf0e-377d75a8bfe6.png</url>
      <title>DEV Community: Xiao Yijun</title>
      <link>https://dev.to/xiaoyijun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xiaoyijun"/>
    <language>en</language>
    <item>
      <title>Getting CLI authentication right: the complete guide to all 4 methods</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Thu, 09 Apr 2026 02:16:27 +0000</pubDate>
      <link>https://dev.to/logto/getting-cli-authentication-right-the-complete-guide-to-all-4-methods-1mnf</link>
      <guid>https://dev.to/logto/getting-cli-authentication-right-the-complete-guide-to-all-4-methods-1mnf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every developer CLI ships with &lt;code&gt;login&lt;/code&gt; as its first command. And every one of them solves auth differently.&lt;/p&gt;

&lt;p&gt;GitHub shows you a code and opens your browser to verify it. AWS opens a browser for PKCE-based SSO. Stripe has you confirm a pairing code in the dashboard. The newer AI tools (Claude Code, OpenAI Codex CLI, Cursor) each picked their own approach too.&lt;/p&gt;

&lt;p&gt;If you're building a CLI, auth is one of the first things you need to figure out. Pick the wrong method and you'll hear about it: frustrated users, security audits, or both. And with the recent wave of AI coding agents that call CLI tools programmatically, the stakes are higher: you're not just authenticating a human anymore. You might be handing credentials to an autonomous process.&lt;/p&gt;

&lt;p&gt;Here are the four auth methods that matter, how the biggest tools implement them, and the mistakes you'll want to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four methods at a glance
&lt;/h2&gt;

&lt;p&gt;Before going deep, here's the quick comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Security&lt;/th&gt;
&lt;th&gt;Needs browser?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Device Code Flow&lt;/td&gt;
&lt;td&gt;Headless environments, SSH&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;No (on the same machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-based OAuth (localhost redirect)&lt;/td&gt;
&lt;td&gt;Local development&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Keys / PATs&lt;/td&gt;
&lt;td&gt;Automation, CI/CD, quick prototyping&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Credentials&lt;/td&gt;
&lt;td&gt;Machine-to-machine, services&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each has tradeoffs. Here's what you need to know about each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. OAuth device code flow (RFC 8628)
&lt;/h2&gt;

&lt;p&gt;This is the one where your CLI shows you a code like &lt;code&gt;ABCD-1234&lt;/code&gt; and a URL, then tells you to open that URL on any device and enter the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who uses it:&lt;/strong&gt; GitHub CLI (default), Azure CLI (via &lt;code&gt;--use-device-code&lt;/code&gt;), Vercel CLI (recently switched to this as default), OpenAI Codex CLI (as a beta option)&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You run &lt;code&gt;cli login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The CLI requests a device code from the auth server, sending its &lt;code&gt;client_id&lt;/code&gt; and requested scopes&lt;/li&gt;
&lt;li&gt;The server returns three things: a &lt;code&gt;device_code&lt;/code&gt; (internal identifier), a &lt;code&gt;user_code&lt;/code&gt; (the short code you type), and a &lt;code&gt;verification_uri&lt;/code&gt; (where to go)&lt;/li&gt;
&lt;li&gt;Your CLI displays the code and URL, then starts polling the auth server every 5+ seconds&lt;/li&gt;
&lt;li&gt;You open the URL on &lt;em&gt;any&lt;/em&gt; device (phone, laptop, a different computer), type in the code, and authenticate however you want (password, SSO, passkeys, MFA)&lt;/li&gt;
&lt;li&gt;Once you approve, the next poll returns an access token and refresh token&lt;/li&gt;
&lt;li&gt;The CLI stores these and you're in&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why developers like it
&lt;/h3&gt;

&lt;p&gt;The big selling point: it works anywhere. SSH session into a remote server? Works. Running inside a Docker container? Works. Cloud IDE with no local browser? Works. The browser doesn't need to be on the same machine as the CLI.&lt;/p&gt;

&lt;p&gt;It also supports the full range of enterprise auth (SAML, OIDC, MFA) because all of that happens in the browser, not in the terminal. The CLI never sees your password.&lt;/p&gt;

&lt;h3&gt;
  
  
  The security catch most people miss
&lt;/h3&gt;

&lt;p&gt;Device code flow has a phishing problem. An attacker can initiate a device code request, get a legitimate user code, and trick you into entering it, effectively authorizing the attacker's session. This isn't theoretical. Security researchers have documented this attack against AWS SSO device code auth.&lt;/p&gt;

&lt;p&gt;This is a big enough concern that &lt;strong&gt;AWS changed their default&lt;/strong&gt;. Starting with AWS CLI v2.22.0, the default for &lt;code&gt;aws sso login&lt;/code&gt; switched from device code flow to PKCE-based authorization code flow. Device code is still available via &lt;code&gt;--use-device-code&lt;/code&gt;, but it's no longer the default path.&lt;/p&gt;

&lt;p&gt;Meanwhile, Microsoft's own tenant has &lt;a href="https://github.com/Azure/azure-cli/issues/32420" rel="noopener noreferrer"&gt;started blocking device code flow entirely&lt;/a&gt; via conditional access policies, a strong signal that they consider it a high-risk authentication method.&lt;/p&gt;

&lt;p&gt;So we have an interesting split: Vercel &lt;em&gt;adopted&lt;/em&gt; device code flow as their default in September 2025, while AWS moved &lt;em&gt;away&lt;/em&gt; from it. The pattern seems to be that device code flow is great for environments where you genuinely can't open a browser, but if you can open one locally, PKCE is the safer bet.&lt;/p&gt;

&lt;p&gt;On the auth provider side, the demand is clearly growing. &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt; just shipped OAuth 2.0 Device Authorization Grant support for native apps in v1.38.0 (open source) and Logto Cloud, so you can now enable device flow as the authorization method for any native application. This matters if you're building a CLI. Implementing RFC 8628 correctly (code expiry, rate limiting, polling logic, the sign-in UX on the verification page) is more work than most teams expect, and having your auth provider handle it means you just need to make the right HTTP calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical details from the RFC
&lt;/h3&gt;

&lt;p&gt;A few things worth knowing from RFC 8628:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;expires_in&lt;/code&gt; value for device codes is set by the auth server. The RFC uses 1800 seconds (30 minutes) as an example, but it's not a fixed requirement.&lt;/li&gt;
&lt;li&gt;If the server doesn't specify a polling &lt;code&gt;interval&lt;/code&gt;, clients must default to 5 seconds.&lt;/li&gt;
&lt;li&gt;If you get a &lt;code&gt;slow_down&lt;/code&gt; error, add 5 seconds to your interval.&lt;/li&gt;
&lt;li&gt;Device codes should be single-use and expire quickly.&lt;/li&gt;
&lt;li&gt;All token exchanges must happen over HTTPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Browser-based OAuth (localhost redirect)
&lt;/h2&gt;

&lt;p&gt;This is the most common method for CLIs running on a developer's local machine. You run &lt;code&gt;login&lt;/code&gt;, your browser opens, you authenticate, and the browser redirects back to a local server the CLI spun up. Modern implementations add PKCE (pronounced "pixie") on top, which makes the flow much harder to exploit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who uses it:&lt;/strong&gt; Claude Code, gcloud CLI, Terraform CLI, AWS CLI v2.22+ (for SSO, with PKCE as default)&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;You run &lt;code&gt;cli login&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The CLI starts a temporary HTTP server on a random local port (say &lt;code&gt;http://127.0.0.1:8742&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;It opens your default browser to the auth provider's authorization endpoint, passing that localhost URL as the redirect URI&lt;/li&gt;
&lt;li&gt;You authenticate in the browser (SSO, password, passkeys, whatever the provider supports)&lt;/li&gt;
&lt;li&gt;The auth provider redirects your browser to &lt;code&gt;http://127.0.0.1:8742/callback?code=XXXX&amp;amp;state=YYYY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The local server captures the authorization code, exchanges it for tokens via a back-channel HTTPS request&lt;/li&gt;
&lt;li&gt;The browser shows a "Success! You can close this tab" page&lt;/li&gt;
&lt;li&gt;The CLI stores the tokens and shuts down the local server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The user experience is smooth. No codes to copy, no URLs to type. Just a browser tab that opens and closes.&lt;/p&gt;

&lt;h3&gt;
  
  
  When it falls apart
&lt;/h3&gt;

&lt;p&gt;This only works when the CLI can open a browser and bind to localhost. That rules out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH sessions to remote servers&lt;/li&gt;
&lt;li&gt;Docker containers (unless you do port forwarding gymnastics)&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Headless servers&lt;/li&gt;
&lt;li&gt;Some restricted corporate environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why most tools that default to browser OAuth also support a fallback, typically device code flow or API keys.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three security pitfalls that keep showing up
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 1: Binding to 0.0.0.0 instead of 127.0.0.1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most common mistake, and it's severe. If your callback server listens on all interfaces, anyone on the same network can intercept the authorization code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad: exposed to the entire network&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Good: only accessible locally&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;127.0.0.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've seen this in production CLIs. It's an easy mistake to make because many HTTP server libraries default to &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pitfall 2: Missing state parameter validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;state&lt;/code&gt; parameter is your CSRF protection. Without it, an attacker can trick your CLI into accepting an authorization code from a malicious session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad: no CSRF protection&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;exchangeCodeForTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Could be from anyone&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Good: validate state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;exchangeCodeForTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pitfall 3: Not using PKCE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your OAuth flow doesn't use PKCE (Proof Key for Code Exchange), the authorization code can be intercepted and replayed.&lt;/p&gt;

&lt;p&gt;In a standard authorization code flow, if an attacker intercepts the authorization code (through the network, or by reading the redirect URL), they can exchange it for tokens. PKCE prevents this by requiring proof that the token exchange was initiated by the same client that started the authorization request.&lt;/p&gt;

&lt;p&gt;Here's what PKCE adds to the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Before starting the flow, the CLI generates a random &lt;code&gt;code_verifier&lt;/code&gt; (a high-entropy string)&lt;/li&gt;
&lt;li&gt;It creates a &lt;code&gt;code_challenge&lt;/code&gt; by hashing the verifier with SHA-256&lt;/li&gt;
&lt;li&gt;The challenge is sent with the initial authorization request&lt;/li&gt;
&lt;li&gt;When exchanging the code for tokens, the CLI sends the original &lt;code&gt;code_verifier&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The auth server verifies that the verifier matches the challenge&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An attacker who intercepts the authorization code doesn't have the &lt;code&gt;code_verifier&lt;/code&gt;, so they can't complete the exchange.&lt;/p&gt;

&lt;p&gt;This is why AWS CLI v2.22+ made PKCE the default for SSO, moving away from device code flow. When the CLI can open a browser on the same machine, browser OAuth with PKCE is strictly better than device code flow — same UX, stronger security guarantees, no phishing vector. Device code flow is still the right choice when the browser &lt;em&gt;can't&lt;/em&gt; be on the same machine (SSH, containers, remote dev environments), but that's not the common case for local development.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. API keys and personal access tokens
&lt;/h2&gt;

&lt;p&gt;The simplest approach. You generate a token in a web dashboard, paste it into your CLI config or an environment variable, and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who uses it:&lt;/strong&gt; Stripe CLI (as a login option), npm, pip, most AI coding tools as a fallback (Claude Code via &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, OpenAI tools via &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;, Aider)&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Log into the service's web dashboard&lt;/li&gt;
&lt;li&gt;Go to settings → API keys (or personal access tokens, or developer tokens)&lt;/li&gt;
&lt;li&gt;Generate a new key, usually a long random string with a prefix (e.g., &lt;code&gt;sk_live_&lt;/code&gt;, &lt;code&gt;ghp_&lt;/code&gt;, &lt;code&gt;npm_&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Store it in a config file (&lt;code&gt;~/.config/stripe/config.toml&lt;/code&gt;, &lt;code&gt;~/.aws/credentials&lt;/code&gt;) or an environment variable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The CLI reads it on startup and includes it in API requests, typically as a &lt;code&gt;Bearer&lt;/code&gt; token in the &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it's still popular despite the risks
&lt;/h3&gt;

&lt;p&gt;For automation, API keys are hard to beat. They work in CI/CD, in containers, in scripts, in cron jobs. Anywhere that can read an environment variable. No browser needed. No interactive prompts. No token refresh dance.&lt;/p&gt;

&lt;p&gt;For AI agent workflows especially, API keys are the path of least resistance. When Claude Code or Cursor needs to call an API, an environment variable with an API key is the simplest integration point.&lt;/p&gt;

&lt;h3&gt;
  
  
  The risks are real
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leaks.&lt;/strong&gt; API keys end up in git commits, log files, error messages, and CI output. GitHub scans for exposed tokens and reports over a million leaked secrets per year.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overprivileged.&lt;/strong&gt; Most API keys grant broad access. If leaked, the blast radius is large.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No MFA.&lt;/strong&gt; API keys bypass your carefully configured multi-factor auth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to rotate.&lt;/strong&gt; Every time you rotate a key, you need to update it everywhere it's stored. With teams, that's a coordination problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modern enhancement: temporary token exchange
&lt;/h3&gt;

&lt;p&gt;The smart move when using API keys: exchange them for short-lived tokens at runtime.&lt;/p&gt;

&lt;p&gt;AWS pioneered this with STS (Security Token Service). Your long-lived credentials are only used to request temporary credentials that expire in an hour. Tools like &lt;code&gt;aws-vault&lt;/code&gt; automate this entirely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;sts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;temp_creds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assume_role&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;RoleArn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arn:aws:iam::123456789:role/CLIRole&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;RoleSessionName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cli-session&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# temp_creds expire in 1 hour by default
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if you start with API keys, consider adding this pattern. It limits the damage window of a compromised key from "until someone notices" to "one hour."&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Client credentials flow
&lt;/h2&gt;

&lt;p&gt;This OAuth 2.0 flow is designed for machine-to-machine auth: services talking to services, no human involved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used in:&lt;/strong&gt; CI/CD pipelines, background services, automated tooling&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&amp;amp;client_id=my_service
&amp;amp;client_secret=secret_value
&amp;amp;scope=api:read api:write
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The service sends its &lt;code&gt;client_id&lt;/code&gt; and &lt;code&gt;client_secret&lt;/code&gt; directly to the auth server and gets back a short-lived access token. No browser, no user interaction, no redirect.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use it
&lt;/h3&gt;

&lt;p&gt;Use client credentials when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A service or bot needs to authenticate, not a human&lt;/li&gt;
&lt;li&gt;You're in a CI/CD pipeline&lt;/li&gt;
&lt;li&gt;You need automated, unattended access&lt;/li&gt;
&lt;li&gt;The "user" is the application itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't use it for human authentication. It doesn't support MFA, SSO, or any interactive verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What real CLIs actually use
&lt;/h2&gt;

&lt;p&gt;Here's a corrected breakdown based on current documentation and source code. A lot of articles get this wrong because tools keep changing their defaults.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CLI Tool&lt;/th&gt;
&lt;th&gt;Default auth&lt;/th&gt;
&lt;th&gt;Fallback options&lt;/th&gt;
&lt;th&gt;Token storage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Device code flow via browser&lt;/td&gt;
&lt;td&gt;PAT (&lt;code&gt;--with-token&lt;/code&gt;), env var (&lt;code&gt;GH_TOKEN&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;OS keychain (fallback: plain text file)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CLI v2&lt;/td&gt;
&lt;td&gt;PKCE auth code flow (SSO)&lt;/td&gt;
&lt;td&gt;Device code (&lt;code&gt;--use-device-code&lt;/code&gt;), credential files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.aws/sso/cache/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure CLI (&lt;code&gt;az&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;WAM on Windows; browser auth code flow on Linux/macOS&lt;/td&gt;
&lt;td&gt;Device code (&lt;code&gt;--use-device-code&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.azure/msal_token_cache.*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel CLI&lt;/td&gt;
&lt;td&gt;Device code flow (new default, Sep 2025)&lt;/td&gt;
&lt;td&gt;API token (&lt;code&gt;--token&lt;/code&gt;, env var)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/share/com.vercel.cli/auth.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe CLI&lt;/td&gt;
&lt;td&gt;Browser-based pairing flow&lt;/td&gt;
&lt;td&gt;API key (&lt;code&gt;--interactive&lt;/code&gt;, &lt;code&gt;--api-key&lt;/code&gt;, or env var)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/stripe/config.toml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcloud CLI&lt;/td&gt;
&lt;td&gt;Browser OAuth&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;--no-browser&lt;/code&gt; manual flow&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/gcloud/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Browser OAuth&lt;/td&gt;
&lt;td&gt;API key (env var, &lt;code&gt;apiKeyHelper&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;OS keychain / &lt;code&gt;~/.claude/.credentials.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI Codex CLI&lt;/td&gt;
&lt;td&gt;Browser OAuth&lt;/td&gt;
&lt;td&gt;Device code (beta), API key&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.codex/auth.json&lt;/code&gt; / OS keyring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform CLI&lt;/td&gt;
&lt;td&gt;Browser OAuth&lt;/td&gt;
&lt;td&gt;Token paste&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.terraform.d/credentials.tfrc.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trend is clear: &lt;strong&gt;browser-based OAuth is the default for local development, with device code flow as the headless fallback, and API keys for automation.&lt;/strong&gt; PKCE is gaining ground as the most secure option when a browser is available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token storage: what to use, what to avoid
&lt;/h2&gt;

&lt;p&gt;Getting auth right doesn't matter if you store the tokens wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  The right way: OS keychains
&lt;/h3&gt;

&lt;p&gt;Every major OS has a built-in encrypted credential store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; Keychain (used by GitHub CLI, Claude Code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; Credential Manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux:&lt;/strong&gt; Secret Service API (GNOME Keyring, KDE Wallet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These provide OS-level encryption, access control, and hardware security integration. Your CLI doesn't need to implement its own crypto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Using keytar (cross-platform keychain library)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keytar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keytar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Store&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;keytar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-cli&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieve&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;keytar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-cli&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The fallback: encrypted config files
&lt;/h3&gt;

&lt;p&gt;When a keychain isn't available (containers, minimal Linux installs), use encrypted config files with restrictive permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# File permissions: owner read/write only&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.config/my-cli/credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What to avoid
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Plaintext files.&lt;/strong&gt; This should be obvious, but plenty of tools still do it. A plaintext token file is accessible to every process running as your user, every backup tool, and anyone who gets temporary access to your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Don't do this&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;homedir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.myapp/token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Environment variables for long-term storage.&lt;/strong&gt; Environment variables are visible in process listings, often logged by crash reporters, and inherited by child processes. They're fine for CI/CD (where the CI platform manages the secret) but risky for local development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser localStorage.&lt;/strong&gt; If your CLI has a web component, don't store tokens in localStorage. One XSS vulnerability exposes everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token lifecycle management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Access tokens
&lt;/h3&gt;

&lt;p&gt;Keep them short-lived. One hour is the common standard. When an access token expires, the CLI should transparently refresh it. The user shouldn't have to re-login for routine operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refresh tokens
&lt;/h3&gt;

&lt;p&gt;Refresh tokens are the long-lived credentials that let you get new access tokens without re-authenticating. They're high-value targets for attackers because of their longer lifespan (days to months).&lt;/p&gt;

&lt;h3&gt;
  
  
  Refresh token rotation
&lt;/h3&gt;

&lt;p&gt;Modern auth systems rotate refresh tokens on every use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI sends refresh token to get a new access token&lt;/li&gt;
&lt;li&gt;Auth server returns a new access token &lt;em&gt;and a new refresh token&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;The old refresh token is immediately invalidated&lt;/li&gt;
&lt;li&gt;CLI stores both new tokens&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This limits the damage of a stolen refresh token. If an attacker tries to use a refresh token that the legitimate CLI already used, the auth server detects the reuse and invalidates the entire token family. Both the attacker's stolen token and the legitimate user's current token stop working, forcing re-authentication but preventing the attacker from maintaining access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common pitfalls (with code)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Binding the callback server to all interfaces
&lt;/h3&gt;

&lt;p&gt;Already covered above, but worth repeating: always bind to &lt;code&gt;127.0.0.1&lt;/code&gt;, never &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Logging tokens
&lt;/h3&gt;

&lt;p&gt;This happens more often than anyone admits. A debug log statement, an error handler that dumps the request headers, a verbose mode that prints everything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This will end up in your log aggregator, your support tickets,&lt;/span&gt;
&lt;span class="c1"&gt;// and eventually on someone's screenshot in Slack&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Request headers:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Better: redact sensitive headers&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Request headers:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Baking credentials into container images
&lt;/h3&gt;

&lt;p&gt;Docker images are not secret stores. Every layer is extractable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Anyone who pulls this image can extract your key&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; API_KEY=sk_live_abc123&lt;/span&gt;

&lt;span class="c"&gt;# Instead: accept credentials at runtime&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; API_KEY=""&lt;/span&gt;
&lt;span class="c"&gt;# docker run -e API_KEY=${API_KEY} my-image&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Not handling token expiry gracefully
&lt;/h3&gt;

&lt;p&gt;When a token expires mid-operation, don't just crash with a 401 error. Attempt a refresh, and only prompt for re-authentication if the refresh token is also expired.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;api_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;auth_headers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;refresh_tokens&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="c1"&gt;# Retry with new tokens
&lt;/span&gt;            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;auth_headers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;AuthExpiredError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Session expired. Please run `cli login` again.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Ignoring the principle of least privilege
&lt;/h3&gt;

&lt;p&gt;Don't request &lt;code&gt;admin:*&lt;/code&gt; scope when you only need &lt;code&gt;repo:read&lt;/code&gt;. This applies to both OAuth scopes and API key permissions.&lt;/p&gt;

&lt;p&gt;When an AI agent is using your CLI, this becomes even more important. You probably don't want an AI assistant to have delete-repo permissions just because it needs to read code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI agent wrinkle
&lt;/h2&gt;

&lt;p&gt;Here's what makes 2026 different from 2023: CLIs aren't just for humans typing commands anymore. AI coding agents like Claude Code, Codex, and Cursor's agent mode call CLI tools programmatically. This creates new auth challenges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delegated permissions.&lt;/strong&gt; When Claude Code runs &lt;code&gt;gh pr create&lt;/code&gt; on your behalf, it's using &lt;em&gt;your&lt;/em&gt; GitHub credentials. But should an AI agent have the same permissions as you? The principle of least privilege says no, but most tools don't have a way to scope down agent access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credential exposure.&lt;/strong&gt; If your API key is in an environment variable, every process can read it, including the AI agent's subprocess. Tools like Claude Code have addressed this with &lt;code&gt;apiKeyHelper&lt;/code&gt; scripts that generate short-lived tokens on demand, but this isn't universal yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headless auth for agents.&lt;/strong&gt; An AI agent running in a sandboxed environment can't open a browser. Device code flow works here (the human approves on a separate device), but API keys are the more common solution because they require zero interaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit trails.&lt;/strong&gt; When an AI agent makes API calls with your credentials, the audit log shows &lt;em&gt;you&lt;/em&gt; made those calls. There's currently no standard way to distinguish "the human did this" from "the agent did this on behalf of the human."&lt;/p&gt;

&lt;p&gt;This is an evolving space. The best thing you can do right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use scoped tokens with minimal permissions for agent workflows&lt;/li&gt;
&lt;li&gt;Prefer short-lived credentials (temporary tokens, not long-lived API keys)&lt;/li&gt;
&lt;li&gt;Use dedicated credentials for agent use, separate from your personal credentials&lt;/li&gt;
&lt;li&gt;Monitor API usage for unexpected patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decision framework
&lt;/h2&gt;

&lt;p&gt;Picking an auth method? Here's the short version:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"My users are developers on their local machines"&lt;/strong&gt;&lt;br&gt;
→ Browser-based OAuth with PKCE (best security + smooth UX)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"My CLI needs to work in SSH sessions and containers"&lt;/strong&gt;&lt;br&gt;
→ Device code flow as fallback, browser OAuth as primary&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"This runs in CI/CD with no human in the loop"&lt;/strong&gt;&lt;br&gt;
→ Client credentials flow or scoped API keys&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"I need the fastest implementation possible"&lt;/strong&gt;&lt;br&gt;
→ API keys (but add token rotation later)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Enterprise customers need SSO and MFA"&lt;/strong&gt;&lt;br&gt;
→ Any OAuth flow (device code or browser), which supports the full enterprise auth stack&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"AI agents will use this CLI"&lt;/strong&gt;&lt;br&gt;
→ Support API keys (for easy agent integration) + browser OAuth (for human users), with scoped permissions and short-lived tokens&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is device code flow secure?
&lt;/h3&gt;

&lt;p&gt;It's secure against most attacks, but it has a known phishing vulnerability. An attacker can generate a device code and trick users into authorizing it. This is why AWS moved to PKCE as the default for SSO login. For headless environments where PKCE isn't practical, device code flow is still the best option. Just be aware of the phishing risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I store tokens in environment variables?
&lt;/h3&gt;

&lt;p&gt;For CI/CD: yes, because the CI platform encrypts them at rest and injects them at runtime. For local development: no. Use the OS keychain instead. Environment variables are visible in process listings and can be accidentally logged or leaked to child processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between an API key and a personal access token?
&lt;/h3&gt;

&lt;p&gt;Functionally, very little. Both are long-lived credentials that authenticate API requests. The distinction is mostly organizational: API keys are often scoped to a project or application, while personal access tokens are tied to a user account. Some services use the terms interchangeably.&lt;/p&gt;

&lt;h3&gt;
  
  
  How often should I rotate credentials?
&lt;/h3&gt;

&lt;p&gt;Access tokens: every hour or less (handled automatically by the token refresh flow). Refresh tokens: rotate on every use (the auth server should do this). API keys: at least every 90 days, or immediately if you suspect exposure. In practice, most teams only rotate API keys after an incident, which is too late.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle auth in Docker containers?
&lt;/h3&gt;

&lt;p&gt;Three options, in order of preference:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Device code flow&lt;/strong&gt; for interactive use (works because the browser can be on a different machine)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt; passed at runtime (&lt;code&gt;docker run -e API_KEY=${API_KEY}&lt;/code&gt;) for CI/CD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume-mounted credentials&lt;/strong&gt; (&lt;code&gt;docker run -v ~/.config/tool:/root/.config/tool:ro&lt;/code&gt;) for local development&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Never bake credentials into the image. Never.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about MCP (Model Context Protocol) authentication?
&lt;/h3&gt;

&lt;p&gt;MCP is the emerging standard for AI agents to connect with external tools and services. It introduces a new auth dimension: the agent needs credentials to talk to the MCP server, which in turn needs credentials to talk to downstream APIs. This is still being standardized. For now, most MCP implementations use API keys or OAuth tokens passed through the MCP configuration. Expect this to evolve rapidly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CLI auth is changing fast. What was best practice two years ago (device code flow as the default, plaintext credential files) is already being replaced. If you're adding auth to a CLI today, start with browser OAuth + PKCE for humans, API keys for automation, and plan for the day when AI agents are your primary users.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>oauth</category>
      <category>security</category>
    </item>
    <item>
      <title>How to choose an identity provider: The engineering team's evaluation framework</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Tue, 24 Feb 2026 05:05:48 +0000</pubDate>
      <link>https://dev.to/logto/how-to-choose-an-identity-provider-the-engineering-teams-evaluation-framework-2719</link>
      <guid>https://dev.to/logto/how-to-choose-an-identity-provider-the-engineering-teams-evaluation-framework-2719</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most identity provider comparison articles are written by identity providers. Shocking, right? They list features their product has, skip the ones it doesn't, and call it an "objective guide."&lt;/p&gt;

&lt;p&gt;This isn't that.&lt;/p&gt;

&lt;p&gt;We've reviewed dozens of real enterprise evaluation requests — the actual spreadsheets and RFP documents that procurement teams send to vendors. The patterns are clear: engineering teams consistently underweight the criteria that matter most and overweight the ones that matter least.&lt;/p&gt;

&lt;p&gt;The result? Teams pick an IdP based on a demo, discover the migration story is a nightmare six months in, and start evaluating again.&lt;/p&gt;

&lt;p&gt;Here's the evaluation framework we wish someone had given us before we started. It's built for engineering teams at B2B SaaS companies — the ones building products, not the ones buying workforce SSO for their employees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick answer: What makes or breaks an IdP decision
&lt;/h2&gt;

&lt;p&gt;If you're skimming, here's the short version:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Protocol depth matters more than feature count.&lt;/strong&gt; Supporting "OAuth2" means nothing. Which grant types? Can you customize token claims? Can you become an OIDC provider yourself?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migration capability is the #1 underrated criterion.&lt;/strong&gt; If you can't migrate your existing users without forcing password resets, the IdP is unusable — no matter how good everything else looks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-tenancy must be native, not bolted on.&lt;/strong&gt; If organization models and per-tenant configurations require workarounds, you'll be fighting the system forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-readiness isn't future planning — it's a 12-month requirement.&lt;/strong&gt; Token exchange, agent identity, delegated scopes. If the IdP doesn't support these, you'll be back here evaluating again next year.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The rest of this guide walks through each evaluation dimension in detail, with specific questions to ask and red flags to watch for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this guide is for (and who it's not for)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This is for you if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're a CTO, VP of Engineering, or platform architect at a 50-300 person B2B SaaS company&lt;/li&gt;
&lt;li&gt;You have 100K+ existing users and can't afford a disruptive migration&lt;/li&gt;
&lt;li&gt;You're moving upmarket into enterprise customers who need SSO, org models, and audit logs&lt;/li&gt;
&lt;li&gt;You need to write a technical evaluation report and want a framework that doesn't come from a vendor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This is NOT for you if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're looking for workforce IAM (employee SSO to internal tools) — that's a different buying decision&lt;/li&gt;
&lt;li&gt;You're a startup with 500 users and no enterprise customers yet — pick whatever has the best SDK and move on&lt;/li&gt;
&lt;li&gt;You need identity verification (KYC/KYB) — that's a separate category entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension 1: Protocol capabilities — Not just "supports OAuth2"
&lt;/h2&gt;

&lt;p&gt;Every IdP on the market will tell you they support OAuth2 and OIDC. That's table stakes. The real questions are about depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grant types: Which ones and why it matters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Must-have:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authorization Code + PKCE&lt;/strong&gt; — The only flow you should use for browser-based and mobile apps. If a vendor still recommends Implicit flow, walk away. PKCE isn't optional — it's a security requirement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Credentials&lt;/strong&gt; — For service-to-service communication. Your backend services need to authenticate with each other without a user present.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refresh Token&lt;/strong&gt; — Sounds basic, but the implementation details vary wildly. Can you configure rotation? Expiration? Can you revoke a specific refresh token without nuking the entire session?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Increasingly critical:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token Exchange (RFC 8693)&lt;/strong&gt; — This is the grant type that enables AI agent authentication, impersonation flows, and delegation. If it's missing today, ask about the roadmap. If there's no roadmap, that's a red flag.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  OIDC Provider capability
&lt;/h3&gt;

&lt;p&gt;Here's a question most teams don't think to ask: &lt;strong&gt;Can you use this IdP as an OIDC Provider — not just an OIDC consumer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why it matters: As your SaaS grows, partners and customers may want to use your identity system to log into their own tools. You need to issue tokens, manage consent, and handle third-party app registrations. If your IdP only lets you consume external identity providers but can't act as one, you'll hit a wall when you need to federate outward.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the IdP expose an OpenID Discovery endpoint you can white-label?&lt;/li&gt;
&lt;li&gt;Can you register first-party and third-party applications with different trust levels?&lt;/li&gt;
&lt;li&gt;Can first-party apps skip the consent screen while third-party apps require it?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JWT customization
&lt;/h3&gt;

&lt;p&gt;The token is the contract between your IdP and your services. If you can't customize it, every downstream service needs to make additional API calls to figure out what a user is allowed to do.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you add custom claims to access tokens and ID tokens?&lt;/li&gt;
&lt;li&gt;Can you embed organization context (which tenant the user is operating in) directly in the token?&lt;/li&gt;
&lt;li&gt;Can you define custom scopes that map to your application's permission model?&lt;/li&gt;
&lt;li&gt;Are claims computed at token issuance time, or can they be dynamically populated via a webhook or script?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A token that carries &lt;code&gt;{ "org_id": "org_123", "role": "admin", "auth_level": 2 }&lt;/code&gt; means your API middleware can make authorization decisions in one line. A token that only carries &lt;code&gt;{ "sub": "user_456" }&lt;/code&gt; means every service needs to call back to the IdP or a database to figure out the rest. At scale, that difference is the difference between 2ms and 200ms per request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension 2: Authentication flows — The details that kill you
&lt;/h2&gt;

&lt;p&gt;Every IdP supports email/password and social login. Congratulations, you've narrowed the field to... all of them.&lt;/p&gt;

&lt;p&gt;The differentiation is in the details most demo scripts don't cover.&lt;/p&gt;

&lt;h3&gt;
  
  
  The sign-up flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post-registration auto-login&lt;/strong&gt;: After a user signs up, are they automatically logged in? Or do they see a login page again? Forcing a user to log in immediately after registering is a conversion killer. You'd be surprised how many IdPs get this wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom registration fields&lt;/strong&gt;: Can you collect role, company name, or use case during sign-up? Or do you need a separate onboarding flow after the fact?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive profiling&lt;/strong&gt;: Can you collect additional information over multiple sessions, rather than demanding everything upfront?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The login flow
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;login_hint support&lt;/strong&gt;: When a user clicks a link from a marketing email, can you pre-fill their email address? This sounds trivial. It's not. It's the difference between a 40% and 60% conversion rate on email campaigns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization-specific authentication policies&lt;/strong&gt;: Can Org A require SAML SSO while Org B uses email/password? Can you enforce MFA for enterprise tenants only? If per-tenant auth policies require code changes instead of configuration changes, you'll burn engineering cycles every time you onboard an enterprise customer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branding customization&lt;/strong&gt;: Can you customize the login experience per tenant? Not just logo and colors — full CSS control, custom domains, and white-labeled emails. "Hosted UI vs. bring your own UI" should be a choice you make, not a limitation you accept.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What most checklists miss
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silent authentication&lt;/strong&gt;: When a token expires, can the app silently refresh without redirecting the user? What happens if the refresh token is also expired — is there a fallback (like a sliding session via iframe)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account linking&lt;/strong&gt;: A user signs up with Google, then tries to log in with email. Are these two accounts, or one? How does the IdP handle identity merging? Get this wrong and you'll have phantom duplicate accounts forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passwordless options&lt;/strong&gt;: Magic links, passkeys, WebAuthn. Not because everyone needs them today, but because your enterprise customers will ask within 6 months.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension 3: Session and token management — The deep water
&lt;/h2&gt;

&lt;p&gt;This is where evaluations get separated from demos. Session and token management is boring until it breaks — and when it breaks, your entire user base gets logged out simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cookie security
&lt;/h3&gt;

&lt;p&gt;Not glamorous. Absolutely critical.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HttpOnly, Secure, SameSite attributes&lt;/strong&gt;: All three must be set correctly. Any IdP that doesn't set HttpOnly on session cookies is not ready for production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-subdomain support&lt;/strong&gt;: If your app runs on &lt;code&gt;app.yourproduct.com&lt;/code&gt; and your API on &lt;code&gt;api.yourproduct.com&lt;/code&gt;, can sessions span subdomains? How?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party cookie deprecation&lt;/strong&gt;: Chrome is phasing these out. How does the IdP handle cross-origin auth flows without third-party cookies? If the answer is "we're working on it," that's not good enough.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Remember me and persistent sessions
&lt;/h3&gt;

&lt;p&gt;Your users want to stay logged in for weeks, not minutes. But a 180-day persistent session has very different security implications than a 30-minute session.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you configure session duration independently from token lifetime?&lt;/li&gt;
&lt;li&gt;Is there a "remember me" option that extends the session while keeping token lifetimes short?&lt;/li&gt;
&lt;li&gt;Can you force re-authentication for sensitive operations without terminating the session?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Refresh token security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token rotation&lt;/strong&gt;: Does the IdP rotate refresh tokens on each use? (It should.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted storage&lt;/strong&gt;: Are refresh tokens encrypted at rest?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revocation granularity&lt;/strong&gt;: Can you revoke a single device's session without revoking all sessions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable expiration&lt;/strong&gt;: Different apps need different refresh token lifetimes. Can you configure this per-application, or is it a global setting?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension 4: Authorization model — Beyond basic RBAC
&lt;/h2&gt;

&lt;p&gt;Role-Based Access Control is the baseline. If the IdP doesn't support RBAC, it's not worth evaluating. But for B2B SaaS, RBAC alone isn't enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Organization-scoped permissions
&lt;/h3&gt;

&lt;p&gt;Your users belong to organizations. Their permissions within each organization are different from their platform-level permissions.&lt;/p&gt;

&lt;p&gt;A user might be an admin in Org A and a viewer in Org B. The same user, two different role contexts. If the IdP can't model this natively, you'll build a parallel permissions system in your application — and now you have two sources of truth.&lt;/p&gt;

&lt;p&gt;Questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you define roles at the organization level, not just the user level?&lt;/li&gt;
&lt;li&gt;Can a single user have different roles in different organizations?&lt;/li&gt;
&lt;li&gt;Is the current organization context embedded in the token, so your API knows which org the user is operating in?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multi-level authorization (auth_level)
&lt;/h3&gt;

&lt;p&gt;For financial applications, healthcare, or any product where certain operations carry higher risk: not all authenticated sessions are equal.&lt;/p&gt;

&lt;p&gt;Viewing a dashboard? Session cookie is fine. Initiating a wire transfer? You need a fresh MFA verification, even if the user is already logged in.&lt;/p&gt;

&lt;p&gt;This is step-up authentication, and it requires the concept of an &lt;strong&gt;authentication level&lt;/strong&gt; (&lt;code&gt;auth_level&lt;/code&gt;) as a first-class citizen in the token system.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the token carry an &lt;code&gt;auth_level&lt;/code&gt; claim that your backend can check?&lt;/li&gt;
&lt;li&gt;Can you trigger step-up authentication from your application without forcing a full re-login?&lt;/li&gt;
&lt;li&gt;Does the &lt;code&gt;auth_level&lt;/code&gt; have its own expiration, independent of the session?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your IdP doesn't support this natively, you'll end up building it yourself — which is exactly the kind of identity logic you're buying an IdP to avoid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Token-based authorization decisions
&lt;/h3&gt;

&lt;p&gt;The ideal: your API middleware reads the token, sees the user's org, role, and auth level, and makes the authorization decision without hitting any external service.&lt;/p&gt;

&lt;p&gt;The reality with many IdPs: the token tells you who the user is, but you need a separate API call to figure out what they're allowed to do.&lt;/p&gt;

&lt;p&gt;That separate call adds latency, creates a dependency, and introduces a failure mode. At 1,000 requests per second, you don't want your authorization check making network hops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension 5: Migration — The criterion that decides everything
&lt;/h2&gt;

&lt;p&gt;Here's a statistic nobody likes to talk about: most IdP evaluations end not because the new IdP isn't good enough, but because the team can't figure out how to migrate their existing users.&lt;/p&gt;

&lt;p&gt;If you have 100K+ users, migration isn't a "nice to have" — it's the entire project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three migration strategies (and which ones the IdP must support)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Bulk import with existing password hashes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your users have passwords hashed with bcrypt, argon2, or whatever your current system uses. Can the IdP import those hashes directly and verify passwords against them?&lt;/p&gt;

&lt;p&gt;If yes: users log in with their existing password, and nothing changes from their perspective. Best case scenario.&lt;/p&gt;

&lt;p&gt;If no: every user gets a "reset your password" email. You will lose 30-50% of your user base in the migration. This is not hypothetical — we've seen it happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Progressive (lazy) migration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of migrating all users at once, you migrate them one by one as they log in. The first login hits your old system, verifies the password, and creates the user in the new IdP. Every subsequent login goes directly to the new IdP.&lt;/p&gt;

&lt;p&gt;This is the safest approach for large user bases, but it requires the IdP to support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A custom authentication hook that calls your legacy system&lt;/li&gt;
&lt;li&gt;The ability to create users on-the-fly during login&lt;/li&gt;
&lt;li&gt;Tracking which users have been migrated vs. which haven't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Dual-write (running systems in parallel)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During transition, both the old and new identity systems are active. Writes go to both, reads gradually shift to the new system. This provides a rollback path but adds operational complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migration red flags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"We support CSV import"&lt;/strong&gt; — This means bulk import of user profiles, not passwords. You'll still need password resets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"We have a migration guide"&lt;/strong&gt; — Read it carefully. If it says "users will need to set a new password," that's the 30-50% user loss scenario.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No mention of hash compatibility&lt;/strong&gt; — If the vendor hasn't thought about password hash migration, they haven't worked with teams at your scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Questions to ask
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Which password hash algorithms do you support for import? (bcrypt, argon2, scrypt, PBKDF2, custom?)&lt;/li&gt;
&lt;li&gt;Can we run a progressive migration where users are migrated on first login?&lt;/li&gt;
&lt;li&gt;Can we track migration progress — what percentage of users have been migrated?&lt;/li&gt;
&lt;li&gt;What's the rollback strategy if migration doesn't go well?&lt;/li&gt;
&lt;li&gt;Can we maintain session continuity — so users don't get logged out during migration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the vendor can't answer these confidently, they haven't done this before. Move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension 6: Multi-tenancy — Native vs. bolted on
&lt;/h2&gt;

&lt;p&gt;B2B SaaS means multi-tenancy. Your customers are organizations with multiple users, roles, and access policies. The IdP needs to understand this natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  What "native multi-tenancy" means
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organization as a first-class entity&lt;/strong&gt;: Not a custom field on the user profile, but a proper data model with its own ID, configuration, and membership list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-organization authentication policies&lt;/strong&gt;: Org A uses SAML SSO with their corporate IdP. Org B uses email/password with mandatory MFA. Org C uses Google Workspace login. All configured via UI or API, not code changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization invitations and membership management&lt;/strong&gt;: Admins within each org can invite users, assign roles, and remove members. The IdP handles the invitation flow, email verification, and role assignment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization-scoped tokens&lt;/strong&gt;: When a user operates within an organization, the token includes the org context. Your API knows which org's data to return.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "custom metadata" workaround
&lt;/h3&gt;

&lt;p&gt;Some IdPs don't have a native organization model. They suggest using custom user metadata (&lt;code&gt;user.app_metadata.org_id = "123"&lt;/code&gt;) as a workaround.&lt;/p&gt;

&lt;p&gt;This falls apart fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A user belonging to multiple orgs requires array management in metadata&lt;/li&gt;
&lt;li&gt;No built-in invitation or membership flow&lt;/li&gt;
&lt;li&gt;No per-org auth policies&lt;/li&gt;
&lt;li&gt;No org-scoped tokens — you have to infer context from other signals&lt;/li&gt;
&lt;li&gt;Audit logs don't know about organizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the vendor says "you can model organizations using our metadata fields," that's the identity equivalent of storing relational data in a JSON column. It works until it doesn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions to ask
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Is the organization model native or built on top of user metadata?&lt;/li&gt;
&lt;li&gt;Can users belong to multiple organizations simultaneously?&lt;/li&gt;
&lt;li&gt;Can we configure different authentication requirements per organization?&lt;/li&gt;
&lt;li&gt;Are organization-scoped roles and permissions supported natively?&lt;/li&gt;
&lt;li&gt;Can organization admins manage members via a self-service UI?&lt;/li&gt;
&lt;li&gt;Does the token include organization context?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dimension 7: AI-readiness — The criterion nobody's asking yet
&lt;/h2&gt;

&lt;p&gt;Twelve months ago, "AI agent authentication" wasn't on any evaluation checklist. Today, if you're building AI features into your product — copilots, autonomous agents, AI-driven workflows — your IdP needs to handle a new type of identity: the agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why agents break the traditional model
&lt;/h3&gt;

&lt;p&gt;Traditional auth has two actors: the user and the application. OAuth2 was designed around this.&lt;/p&gt;

&lt;p&gt;AI agents introduce a third: a non-human entity that acts on behalf of a user, with constrained permissions, and needs its own audit trail.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An agent isn't a user — it doesn't have a password or a browser session&lt;/li&gt;
&lt;li&gt;An agent isn't a machine-to-machine service — it's acting on behalf of a specific user&lt;/li&gt;
&lt;li&gt;An agent needs scoped, time-limited permissions — not the full access the user has&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What your IdP needs to support
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Token Exchange (RFC 8693):&lt;/strong&gt; The agent presents its own credential plus the user's authorization, and receives a scoped token. The token carries: who (the user), what (the agent), scope (the permission boundary), and when (the expiration).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent as a client type:&lt;/strong&gt; The agent should be modeled as a proper OAuth2 client with its own &lt;code&gt;client_id&lt;/code&gt;, not a hack using API keys or shared user tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delegated scope management:&lt;/strong&gt; The user can grant specific permissions to the agent — read but not write, access to certain resources but not others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit distinction:&lt;/strong&gt; Your logs must differentiate between "user did X" and "agent did X on behalf of user." If you can't distinguish these, you'll fail your next SOC2 audit when the auditor asks "who made this change?"&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP (Model Context Protocol) compatibility
&lt;/h3&gt;

&lt;p&gt;MCP is becoming the standard protocol for AI agents to interact with tools and services. If your IdP supports OAuth-based authentication for MCP servers, agents can authenticate properly through the protocol layer rather than through API keys or shared secrets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Questions to ask
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Do you support OAuth2 Token Exchange?&lt;/li&gt;
&lt;li&gt;Can agents be modeled as distinct client types?&lt;/li&gt;
&lt;li&gt;Can tokens carry delegation information (who authorized the agent, what scope)?&lt;/li&gt;
&lt;li&gt;Do audit logs distinguish agent actions from human actions?&lt;/li&gt;
&lt;li&gt;Is there MCP server integration or OAuth support for agent-to-tool authentication?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the vendor hasn't thought about this, they're building for 2020. You're planning for 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimension 8: Non-functional requirements — The stuff that keeps you up at night
&lt;/h2&gt;

&lt;p&gt;Features sell. Operations decide whether you renew.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication throughput&lt;/strong&gt;: Can the system handle 100+ auth requests per second during peak? What about 1,000+?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token validation latency&lt;/strong&gt;: If your services validate JWTs locally (as they should), this is sub-millisecond. But if the IdP requires introspection calls, what's the P99 latency?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale ceiling&lt;/strong&gt;: What's the maximum Monthly Active Users (MAU) supported? Is there a demonstrated track record at your target scale?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compliance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SOC2 Type II&lt;/strong&gt;: Not Type I. Type II means they've been audited over a period, not just at a point in time. If they only have Type I, ask when Type II is expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit logs&lt;/strong&gt;: Every authentication event, permission change, and admin action logged. Can you export logs to your SIEM? Are logs immutable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data residency&lt;/strong&gt;: Can you specify which region stores user data? For EU customers, this isn't optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uptime SLA&lt;/strong&gt;: 99.9% sounds good until you realize that's 8.7 hours of downtime per year. 99.99% is 52 minutes. For authentication — the front door of your application — the difference matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failover&lt;/strong&gt;: What happens during a provider outage? Is there a fallback mechanism? Multi-region deployment?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident history&lt;/strong&gt;: Check their status page history. Not what they promise — what actually happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data portability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User export&lt;/strong&gt;: Can you export all user data, including metadata, organization memberships, and roles? In what format?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standards compliance&lt;/strong&gt;: Are they using standard protocols (OIDC, SCIM) that make migration to a different provider feasible?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in signals&lt;/strong&gt;: Proprietary APIs, custom protocols, non-standard token formats — these are lock-in indicators. The more proprietary the integration, the harder it is to leave.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The evaluation matrix: A practical scoring framework
&lt;/h2&gt;

&lt;p&gt;After evaluating across all dimensions, you need a way to compare. Here's a priority framework:&lt;/p&gt;

&lt;h3&gt;
  
  
  P1 — Deal-breakers (must pass or disqualify)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Why it's P1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Password hash import or progressive migration&lt;/td&gt;
&lt;td&gt;Can't use it if you can't migrate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization Code + PKCE support&lt;/td&gt;
&lt;td&gt;Security baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native organization model&lt;/td&gt;
&lt;td&gt;B2B SaaS requirement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOC2 Type II or clear path to it&lt;/td&gt;
&lt;td&gt;Enterprise customers will ask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.9%+ uptime SLA&lt;/td&gt;
&lt;td&gt;Auth down = product down&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  P2 — Strongly preferred (significant engineering effort if missing)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Why it's P2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom JWT claims&lt;/td&gt;
&lt;td&gt;Avoids per-request permission lookups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-org authentication policies&lt;/td&gt;
&lt;td&gt;Enterprise customer onboarding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organization-scoped roles and tokens&lt;/td&gt;
&lt;td&gt;Multi-tenant authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refresh token rotation and revocation&lt;/td&gt;
&lt;td&gt;Security best practice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted UI + custom UI option&lt;/td&gt;
&lt;td&gt;Flexibility for different use cases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  P3 — Important (plan for within 12 months)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Why it's P3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token Exchange (RFC 8693)&lt;/td&gt;
&lt;td&gt;AI agent authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OIDC Provider capability&lt;/td&gt;
&lt;td&gt;Partner federation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step-up authentication / auth_level&lt;/td&gt;
&lt;td&gt;Financial or high-risk operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCIM provisioning&lt;/td&gt;
&lt;td&gt;Enterprise customer directory sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passkey / WebAuthn support&lt;/td&gt;
&lt;td&gt;Passwordless direction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  P4 — Nice to have (won't block decision)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Why it's P4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Built-in analytics dashboard&lt;/td&gt;
&lt;td&gt;Can build from audit logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;White-labeled email templates&lt;/td&gt;
&lt;td&gt;Convenience feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual flow builder&lt;/td&gt;
&lt;td&gt;Convenience feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-built social connectors (beyond top 5)&lt;/td&gt;
&lt;td&gt;Long tail providers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How to use this&lt;/strong&gt;: Start with P1. If a vendor fails any P1 criterion, stop evaluating them. Then score P2 and P3 categories. The vendor with the best combined P2+P3 score is your answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common evaluation mistakes
&lt;/h2&gt;

&lt;p&gt;We've seen teams make the same mistakes repeatedly. Here's how to avoid them:&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 1: Evaluating on features, not architecture
&lt;/h3&gt;

&lt;p&gt;A feature comparison table tells you what exists. It doesn't tell you how it's built. An IdP might "support" organizations by storing org IDs in user metadata. That checks the box on a spreadsheet but creates real problems in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: For every feature, ask "how is this implemented?" — not just "do you have this?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 2: Ignoring migration until after selection
&lt;/h3&gt;

&lt;p&gt;Teams pick the "best" IdP, start implementation, and then realize they can't migrate their users without a password reset campaign. Now they're either stuck with a bad migration experience or starting the evaluation over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Make migration capability your first filter, not your last.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 3: Over-indexing on the demo
&lt;/h3&gt;

&lt;p&gt;Every vendor's demo is polished. It shows the happy path with a clean database and zero edge cases. Your production environment has users with merged accounts, weird unicode in profile fields, and sessions that shouldn't exist but do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Ask for a proof-of-concept with your actual data. Import 1,000 real users and run your actual authentication flows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 4: Not involving the right people
&lt;/h3&gt;

&lt;p&gt;If only the platform team evaluates, they'll pick what's technically cleanest. If only product evaluates, they'll pick what's easiest to integrate. If only security evaluates, they'll pick what has the most compliance checkboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Evaluation team should include platform engineering, product, and security. Each owns different P1/P2 criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake 5: Forgetting you'll need to leave someday
&lt;/h3&gt;

&lt;p&gt;Vendor lock-in is real. Proprietary SDKs, custom APIs, non-standard token formats — they all make migration harder later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Prefer IdPs that use standard protocols (OIDC, OAuth2, SCIM). Your future self will thank you.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How long does an IdP evaluation typically take?
&lt;/h3&gt;

&lt;p&gt;For a thorough evaluation including proof-of-concept testing, expect 4-8 weeks. Rushing it leads to the mistakes we outlined above — particularly the migration oversight. Budget 2 weeks for requirements gathering, 2-3 weeks for vendor evaluation and PoC, and 1-2 weeks for stakeholder alignment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should we build our own auth instead?
&lt;/h3&gt;

&lt;p&gt;It depends on your stage. If you have fewer than 10,000 users and no enterprise customers, a lightweight auth library might be fine. But once you need SSO, multi-tenancy, MFA, and compliance documentation, the maintenance cost of homegrown auth exceeds the cost of a dedicated IdP. We've seen engineering teams spend 2-3 full-time engineers maintaining custom auth systems — that's $300-500K/year in opportunity cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the difference between CIAM and workforce IAM?
&lt;/h3&gt;

&lt;p&gt;Customer Identity and Access Management (CIAM) is what your product's end users interact with — sign-up, login, profile management. Workforce IAM is what your employees use to access internal tools (Okta for your company's Slack, Google Workspace, etc.). They're different buying decisions with different evaluation criteria. This guide is about CIAM.&lt;/p&gt;

&lt;h3&gt;
  
  
  How important is open-source vs. proprietary?
&lt;/h3&gt;

&lt;p&gt;Open-source IdPs offer transparency (you can audit the code), portability (self-host if needed), and community contributions. Proprietary IdPs may offer more polished UIs and managed services. The key question isn't "open vs. closed" — it's "can I leave if I need to?" Open-source solutions tend to make leaving easier because the data model and APIs are public.&lt;/p&gt;

&lt;h3&gt;
  
  
  When should AI agent authentication be a P1 instead of P3?
&lt;/h3&gt;

&lt;p&gt;If you're already building AI features that access user data on behalf of users (copilots, automated workflows, AI assistants), move it to P1 now. If AI features are on your 6-12 month roadmap, keep it at P3 but weight it heavily. If AI isn't on your radar, it can stay P4 — but revisit in 6 months.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do we evaluate pricing when vendors use different models?
&lt;/h3&gt;

&lt;p&gt;Most IdPs price by Monthly Active Users (MAU). But "MAU" definitions vary — some count any login, others count unique users, some count M2M tokens separately. Get the vendor to quote your specific scenario: X users, Y organizations, Z M2M connections, with your expected authentication volume. Compare total cost, not unit price.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Choosing an identity provider is an infrastructure decision, not a feature decision. You're committing to a system that will handle every user's first interaction with your product, every permission check in your API, and every audit log entry your compliance team reviews.&lt;/p&gt;

&lt;p&gt;The evaluation framework above covers what actually matters — not the marketing bullet points. Use it to filter candidates quickly (P1 criteria first), evaluate deeply (P2 and P3 criteria with proof-of-concept testing), and make a decision that holds up for years, not months.&lt;/p&gt;

&lt;p&gt;The teams that get this right share one thing in common: they treat identity as infrastructure, not as a feature to ship and forget.&lt;/p&gt;

</description>
      <category>identitymanagement</category>
      <category>enterprise</category>
      <category>auth</category>
    </item>
    <item>
      <title>Remote MCP server in action: a new entry point for SaaS products in the AI era</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Wed, 04 Feb 2026 15:42:40 +0000</pubDate>
      <link>https://dev.to/logto/remote-mcp-server-in-action-a-new-entry-point-for-saas-products-in-the-ai-era-kjc</link>
      <guid>https://dev.to/logto/remote-mcp-server-in-action-a-new-entry-point-for-saas-products-in-the-ai-era-kjc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SaaS products have a long-standing problem: time-to-value is too slow. A lot of users churn before they reach the “aha” moment.&lt;/p&gt;

&lt;p&gt;We’ve iterated on Logto onboarding a bunch of times. It helped, but the bottleneck didn’t go away. You still end up reading docs, skimming tutorials, installing SDKs, wiring configs, writing code, then debugging the last 10% before anything works.&lt;/p&gt;

&lt;p&gt;So we tried a different approach: a remote MCP server as Logto’s IDE-native control plane. Instead of clicking through an admin console, you configure Logto and generate integration code through a conversation, right where you’re building the app.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/cpjf9b6qt6U"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;One prompt can take you from zero to a working integration. The agent doesn’t just generate code, it also creates and configures the Logto application in your tenant. All from inside your IDE. (&lt;a href="https://docs.logto.io/logto-cloud/logto-mcp-server" rel="noopener noreferrer"&gt;Try Logto MCP Server&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In this article, I will share our experience and thinking around building the Logto MCP Server, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP vs. Agent Skills: why we chose MCP
&lt;/li&gt;
&lt;li&gt;Problems we met when shipping an MCP server, and how we solved them
&lt;/li&gt;
&lt;li&gt;How we design MCP tools, and how you should design yours
&lt;/li&gt;
&lt;li&gt;Our expectations for the future of MCP
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;
The OAuth implementation of the Logto MCP Server is based on &lt;a href="https://mcp-auth.dev" rel="noopener noreferrer"&gt;mcp-auth&lt;/a&gt; and Logto. If you are interested in MCP server OAuth, you can refer to this open source project.&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP vs. Agent Skills: why we chose MCP
&lt;/h2&gt;

&lt;p&gt;Before deciding how AI should access Logto, we evaluated two options: MCP servers and Agent Skills.&lt;/p&gt;

&lt;p&gt;MCP servers have two forms: local and remote. &lt;/p&gt;

&lt;p&gt;A local MCP server runs on the user’s machine. It requires service installation, environment setup, credentials, or special login flows. In usage and delivery, it is very similar to skills.&lt;/p&gt;

&lt;p&gt;A remote MCP server is hosted on the server side. Users connect by URL and authorize with OAuth. This model is closer to SaaS service extension.&lt;/p&gt;

&lt;p&gt;From a structure view, an Agent Skill is a combination of "business logic + underlying capabilities". Those capabilities can be tools, CLIs, or API calls. MCP tools can carry this layer in a unified way.&lt;/p&gt;

&lt;p&gt;So the key question is not how capabilities are implemented, but how they are delivered to users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Agent Skills deliver: a full local toolchain (Skill package + local runtime + API keys or platform credentials + CLI tools + install, config, upgrade, and maintenance flow).&lt;br&gt;&lt;br&gt;
In essence, you give the capability to users to run by themselves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remote MCP servers deliver: a remote service entry (URL + OAuth login).&lt;br&gt;&lt;br&gt;
In essence, you provide the capability as a service.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below, we compare them from user experience, ecosystem reach, and delivery and maintenance cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  User experience
&lt;/h3&gt;

&lt;p&gt;Agent Skills usually depend on platform APIs or CLIs. Users must create API keys or install and log in to CLIs first. These steps are not complex, but they raise the entry barrier.&lt;/p&gt;

&lt;p&gt;MCP servers support OAuth. Users log in with their SaaS account. The experience is like “Sign in with Google.”&lt;/p&gt;

&lt;p&gt;For users, using an MCP server is simple: enter a URL, log in, connect. This is the experience we want to deliver.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ecosystem reach
&lt;/h3&gt;

&lt;p&gt;On the &lt;a href="https://modelcontextprotocol.io/clients" rel="noopener noreferrer"&gt;MCP website&lt;/a&gt;, there are already 104 AI apps that support MCP, including tools like VS Code, Cursor, and Windsurf.&lt;/p&gt;

&lt;p&gt;Agent Skills are still platform-specific. Even if many platforms start to support them, when we ship an MCP server, users can use it immediately. When we ship a Skill, only users on that platform can use it.&lt;/p&gt;

&lt;p&gt;MCP is also included by the &lt;a href="https://aaif.io/" rel="noopener noreferrer"&gt;Agentic AI Foundation (AAIF)&lt;/a&gt;. It is a protocol-level standard. The ecosystem will keep growing. For us, this makes MCP worth long-term investment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delivery and maintenance cost
&lt;/h3&gt;

&lt;p&gt;Agent Skills depend on platform APIs or CLIs, which quickly brings problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if the API changes?
&lt;/li&gt;
&lt;li&gt;What if the CLI breaks compatibility?
&lt;/li&gt;
&lt;li&gt;How do you upgrade and redistribute the Skill?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You also need to distribute CLIs, manage scattered credentials, adapt to multiple platforms, and guide users to upgrade. The ROI is very low.&lt;/p&gt;

&lt;p&gt;MCP servers are much simpler. Users connect to a URL. It always points to the latest version. When we update the MCP server, users get it next time they connect. No upgrades needed. If APIs change, we update them inside the MCP server.&lt;/p&gt;

&lt;p&gt;Most SaaS products already have strong infrastructure: solid APIs and mature auth systems. An MCP server fits naturally as the “AI interface” of the API, just like an admin console is another interface on top of the same APIs.&lt;/p&gt;

&lt;p&gt;For Logto, choosing an MCP server fits our architecture and uses our strengths.&lt;/p&gt;

&lt;p&gt;It also centralizes all requests into one entry point. Logs and audits are easier. Permissions are clear: AI can only do what the user authorizes. This model is structurally cleaner for enterprise and compliance scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problems we met when shipping an MCP server, and how we solved them
&lt;/h2&gt;

&lt;p&gt;MCP is not perfect. Most issues are ecosystem maturity problems. They will improve over time. Before that, we use workarounds to meet real needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fragmented MCP feature support
&lt;/h3&gt;

&lt;p&gt;The MCP spec defines many features, but client support varies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: widely supported
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth&lt;/strong&gt;: well supported in VS Code; tools like Cursor need &lt;code&gt;mcp-remote&lt;/code&gt; as a bridge
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other features&lt;/strong&gt; (Resources, Prompts, Instructions): inconsistent support
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Right now, tools are the most reliable common layer (check out the &lt;a href="https://modelcontextprotocol.io/clients" rel="noopener noreferrer"&gt;MCP Community Page&lt;/a&gt; to see what features each client supports).&lt;/p&gt;

&lt;p&gt;So our strategy is simple: &lt;strong&gt;build on tools&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM does not know how to use your tools
&lt;/h3&gt;

&lt;p&gt;This is a business-layer problem.&lt;/p&gt;

&lt;p&gt;With Agent Skills, business logic and context are packaged together. The LLM knows how to use them. MCP only provides tools. After connection, the LLM does not know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The usage scenarios
&lt;/li&gt;
&lt;li&gt;The call order
&lt;/li&gt;
&lt;li&gt;The business constraints
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP has the concept of Instructions, but not all clients support it. Instructions also push all content into context at connection time, which wastes tokens.&lt;/p&gt;

&lt;p&gt;Another idea is to put guidance into tool descriptions. But this causes two problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descriptions become complex. Multi-tool workflows create tangled logic and are hard to maintain.
&lt;/li&gt;
&lt;li&gt;As tool count grows, descriptions consume large parts of the context window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Our workaround: provide a &lt;code&gt;getInstructions&lt;/code&gt; tool&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is simple: if Instructions are not well supported, turn them into tools.&lt;/p&gt;

&lt;p&gt;The LLM can call &lt;code&gt;getInstructions&lt;/code&gt; on demand.&lt;br&gt;&lt;br&gt;
For task A, it calls &lt;code&gt;getTaskAInstructions&lt;/code&gt;. The MCP server returns a prompt that explains how to complete task A and how to combine other tools.&lt;/p&gt;

&lt;p&gt;Complex business logic stays behind the instruction tools. Other tools stay simple. Tool descriptions focus only on their own function.&lt;/p&gt;

&lt;p&gt;This is similar to Agent Skills: prompts are loaded on demand. It is also more efficient than global Instructions because it avoids dumping everything into context.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM may leak your secrets
&lt;/h3&gt;

&lt;p&gt;For many SaaS products, some secrets must never be exposed (for example, client secrets, API keys, or webhook signing keys). If they leak, others can impersonate you or gain direct access to resources.&lt;/p&gt;

&lt;p&gt;The risk with LLMs is that a chat is not a secure channel. Conversations can be logged, copied, forwarded, or end up in debugging logs. You cannot assume “only me and the model can see this.” So handing a long-lived secret to an LLM, or asking it to output a secret for users to copy, is high risk.&lt;/p&gt;

&lt;p&gt;This is common in traditional web app integrations: developers often need a secret, put it into server environment variables or config files, and then finish steps like initializing SDKs.&lt;/p&gt;

&lt;p&gt;To keep onboarding easy without weakening secret safety, we do three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Use temporary secrets during integration&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During the chat-based setup, the MCP server only returns short-lived temporary secrets (for example, valid for 1 hour). They are enough to get the integration working, and they often expire before you go live. Before going live, developers create and replace them with long-lived production secrets outside the chat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Make the security boundary explicit&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We clearly warn users: do not create, paste, or store production secrets in the chat. We also remind developers that even environment variables or config files can leak if an agent / LLM can read them through tools or indirect access. Put production secrets only in environments where no AI-assisted integration is used.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not handle production secrets in chat; guide users to the console&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Long-lived secrets are not generated or distributed through the chat. They are created and managed in the console credentials page. In the chat, we only provide a direct link to the console so users can complete production secret setup there.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we design MCP tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Our path
&lt;/h3&gt;

&lt;p&gt;Logto has a full Management API. Our first idea was simple: expose every API endpoint as an MCP tool.&lt;/p&gt;

&lt;p&gt;This failed quickly.&lt;/p&gt;

&lt;p&gt;First, context explosion. Logto has many APIs. Mapping them one-to-one fills the context window. Each tool description costs tokens.&lt;/p&gt;

&lt;p&gt;Second, loss of meaning. APIs are atomic building blocks for developers. But users of the Logto MCP Server are not building systems. They just want to finish tasks. They do not care how many APIs exist.&lt;/p&gt;

&lt;p&gt;Example: Logto has a &lt;code&gt;sign-in-experience&lt;/code&gt; API for branding, sign-in methods, sign-up methods, and security policies.&lt;br&gt;&lt;br&gt;
At first, we thought about how to expose all parameters to the LLM. How to teach it to combine calls.&lt;/p&gt;

&lt;p&gt;But this is the wrong mindset. Users are not calling APIs. They want to change branding or configure login methods.&lt;/p&gt;

&lt;p&gt;So tools should be &lt;code&gt;updateBranding&lt;/code&gt;, &lt;code&gt;updateSignInMethod&lt;/code&gt;, &lt;code&gt;updateSignUpMethod&lt;/code&gt;. The MCP server handles API composition internally.&lt;/p&gt;

&lt;p&gt;Logto MCP Server should be treated as a product, not an API wrapper. It is "another admin console".&lt;/p&gt;

&lt;h3&gt;
  
  
  How to design MCP tools
&lt;/h3&gt;

&lt;p&gt;The rule becomes clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If users directly use your service (like a console), tools should be business-oriented.
&lt;/li&gt;
&lt;li&gt;If you provide base capabilities for others to build on, tools should stay atomic and simple. Example: a filesystem MCP server with &lt;code&gt;read_file&lt;/code&gt;, &lt;code&gt;write_file&lt;/code&gt;, then coding agents combine them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additional principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep tool logic and descriptions simple to save context.
&lt;/li&gt;
&lt;li&gt;For complex workflows, use &lt;code&gt;getInstructions&lt;/code&gt; tools to load guidance on demand. Keep their descriptions simple too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our expectations for the future of MCP
&lt;/h2&gt;

&lt;p&gt;While building the MCP server, we also thought about what could improve the ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skill-level capability delivery
&lt;/h3&gt;

&lt;p&gt;Sometimes MCP servers need to provide not just tools, but guidance on how to combine them into tasks, like Agent Skills.&lt;/p&gt;

&lt;p&gt;This is common in SaaS. For example, GitHub MCP Server, Logto MCP Server, or analytics platforms. Users want workflows, not atomic calls.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;getInstructions&lt;/code&gt; tool is a workaround. Protocol-level support would be better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session-level MCP enablement
&lt;/h3&gt;

&lt;p&gt;Clients connect to many MCP servers, but not every session needs all of them. Session-level enable/disable could reduce context waste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context isolation for MCP tool calls
&lt;/h3&gt;

&lt;p&gt;Tool calls consume a lot of context. If MCP interactions are handled by sub-agents, the main conversation could receive only condensed results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This is our experience with building a remote MCP server.&lt;/p&gt;

&lt;p&gt;If you are exploring this direction, try the &lt;a href="https://docs.logto.io/logto-cloud/logto-mcp-server" rel="noopener noreferrer"&gt;Logto MCP Server&lt;/a&gt; or join our &lt;a href="https://discord.gg/fUQmaFyAam" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; to exchange real-world implementation experience with the community.&lt;/p&gt;

&lt;p&gt;We will also share architecture design and OAuth flow details in future posts.&lt;/p&gt;

</description>
      <category>mcpserver</category>
      <category>saas</category>
      <category>agents</category>
    </item>
    <item>
      <title>Ship user authentication with one prompt: introducing Logto MCP Server</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Wed, 04 Feb 2026 15:34:50 +0000</pubDate>
      <link>https://dev.to/logto/ship-user-authentication-with-one-prompt-introducing-logto-mcp-server-3aol</link>
      <guid>https://dev.to/logto/ship-user-authentication-with-one-prompt-introducing-logto-mcp-server-3aol</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"Integrate Logto into my project"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One prompt, and you get a working auth setup.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/cpjf9b6qt6U"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Today we’re launching &lt;a href="https://docs.logto.io/logto-cloud/logto-mcp-server" rel="noopener noreferrer"&gt;&lt;strong&gt;Logto MCP Server&lt;/strong&gt;&lt;/a&gt;: a hosted MCP server that lets your AI tool set up Logto for your app. No local installation. No copying API keys.&lt;/p&gt;

&lt;p&gt;The agent can inspect your project, create a Logto application, apply the right settings, and generate integration code you can run. What used to be a multi-step setup becomes a short conversation, inside your IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started in 2 steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/logto-cloud/logto-mcp-server" rel="noopener noreferrer"&gt;Add Logto MCP Server to your AI tool&lt;/a&gt; (Cursor, VS Code, OpenCode, Claude Desktop, and any client that supports MCP authorization)&lt;/li&gt;
&lt;li&gt;Ask it to integrate Logto&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No API keys to copy around. You authenticate once, then you can start working.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Integrate Logto into my project"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent detects your stack, creates the Logto app, and generates working integration code. It supports &lt;a href="https://docs.logto.io/quick-starts" rel="noopener noreferrer"&gt;38+ quick starts&lt;/a&gt;, including React, Next.js, Vue, Nuxt, SvelteKit, Express, Go, Python, iOS, Android, Flutter, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How do I set up social login?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask questions in plain English. The agent searches Logto docs and answers with citations, so you can verify and keep moving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdqktgsgnv6uth1pu4dk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdqktgsgnv6uth1pu4dk.jpg" alt="Ask anything about Logto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hosted MCP server, no local installation required&lt;/li&gt;
&lt;li&gt;Works with your tools: Cursor, VS Code, OpenCode, Claude Desktop, and any client that supports MCP authorization&lt;/li&gt;
&lt;li&gt;Secure by default: OIDC/OAuth 2.1 compliant, plus RBAC, MFA, CAPTCHA, and more&lt;/li&gt;
&lt;li&gt;Standards-based auth for MCP: uses the MCP Authorization spec, powered by &lt;a href="https://mcp-auth.dev" rel="noopener noreferrer"&gt;mcp-auth&lt;/a&gt; (our open source project bringing standard auth to MCP servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;This first release is about the “quick start” path: get a working sign-in flow running quickly.&lt;/p&gt;

&lt;p&gt;Next, we’re expanding what the MCP server can configure and guide you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign-in experience: branding, sign-in methods, social providers&lt;/li&gt;
&lt;li&gt;RBAC: roles, permissions, and recommended patterns&lt;/li&gt;
&lt;li&gt;Multi-tenancy: organizations and B2B SaaS setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to influence the roadmap or you hit rough edges, join our &lt;a href="https://discord.gg/fUQmaFyAam" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;! &lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;👉 &lt;a href="https://docs.logto.io/logto-cloud/logto-mcp-server" rel="noopener noreferrer"&gt;Get started with Logto MCP Server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌟 &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Explore Logto features&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>authentication</category>
    </item>
    <item>
      <title>Online sign-up form builder: From authentication to user profile collection</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Fri, 30 Jan 2026 07:27:09 +0000</pubDate>
      <link>https://dev.to/logto/online-sign-up-form-builder-from-authentication-to-user-profile-collection-3fhp</link>
      <guid>https://dev.to/logto/online-sign-up-form-builder-from-authentication-to-user-profile-collection-3fhp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Picture this: A potential customer discovers your amazing product, gets excited about what it can do for them, clicks that bright "Get Started" button... and then abandons your site within seconds. Sound familiar? You're not alone. The sign-up form is the digital equivalent of a first date—mess it up, and there's rarely a second chance.&lt;/p&gt;

&lt;p&gt;In today's hyper-competitive digital landscape, your registration form isn't just a data collection tool—it's your conversion battleground. The difference between a thoughtfully crafted authentication experience and a generic, friction-heavy form can mean the difference between explosive growth and stagnant user acquisition.&lt;/p&gt;

&lt;p&gt;Enter Logto's revolutionary no-code sign-up form builder. This isn't just another auth solution; it's your secret weapon for turning curious visitors into engaged users while collecting the user profile data that powers truly personalized experiences.&lt;/p&gt;

&lt;p&gt;Ready to see the transformation in action? Watch how Logto revolutionizes user registration from a technical headache into a competitive advantage:&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/vSr5Ylxlhnk"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  What every sign-up form needs
&lt;/h2&gt;

&lt;p&gt;Every high-converting sign-up form needs two fundamental elements that work in perfect harmony:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication that actually works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your authentication system is like a bouncer at an exclusive club—it needs to be secure but not intimidating. Smart businesses offer multiple entry points: traditional username/password combinations for the security-conscious, email or phone verification for the practical, social sign-ins for the convenience-seekers, and enterprise SSO for the corporate crowd. The magic happens when users can choose their preferred method without friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strategic user profile collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beyond the basic "who are you?" questions, savvy products collect user profile data that serves real business purposes. Think personal details that enable customization, contact preferences that reduce spam complaints, and business-specific information that powers segmentation. For B2C products, this might mean preference data that improves recommendations. For B2B applications, it's company size, industry, and role information that enables targeted onboarding.&lt;/p&gt;

&lt;p&gt;The golden rule? Collect only what you need immediately, then gather the rest progressively as users engage with your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why every commercial product needs a strategic sign-up form
&lt;/h2&gt;

&lt;p&gt;Here's a sobering reality check: According to FormStack's 2023 research, 67% of users will permanently abandon a form if they encounter any friction during the signup process. Even more shocking? Google's data reveals that 92% of users will leave a website if the sign-up process takes longer than 3 minutes.&lt;/p&gt;

&lt;p&gt;But here's where it gets interesting—companies with optimized sign-up forms see conversion rates that are 25% higher than industry averages, and those leveraging social sign-in options experience up to 42% better completion rates.&lt;/p&gt;

&lt;p&gt;Your registration form isn't just a gateway; it's your first sales conversation, your brand's handshake, and often the make-or-break moment that determines whether a curious visitor becomes a loyal customer. In SaaS businesses, improving signup conversion by just 10% can translate to millions in additional annual recurring revenue.&lt;/p&gt;

&lt;p&gt;The challenge? User registration is merely the tip of the identity management iceberg. Modern products need authentication systems that scale from startup MVP to enterprise-grade platform without breaking a sweat. This is precisely where identity-as-a-service platforms like Logto transform the game—turning what used to be months of complex development into a few hours of smart configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Custom branding - make it yours
&lt;/h2&gt;

&lt;p&gt;First impressions happen in milliseconds, and your registration form needs to feel like a natural extension of your brand. Logto's branding engine transforms generic auth screens into branded experiences that users trust.&lt;/p&gt;

&lt;p&gt;Upload your logo, define brand colors, enable dark mode support, and add favicon customization for that professional polish. Multi-language support and legal compliance links are built-in. Navigate to &lt;a href="https://cloud.logto.io/to/sign-in-experience/branding" rel="noopener noreferrer"&gt;Console &amp;gt; Sign-in Experience &amp;gt; Branding&lt;/a&gt; and configure everything in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Sign-up and sign-in configuration
&lt;/h2&gt;

&lt;p&gt;Configure your &lt;strong&gt;authentication&lt;/strong&gt; methods to maximize both security and user conversion:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flexible registration options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email/Phone/Username registration&lt;/strong&gt;: Support multiple identifier types with email/SMS verification and password setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social sign-in integration&lt;/strong&gt;: Reduce registration friction with pre-built connectors for major social platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise SSO&lt;/strong&gt;: Enable corporate authentication for B2B applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Additional flow configuration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sign-in methods&lt;/strong&gt;: Define which authentication methods users can use for returning visits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password recovery&lt;/strong&gt;: Configure forgot password flows with multiple recovery options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account linking&lt;/strong&gt;: Allow users to connect multiple authentication methods to single accounts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpl4mvqnv6pwpr46am2j6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpl4mvqnv6pwpr46am2j6.png" alt="sign-up-method.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These configurations ensure your registration form supports diverse user preferences while maintaining security standards appropriate for your application's risk profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Collect additional user profile data (advanced capabilities)
&lt;/h2&gt;

&lt;p&gt;This is where Logto's sign-up form builder becomes your conversion optimization secret weapon. The "Collect user profile" feature transforms basic registration into intelligent data gathering that fuels personalization engines without killing completion rates.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;a href="https://cloud.logto.io/to/sign-in-experience/collect-user-profile" rel="noopener noreferrer"&gt;Console &amp;gt; Sign-in Experience &amp;gt; Collect User Profile&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Logto offers both primitive and composite field types designed for real-world use cases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; fields handle everything from names to job titles with smart length validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number&lt;/strong&gt; fields capture ages, company sizes, and experience levels with range controls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date&lt;/strong&gt; fields support multiple international formats because not everyone writes dates the same way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropdown&lt;/strong&gt; selects make choosing industries, departments, or countries effortless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkboxes&lt;/strong&gt; handle preferences and agreements without overwhelming users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt; fields automatically validate social profiles and websites.&lt;/li&gt;
&lt;li&gt;Need custom validation? &lt;strong&gt;Regex&lt;/strong&gt; fields let you enforce specific formats for employee IDs, or any proprietary data structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The composite fields are where things get exciting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full name&lt;/strong&gt; fields intelligently combine first, middle, and last names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Address&lt;/strong&gt; fields collect complete location data with configurable components for different regional requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2izyj74bf1bukfy7dj00.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2izyj74bf1bukfy7dj00.png" alt="collect-user-profile.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every field becomes a conversion optimization opportunity through strategic customization.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Labels&lt;/strong&gt;, &lt;strong&gt;descriptions&lt;/strong&gt;, and &lt;strong&gt;placeholders&lt;/strong&gt; provide clear guidance without cluttering the interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-specific configurations&lt;/strong&gt; ensure each field behaves optimally for its data type. E.g, min/max lengths for text, range limits for numbers, format enforcement for URLs, data format for dates, default value for checkboxes, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required&lt;/strong&gt; versus &lt;strong&gt;optional&lt;/strong&gt; field configuration lets you balance data collection ambitions with completion rate realities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjie91rjqy4t9q1ejosmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjie91rjqy4t9q1ejosmq.png" alt="customize-profile-fields.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back to &lt;strong&gt;Collect user profile&lt;/strong&gt; list page, the drag-and-drop interface makes field reordering effortless, while real-time validation ensures optimal user experience before you go live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Test with out-of-the-box sign-up flows
&lt;/h2&gt;

&lt;p&gt;Navigate to &lt;a href="https://cloud.logto.io/to/sign-in-experience" rel="noopener noreferrer"&gt;Console &amp;gt; Sign-in Experience&lt;/a&gt;, click "Live Preview". The Live Preview feature lets you experience your complete signup process exactly as your users will. Test every authentication method, validate field behavior, confirm brand consistency, and check mobile responsiveness.&lt;/p&gt;

&lt;p&gt;Create test accounts to validate the complete user journey, then manage them through &lt;a href="https://cloud.logto.io/to/users" rel="noopener noreferrer"&gt;Console &amp;gt; User Management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads.strapi.logto.io%2Fsign_up_form_1ca80de50f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuploads.strapi.logto.io%2Fsign_up_form_1ca80de50f.png" alt="sign-up-form.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Publish and integrate
&lt;/h2&gt;

&lt;p&gt;Logto meets you where you are, offering integration paths that fit your team's workflow and technical preferences.&lt;/p&gt;

&lt;p&gt;Logto's comprehensive &lt;a href="https://docs.logto.io/quick-starts" rel="noopener noreferrer"&gt;SDK library&lt;/a&gt; transforms integration from weeks to hours. Frontend SDKs for React, Vue, Angular, and Vanilla JavaScript come with pre-built UI components. Backend SDKs cover Node.js, Python, .NET, Java, and Go for seamless server-side authentication. Mobile SDKs handle React Native, iOS, and Android development. Framework-specific integrations optimize for Next.js, Express, and Spring Boot environments.&lt;/p&gt;

&lt;p&gt;Or try a no-code integration solution powered by Cloudflare via &lt;a href="https://docs.logto.io/integrate-logto/protected-app" rel="noopener noreferrer"&gt;Protected App&lt;/a&gt; when you’re using Logto Cloud.&lt;/p&gt;

&lt;p&gt;Visit &lt;a href="https://cloud.logto.io/to/applications" rel="noopener noreferrer"&gt;Console &amp;gt; Applications&lt;/a&gt; for comprehensive guides, code samples, and quickstart templates tailored to your technology stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles of high-converting sign-up forms
&lt;/h2&gt;

&lt;p&gt;Building registration forms that actually convert requires balancing ambition with user psychology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social authentication improves completion rates by 20-40% by eliminating password friction&lt;/li&gt;
&lt;li&gt;Every additional form field can reduce conversion by 10-15%, so collect only essential information upfront&lt;/li&gt;
&lt;li&gt;Smart MFA waits until the second login session rather than creating registration barriers&lt;/li&gt;
&lt;li&gt;Use progress indicators for multi-step flows and real-time validation that prevents errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logto's no-code sign-up form builder incorporates these principles automatically, ensuring your registration flows optimize for both conversion and user satisfaction while maintaining enterprise-grade security.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building effective &lt;strong&gt;sign-up forms&lt;/strong&gt; no longer requires months of development or choosing between user experience and security. Logto's no-code solution empowers teams to create sophisticated &lt;strong&gt;registration forms&lt;/strong&gt; that convert visitors into users while collecting the &lt;strong&gt;user profile&lt;/strong&gt; data that powers personalized experiences.&lt;/p&gt;

&lt;p&gt;Logto transforms user registration from a technical challenge into a competitive advantage that moves your business metrics.&lt;/p&gt;

&lt;p&gt;Ready to transform your user registration?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.logto.io" rel="noopener noreferrer"&gt;&lt;strong&gt;Logto Cloud&lt;/strong&gt;&lt;/a&gt; puts production-ready authentication at your fingertips:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free Development tenant&lt;/strong&gt; lets you explore every feature without limits. &lt;strong&gt;Free Tier&lt;/strong&gt; includes up to 50,000 MAUs—perfect for validating your product-market fit. &lt;strong&gt;Pro Plan&lt;/strong&gt; starts at just $24/month for growing businesses that need advanced features and higher usage limits. &lt;strong&gt;Enterprise Solutions&lt;/strong&gt; provide custom deployments with dedicated support for scale.&lt;/p&gt;

&lt;p&gt;Prefer to keep everything in-house? &lt;a href="https://github.com/logto-io/logto" rel="noopener noreferrer"&gt;&lt;strong&gt;Logto OSS&lt;/strong&gt;&lt;/a&gt; delivers the complete open-source identity platform with full feature parity for independent deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Start building your perfect sign-up form today →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop losing users to friction. Start converting them with Logto's intelligent sign-up form builder. Your conversion metrics and your users will thank you.&lt;/p&gt;

</description>
      <category>signup</category>
      <category>collectuserprofile</category>
      <category>userdata</category>
    </item>
    <item>
      <title>Logto 2025: scaling and trust</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Wed, 21 Jan 2026 03:51:30 +0000</pubDate>
      <link>https://dev.to/logto/logto-2025-scaling-and-trust-35ej</link>
      <guid>https://dev.to/logto/logto-2025-scaling-and-trust-35ej</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2025 was the year Logto got a lot bigger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logto Cloud grew ~10x in MRR year over year&lt;/li&gt;
&lt;li&gt;Identities in Logto Cloud grew from under 1M to 2M+&lt;/li&gt;
&lt;li&gt;Logto OSS gained 2,000+ GitHub stars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also served more enterprise customers, kept SOC 2 Type II current, improved GDPR-related work, and shipped a lot across authentication and authorization.&lt;/p&gt;

&lt;p&gt;More of our growth came from larger customers with stricter requirements around data residency and isolation, so we leaned heavily on Private Cloud there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private Cloud: why enterprises picked it
&lt;/h2&gt;

&lt;p&gt;For enterprise teams, features are table stakes. The real decision is about the “boring” requirements: isolation, data residency, performance, security review, and reliability.&lt;/p&gt;

&lt;p&gt;Logto Private Cloud exists for that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data residency options that match compliance requirements&lt;/li&gt;
&lt;li&gt;infrastructure-as-code and flexible cloud setup, making rollouts smooth and scalable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: for one European organization, we deployed two Private Cloud instances in about a week. Each is sized for 1,000+ RPS with headroom.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we shipped
&lt;/h2&gt;

&lt;p&gt;We aim to keep changes practical and aligned with OIDC and OAuth. A few highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more &lt;a href="https://docs.logto.io/integrations" rel="noopener noreferrer"&gt;connectors&lt;/a&gt; to reduce integration time across common IdPs and ecosystems&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/integrate-logto/saml-app" rel="noopener noreferrer"&gt;Logto as a SAML IdP&lt;/a&gt; for better compatibility with enterprise and legacy systems&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/security" rel="noopener noreferrer"&gt;CAPTCHA and security policies&lt;/a&gt; to reduce abuse and automated attacks&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/end-user-flows/one-time-token" rel="noopener noreferrer"&gt;magic links&lt;/a&gt; for additional passwordless sign-in options and user invitation flows&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/secret-vault" rel="noopener noreferrer"&gt;secret vault&lt;/a&gt; for federated token storage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.logto.io/end-user-flows/collect-user-profile" rel="noopener noreferrer"&gt;user profile collection&lt;/a&gt; for onboarding and progressive profile completion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/logto-io/logto" rel="noopener noreferrer"&gt;Logto OSS&lt;/a&gt; gained 2,000+ stars in 2025, plus amazing community work like custom password hashing support and new connectors.&lt;/p&gt;

&lt;p&gt;Open source is how most people find Logto, test it, and decide whether to trust it. We’re not changing that.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP and agent auth
&lt;/h2&gt;

&lt;p&gt;We started &lt;a href="https://mcp-auth.dev/" rel="noopener noreferrer"&gt;MCP Auth&lt;/a&gt; work to support AI and agentic workflows. As more software becomes agent-driven, identity and authorization need to keep up. More on this in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability: what changed for us
&lt;/h2&gt;

&lt;p&gt;In 2025, we saw fewer incidents caused by regressions. Most issues came from upstream dependencies or cloud infrastructure.&lt;/p&gt;

&lt;p&gt;That’s not an excuse to say it wasn’t on us. The biggest gap wasn’t the fix, it was speed and clarity of updates. We’re tightening that up.&lt;/p&gt;

&lt;h2&gt;
  
  
  2026 priorities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;reliability, incident communication, and operational maturity&lt;/li&gt;
&lt;li&gt;making Logto the default choice for modern multi-tenant SaaS where security and UX both matter&lt;/li&gt;
&lt;li&gt;pushing forward on MCP and agentic auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building a SaaS or AI product and need modern auth that scales, Logto is built for it.&lt;/p&gt;



</description>
      <category>logto</category>
      <category>recap</category>
    </item>
    <item>
      <title>Logto product updates</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Wed, 21 Jan 2026 03:42:08 +0000</pubDate>
      <link>https://dev.to/logto/logto-product-updates-2fp</link>
      <guid>https://dev.to/logto/logto-product-updates-2fp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We're excited to announce Logto v1.35.0, our December 2025 release! This update brings enhanced reCAPTCHA customization options, expanded support for third-party applications, and improved security features for passwordless authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  reCAPTCHA Gets More Flexible
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use reCAPTCHA Anywhere with Domain Customization
&lt;/h3&gt;

&lt;p&gt;One of the most requested features has been the ability to use reCAPTCHA in regions where Google's default domain may be inaccessible. With v1.35.0, you can now customize the reCAPTCHA domain to use alternatives like &lt;code&gt;recaptcha.net&lt;/code&gt;, ensuring your bot protection works seamlessly for users worldwide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose Your Verification Style with Checkbox Mode
&lt;/h3&gt;

&lt;p&gt;reCAPTCHA Enterprise users now have a choice between two verification modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invisible mode&lt;/strong&gt;: The default score-based verification that runs silently in the background, providing a frictionless user experience while still protecting against bots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Checkbox mode&lt;/strong&gt;: The classic "I'm not a robot" widget that many users are familiar with. This mode provides explicit user interaction and can be useful when you want users to consciously acknowledge the verification step.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simply ensure your verification mode matches your reCAPTCHA key type configured in Google Cloud Console, and you're ready to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third-party Apps: Now for SPA and Native Too
&lt;/h2&gt;

&lt;p&gt;Previously, only traditional web applications could be designated as third-party apps in Logto. This release removes that limitation, allowing you to create third-party single-page applications (SPA) and native applications.&lt;/p&gt;

&lt;p&gt;This enhancement opens up more flexible OAuth/OIDC integration scenarios, whether you're building a partner ecosystem, enabling third-party integrations, or managing multiple client applications with different trust levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhanced Security for Passwordless Authentication
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Client IP Tracking
&lt;/h3&gt;

&lt;p&gt;For organizations that need additional security controls around passwordless authentication, we've added client IP address tracking to the connector message payload. The &lt;code&gt;SendMessageData&lt;/code&gt; type now includes an optional &lt;code&gt;ip&lt;/code&gt; field that HTTP email and SMS connectors can utilize for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt;: Prevent abuse by limiting requests from specific IP addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fraud detection&lt;/strong&gt;: Identify suspicious patterns based on IP geolocation or reputation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit logging&lt;/strong&gt;: Maintain comprehensive logs for security compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Smarter Email/SMS Template Handling
&lt;/h2&gt;

&lt;p&gt;We've improved the template fallback logic for email and SMS connectors. If a usage-specific template isn't found, the system now gracefully falls back to the generic template. This includes checking the generic template with the default locale when locale-specific templates are unavailable, ensuring your users always receive properly formatted messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SAML Integration Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extended relay state support&lt;/strong&gt;: The relay state column now supports up to 512 characters (previously 256), fixing integration issues with service providers like Firebase that generate longer relay state values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better error messages&lt;/strong&gt;: SAML authentication flow APIs now provide more straightforward error messages, making troubleshooting easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API Parameter Fix
&lt;/h3&gt;

&lt;p&gt;Fixed a parameter naming issue in the SAML app creation API that could cause filter and paywall calculation errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Ready to upgrade? Check out our &lt;a href="https://docs.logto.io/logto-oss/upgrading-oss-version" rel="noopener noreferrer"&gt;upgrade guide&lt;/a&gt; for step-by-step instructions.&lt;/p&gt;

&lt;p&gt;For the complete list of changes, see the &lt;a href="https://github.com/logto-io/logto/releases/tag/v1.35.0" rel="noopener noreferrer"&gt;GitHub release page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have questions or feedback? Join us on &lt;a href="https://discord.gg/vRvwuwgpVX" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; or open an issue on &lt;a href="https://github.com/logto-io/logto/issues" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>release</category>
    </item>
    <item>
      <title>How to implement guest mode (anonymous users) and convert to Logto users</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Wed, 21 Jan 2026 03:31:17 +0000</pubDate>
      <link>https://dev.to/logto/how-to-implement-guest-mode-anonymous-users-and-convert-to-logto-users-44pj</link>
      <guid>https://dev.to/logto/how-to-implement-guest-mode-anonymous-users-and-convert-to-logto-users-44pj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many apps let users try features before signing up. Think shopping carts, document drafts, or saved preferences. Users expect this "guest mode" to just work.&lt;/p&gt;

&lt;p&gt;But if you're using Logto (or any OIDC provider) for authentication, you might wonder: how do I handle these anonymous users?&lt;/p&gt;

&lt;p&gt;The short answer: &lt;strong&gt;Logto handles authentication, your app handles guest sessions&lt;/strong&gt;. They're separate concerns.&lt;/p&gt;

&lt;p&gt;In this article, I'll show you a simple three-phase pattern to implement guest mode with Logto. You'll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage guest sessions in your backend&lt;/li&gt;
&lt;li&gt;Let guests sign up through Logto&lt;/li&gt;
&lt;li&gt;Merge guest data to the real user account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why there's no "anonymous login" in Logto
&lt;/h2&gt;

&lt;p&gt;You might expect Logto to have an "anonymous login" feature. Something like: call an API, get a token, no user interaction needed.&lt;/p&gt;

&lt;p&gt;But that's not how OIDC works. Here's why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OIDC is built around user consent.&lt;/strong&gt; The whole point is to verify "who is this person?" An anonymous token would mean "this is someone, but we don't know who" — which defeats the purpose.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; = proving identity ("who are you?")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session tracking&lt;/strong&gt; = remembering actions ("what did you do?")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guest mode is about session tracking, not authentication. So it doesn't belong to your auth system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is actually good news.&lt;/strong&gt; It means you have a clean separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logto handles identity (sign-up, sign-in, tokens)&lt;/li&gt;
&lt;li&gt;Your app handles guest sessions (before identity exists)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let each system do what it's designed for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-phase solution
&lt;/h2&gt;

&lt;p&gt;Here's the pattern: &lt;strong&gt;Guest → Auth → Merge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4jy91cvpl1ebumi1o0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4jy91cvpl1ebumi1o0x.png" alt="mermaid-0" width="800" height="799"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Handle guest sessions without authentication
&lt;/h3&gt;

&lt;p&gt;Your backend creates and manages guest sessions. Logto isn't involved yet.&lt;/p&gt;

&lt;p&gt;When a user takes a meaningful action (like adding to cart), your backend:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generates a guest ID (e.g., UUID)&lt;/li&gt;
&lt;li&gt;Returns it as a cookie or JWT&lt;/li&gt;
&lt;li&gt;Stores user actions under this guest ID&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep it simple. A &lt;code&gt;guest_sessions&lt;/code&gt; table with &lt;code&gt;guest_id&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, and &lt;code&gt;created_at&lt;/code&gt; is enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Let users sign in with Logto
&lt;/h3&gt;

&lt;p&gt;When the user clicks "Sign up" or "Sign in", trigger the standard Logto OIDC flow.&lt;/p&gt;

&lt;p&gt;The guest ID stays in the cookie/storage during this process. After successful authentication, your frontend now has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An access token from Logto (user identity)&lt;/li&gt;
&lt;li&gt;The guest ID from before (guest data)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Securely merge guest data to authenticated users
&lt;/h3&gt;

&lt;p&gt;Now connect the dots. Call your backend API with both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/merge-guest
Authorization: Bearer &amp;lt;access_token&amp;gt;
Body: { "guestId": "guest_abc123" }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your backend must validate &lt;strong&gt;both&lt;/strong&gt; tokens before merging:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Validate the access token&lt;/strong&gt; → extracts user ID. See &lt;a href="https://docs.logto.io/authorization/validate-access-tokens" rel="noopener noreferrer"&gt;Validate access tokens&lt;/a&gt; for how to do this with Logto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate the guest ID&lt;/strong&gt; → confirm it's a real guest session &lt;strong&gt;your backend issued&lt;/strong&gt;. This is critical — never trust a guest ID from the client without verification.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only after both validations pass:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Merge guest data&lt;/strong&gt; to the user account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invalidate the guest session&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The merge logic depends on your business. Shopping cart? Combine items. Document drafts? Transfer ownership. You decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to secure your merge endpoint with token validation
&lt;/h2&gt;

&lt;p&gt;The merge endpoint is a sensitive operation. A few things to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always validate the access token.&lt;/strong&gt; Don't just read the user ID from the request body. Decode and verify the JWT. &lt;a href="https://docs.logto.io/authorization/validate-access-tokens" rel="noopener noreferrer"&gt;Here's how to do it with Logto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always validate the guest ID.&lt;/strong&gt; Check it exists in your database and hasn't expired. If you issued it as a JWT, verify the signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Require authentication.&lt;/strong&gt; The merge endpoint should reject requests without a valid access token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set a TTL for guest sessions.&lt;/strong&gt; Clean up abandoned sessions after 30 days (or whatever makes sense for your app).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Guest mode with Logto follows a simple pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Guest&lt;/strong&gt; (your app) → manage sessions before users sign up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth&lt;/strong&gt; (Logto) → handle sign-up and sign-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; (your app) → connect guest data to real users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pattern works with any OIDC provider, not just Logto. The key insight is: authentication and session tracking are separate concerns. Let each system do what it's built for.&lt;/p&gt;

</description>
      <category>guestmode</category>
      <category>anonymoususers</category>
      <category>userconversion</category>
    </item>
    <item>
      <title>Secure Google API access with OAuth authorization and token storage</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Tue, 19 Aug 2025 01:31:38 +0000</pubDate>
      <link>https://dev.to/logto/secure-google-api-access-with-oauth-authorization-and-token-storage-3k8g</link>
      <guid>https://dev.to/logto/secure-google-api-access-with-oauth-authorization-and-token-storage-3k8g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In today's interconnected digital landscape, applications that can effortlessly integrate with third-party services provide exceptional user experiences. Whether you're building a productivity suite, an AI agent, or a document collaboration platform, the ability to securely access and utilize APIs from services like Google, GitHub, Facebook, or any other services can transform your application from good to indispensable.&lt;/p&gt;

&lt;p&gt;Today, we'll explore how Logto's Secret Vault and Social Connector capabilities enable you to build a smart productivity application that integrates with Google APIs. We'll demonstrate secure token storage, retrieving access tokens for AI access, incremental authorization, and seamless third-party service integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The challenge: Building a smart calendar assistant
&lt;/h2&gt;

&lt;p&gt;Imagine you're developing a "Smart Calendar Assistant", an application that helps users manage their schedules intelligently. Here's what your app needs to accomplish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic authentication&lt;/strong&gt;: Users sign in with their Google account to access the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile management&lt;/strong&gt;: Display user's basic profile information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar integration&lt;/strong&gt;: Read calendar events to provide schedule insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced features&lt;/strong&gt;: Create calendar events, send meeting invitations via Gmail, and manage Google Drive documents, but only when users explicitly request these premium features.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The challenge? You need different levels of Google API access at different times, and you must store tokens securely for ongoing API operations without constantly prompting users for re-authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution: Logto's incremental authorization with Secret Vault
&lt;/h2&gt;

&lt;p&gt;Logto's approach solves this elegantly through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal initial scopes&lt;/strong&gt;: Request only essential permissions during sign-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental authorization&lt;/strong&gt;: Request additional scopes on-demand for premium features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure token storage&lt;/strong&gt;: Store and manage access/refresh tokens in the encrypted Secret Vault.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic token refresh&lt;/strong&gt;: Handle token expiration transparently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's walk through the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting up Google connector with basic scopes
&lt;/h2&gt;

&lt;p&gt;First, create and configure your Google connector in Logto Console. During the initial setup, configure minimal scopes for basic authentication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/calendar.readonly
openid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View &lt;a href="https://console.cloud.google.com/apis/library" rel="noopener noreferrer"&gt;Google API Library&lt;/a&gt; and &lt;a href="https://developers.google.com/identity/protocols/oauth2/scopes#firebasedataconnect" rel="noopener noreferrer"&gt;OAuth 2.0 scopes documentation&lt;/a&gt; to find the scopes you need for your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Configuration Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Google OAuth client in &lt;a href="https://console.cloud.google.com/apis/credentials" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt;. Check all scopes required for your application.&lt;/li&gt;
&lt;li&gt;Configure the &lt;a href="https://cloud.logto.io/to/connectors/social" rel="noopener noreferrer"&gt;Logto Google connector&lt;/a&gt; with your client credentials. Add the minimal scopes listed above in the &lt;code&gt;Scopes&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Store tokens for persistent API access&lt;/strong&gt; in the connector settings.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Prompts&lt;/strong&gt; to include &lt;code&gt;consent&lt;/code&gt; and enable &lt;strong&gt;Offline Access&lt;/strong&gt; to ensure refresh tokens are issued.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read details in the Logto documentation on &lt;a href="https://docs.logto.io/integrations/google" rel="noopener noreferrer"&gt;Google connector setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This setup allows users to sign in and grants your app permission to read their calendar events. This is perfect for providing basic schedule insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Implementing sign-in flow
&lt;/h2&gt;

&lt;p&gt;Navigate to &lt;a href="https://cloud.logto.io/to/sign-in-experience/sign-up-and-sign-in" rel="noopener noreferrer"&gt;Logto &amp;gt; Sign-in experience &amp;gt; Sign-up and sign-in&lt;/a&gt;. Add the Google connector under Social sign-in section to let users authenticate with Google.&lt;/p&gt;

&lt;p&gt;When users sign in with Google, Logto automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authenticates the user with the configured scopes.&lt;/li&gt;
&lt;li&gt;Stores the access and refresh tokens securely in the Secret Vault.&lt;/li&gt;
&lt;li&gt;Returns user profile information to your application.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Your app receives the user session after successful Google sign-in&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSession&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;logtoClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getIdTokenClaims&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Welcome &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tokens are now securely stored and tied to the user's Google identity, ready for API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Accessing Google APIs with stored tokens
&lt;/h2&gt;

&lt;p&gt;To read the user's calendar events, retrieve the stored access token and call the Google Calendar API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Retrieve the stored Google access token&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tokenResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/my-account/identities/google/access-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userAccessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Logto access token&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tokenResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Call Google Calendar API&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calendarResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.googleapis.com/calendar/v3/calendars/primary/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;calendarResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logto handles token refresh automatically. If the access token is expired but a refresh token exists, Logto will obtain a new access token transparently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Incremental authorization for premium features
&lt;/h2&gt;

&lt;p&gt;When users want to access premium features (like creating calendar events or accessing Gmail), use Logto's Social Verification API to request additional scopes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Request additional scopes for premium features&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verificationResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/verification/social&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userAccessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;connectorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google-connector-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;redirectUri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yourapp.com/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/gmail.send&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;verificationRecordId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authorizationUri&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;verificationResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Redirect user to Google for additional authorization&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authorizationUri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the user grants additional permissions, complete the verification and update the stored tokens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Handle the callback and verify the authorization&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/verification/social/verify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userAccessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;verificationRecordId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;connectorData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="cm"&gt;/* authorization code from callback */&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Update the stored token set with new scopes&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/my-account/identities/google/access-token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PATCH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userAccessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;socialVerificationId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;verificationRecordId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your app can create calendar events and send emails with the updated token that includes the new scopes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Managing token status
&lt;/h2&gt;

&lt;p&gt;Logto Console provides comprehensive token management capabilities. Navigate to &lt;a href="https://cloud.logto.io/to/users" rel="noopener noreferrer"&gt;User Management &amp;gt; select a user &amp;gt; Social Connections&lt;/a&gt; to view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token Status&lt;/strong&gt;: Active, Expired, Inactive, or Not Applicable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Metadata&lt;/strong&gt;: Creation time, last update, expiration, and granted scopes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Management&lt;/strong&gt;: View profile information synced from Google&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This visibility helps administrators understand user connection states and troubleshoot any token-related issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Google: Comprehensive third-party integration
&lt;/h2&gt;

&lt;p&gt;You can extend your Smart Calendar Assistant to integrate with various services beyond Google. Popular social connectors include &lt;a href="https://docs.logto.io/integrations/google" rel="noopener noreferrer"&gt;Google&lt;/a&gt; for authentication, calendar, and Gmail integration, &lt;a href="https://docs.logto.io/integrations/github" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for code repositories and issue management, and &lt;a href="https://docs.logto.io/integrations/facebook" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt; for social features and marketing insights. Additional prebuilt connectors are coming soon to support token storage capabilities.&lt;/p&gt;

&lt;p&gt;For custom integrations, Logto provides flexible options through standard &lt;a href="https://docs.logto.io/integrations/oidc" rel="noopener noreferrer"&gt;OIDC&lt;/a&gt; or &lt;a href="https://docs.logto.io/integrations/oauth" rel="noopener noreferrer"&gt;OAuth 2.0&lt;/a&gt; connection. This comprehensive ecosystem allows you to connect with virtually any third-party service your organization uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and best practices
&lt;/h2&gt;

&lt;p&gt;Logto's Secret Vault employs enterprise-grade security:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-secret encryption&lt;/strong&gt;: Each token set uses unique Data Encryption Keys (DEK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key wrapping&lt;/strong&gt;: DEKs are encrypted with Key Encryption Keys (KEK)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal exposure&lt;/strong&gt;: Tokens are decrypted only when needed for API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic cleanup&lt;/strong&gt;: Tokens are deleted when users disconnect accounts or connectors are removed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Logto is a developer-friendly authentication platform that enables secure applications with comprehensive third-party service integration.&lt;/p&gt;

&lt;p&gt;With Logto's incremental authorization and secure token storage, your Smart Calendar Assistant delivers seamless user experience balancing functionality with security. Users enjoy frictionless onboarding through single sign-on requesting only minimal permissions for core features. As they explore advanced capabilities, progressive enhancement unlocks premium features through natural, contextual permission requests.&lt;/p&gt;

&lt;p&gt;Persistent access via securely stored tokens enables ongoing API operations without constantly interrupting users for re-authentication, creating smooth professional experience. This system is built with security by design, leveraging enterprise-grade encryption to protect user credentials and maintain trust.&lt;/p&gt;

&lt;p&gt;Ready to build your own third-party API integration? Here's how to start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set up Logto&lt;/strong&gt;: Create your Logto tenant and &lt;a href="https://cloud.logto.io/to/connectors/social" rel="noopener noreferrer"&gt;configure your first social connector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable token storage&lt;/strong&gt;: Turn on "Store tokens for persistent API access" in your connector settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement incremental Auth&lt;/strong&gt;: Use the Social Verification API for on-demand scope requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build and scale&lt;/strong&gt;: Expand to additional providers using Logto's comprehensive connector ecosystem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The future of application development lies in seamless service integration. With Logto's Secret Vault and Connectors, you have the tools to build applications that are not just functional, but truly interconnected with the services your users rely on daily.&lt;/p&gt;

&lt;p&gt;Want to explore more? Check out our &lt;a href="https://docs.logto.io/secret-vault/federated-token-set" rel="noopener noreferrer"&gt;integration guides&lt;/a&gt; and start building your next connected application today.&lt;/p&gt;



</description>
      <category>secretvault</category>
      <category>tokenstorage</category>
      <category>thirdpartyservices</category>
    </item>
    <item>
      <title>Using Bolt.New and Logto to quickly build your custom login flows</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Mon, 18 Aug 2025 12:33:48 +0000</pubDate>
      <link>https://dev.to/logto/using-boltnew-and-logto-to-quickly-build-your-custom-login-flows-3ld6</link>
      <guid>https://dev.to/logto/using-boltnew-and-logto-to-quickly-build-your-custom-login-flows-3ld6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Bolt.New
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bolt.new&lt;/strong&gt; is a browser-based tool for generating and running full-stack web applications instantly. Built on top of &lt;strong&gt;StackBlitz’s WebContainer technology&lt;/strong&gt;, it gives developers a clean, pre-configured stack that includes Next.js (App Router), Tailwind CSS, Supabase, Prisma, and ShadCN UI. The entire environment runs locally in the browser, no installations, no cloud build steps, and no signup required.&lt;/p&gt;

&lt;p&gt;Unlike tools that focus on AI-assisted coding inside an existing project, Bolt.new focuses on &lt;strong&gt;the beginning of the development process&lt;/strong&gt;. It removes the overhead of setting up project structure, dependencies, and local servers, letting you go from idea to working prototype in seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is Bolt.new different from Cursor or Lovable?
&lt;/h2&gt;

&lt;p&gt;While tools like &lt;strong&gt;Cursor&lt;/strong&gt; and &lt;strong&gt;Lovable&lt;/strong&gt; serve as AI copilots inside your code editor, &lt;strong&gt;Bolt.new&lt;/strong&gt; focuses on something else entirely: &lt;strong&gt;instant, full-stack project generation and execution&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; enhances VS Code workflows with AI, helping you edit or generate code in your existing environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt.new&lt;/strong&gt; creates a working app from scratch based on a prompt or template, and runs it instantly inside the browser using WebContainers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no dependency on local tools or remote cloud VMs. Everything runs in-browser with native support for Node.js, package management, and full-stack development. This makes it particularly well-suited for fast prototyping and local-first experimentation, especially in AI or SaaS project contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is Bolt.new for?
&lt;/h2&gt;

&lt;p&gt;Bolt.new is designed for developers who often start from scratch such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indie hackers validating product ideas&lt;/li&gt;
&lt;li&gt;AI builders testing workflows or embedding models&lt;/li&gt;
&lt;li&gt;Founders prototyping MVPs&lt;/li&gt;
&lt;li&gt;Engineers creating internal tools or demos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These users are typically comfortable with the modern web stack and prefer tools that are fast, clean, and non-opinionated. Bolt.new is not a visual site builder or tutorial-driven platform. It assumes a working knowledge of React and full-stack development but removes setup friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The history and evolution of Bolt.new
&lt;/h2&gt;

&lt;p&gt;Bolt.new was created by the team behind &lt;strong&gt;StackBlitz&lt;/strong&gt;, a company founded in 2017 by Eric Simons and Albert Pai. StackBlitz pioneered &lt;strong&gt;WebContainers&lt;/strong&gt;, a browser-native WebAssembly runtime capable of executing Node.js environments directly inside the browser. This eliminated the need for cloud servers or local installations when developing modern JavaScript applications.&lt;/p&gt;

&lt;p&gt;In 2023, StackBlitz faced a turning point. Growth had slowed, and the team explored a more radical direction: combining WebContainers with AI to generate fully functional applications from natural language prompts.&lt;/p&gt;

&lt;p&gt;This experiment became &lt;strong&gt;Bolt.new&lt;/strong&gt;, which launched publicly in October 2024. Within weeks, it gained significant traction among developers for its simplicity and speed. The tool combined everything StackBlitz had built over years, runtime isolation, fast dependency installation, and shareable environments, with an AI interface that understood common development goals.&lt;/p&gt;

&lt;p&gt;Bolt.new marked a shift in developer tooling: instead of just writing code faster, developers could now &lt;strong&gt;start with code that was already running&lt;/strong&gt;, tailored to their intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guide: Use Logto and Bolt.New to add a custom log-in experience
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Register an app in Logto console
&lt;/h3&gt;

&lt;p&gt;In this example, I used &lt;a href="http://bolt.new/" rel="noopener noreferrer"&gt;Bolt.new&lt;/a&gt; to create a CMS app. I skipped the prompt phase and went straight to the point: I asked the agent to build a CMS with Logto as the authentication provider.&lt;/p&gt;

&lt;p&gt;According to the instructions, I needed to provide two key pieces of information:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Logto endpoint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;App ID&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the app is a single-page React application, no app secret is needed. The agent handled the rest: it installed the latest &lt;a href="https://docs.logto.io/quick-starts/react" rel="noopener noreferrer"&gt;Logto React SDK&lt;/a&gt;, set up authentication components, and wired everything together.&lt;/p&gt;

&lt;p&gt;To complete the setup, I went to the &lt;a href="https://cloud.logto.io/" rel="noopener noreferrer"&gt;Logto Cloud Console&lt;/a&gt;, created a new single-page application, and copied the Logto endpoint and App ID into Bolt.new.&lt;/p&gt;

&lt;p&gt;Then configure the &lt;a href="https://auth.wiki/redirect-uri" rel="noopener noreferrer"&gt;Redirect URIs&lt;/a&gt; and Post sign-out redirect URIs.&lt;/p&gt;

&lt;p&gt;One important detail: because Bolt.new is browser-based and not a local IDE, you can’t use &lt;code&gt;http://localhost:3000/&lt;/code&gt;as your redirect URI. Instead, make sure to use the preview URL shown in the Bolt.new browser tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuw5ugaq0vpp5c365dr2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuw5ugaq0vpp5c365dr2b.png" alt="bolt_auth_1.png" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Customize Logto pre-built sign in experience
&lt;/h3&gt;

&lt;p&gt;Logto provides a configurable, pre-built sign-in flow that you can customize in the Console. To get started, go to &lt;strong&gt;Sign-in Experience&lt;/strong&gt; &amp;gt; &lt;strong&gt;Sign-in &amp;amp; Sign-up&lt;/strong&gt;, then choose your preferred sign-in methods (such as email, username, phone number, or social login).&lt;/p&gt;

&lt;p&gt;Once configured, triggering the sign-in flow will redirect users to Logto’s hosted sign-in page with your selected options. The entire authentication process is handled by Logto, and users are returned to your app after signing in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12nhosz8bs93n4qh1u4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12nhosz8bs93n4qh1u4n.png" alt="bolt_auth_2.png" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22vq33ippmu33nqqubq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22vq33ippmu33nqqubq3.png" alt="bolt_auth_3.png" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
This assumes you’ve already set up the Google and GitHub connectors correctly. If not, you can follow the setup guide &lt;a href="https://docs.logto.io/connectors" rel="noopener noreferrer"&gt;https://docs.logto.io/connectors&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k8d2lrcca8v6rnnx3uw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k8d2lrcca8v6rnnx3uw.png" alt="bolt_auth_4.png" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a floating login panel above your product
&lt;/h3&gt;

&lt;p&gt;Now I want to go a step further and build a more customized sign-in experience, similar to what Perplexity offers. Instead of redirecting to a separate page, I’ll place a &lt;strong&gt;floating login panel directly on top of the product UI&lt;/strong&gt;. This keeps users in context while still using Logto’s authentication flow underneath.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5so0na4jkripwznl9kh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5so0na4jkripwznl9kh0.png" alt="bolt_auth_5.png" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I just use this prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to make the sign-in page look better, just a floating panel on the bottom right corner. With two buttons: one for “Sign In” and one for “Create Account.” Each button should redirect to a different screen, handled by Logto. Using first-screen experience documented in Logto &lt;a href="https://docs.logto.io/end-user-flows/authentication-parameters/first-screen" rel="noopener noreferrer"&gt;https://docs.logto.io/end-user-flows/authentication-parameters/first-screen&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7isgn80y53t0s02rr3ui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7isgn80y53t0s02rr3ui.png" alt="bolt_auth_6.png" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The nice part is, when you click Sign In, it goes straight to the sign-in page. If you click Create Account, it opens directly to the account creation screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevpo9jcr1vn8ph1ere1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevpo9jcr1vn8ph1ere1k.png" alt="bolt_auth_7.png" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ewb3nt7mcj9raqadka0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ewb3nt7mcj9raqadka0.png" alt="bolt_auth_8.png" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add social flows
&lt;/h3&gt;

&lt;p&gt;You can provide the agent with &lt;a href="https://docs.logto.io/end-user-flows/authentication-parameters/direct-sign-in" rel="noopener noreferrer"&gt;Logto’s direct sign-in documentation&lt;/a&gt; along with a prompt like “add social sign-in flows.” This allows you to skip the default Logto landing screen. For example, clicking the &lt;strong&gt;Google Sign-In&lt;/strong&gt; button will immediately launch the Google authentication flow, giving users a faster and more friendly login experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5ckbydo2mv5kg81pgte.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5ckbydo2mv5kg81pgte.png" alt="bolt_auth_9.png" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Logto’s upcoming update will support AI-powered auth integration
&lt;/h2&gt;

&lt;p&gt;This is just a basic example. Logto is currently building &lt;strong&gt;MCP servers&lt;/strong&gt; that run directly inside your IDE, allowing you to interact with the &lt;strong&gt;Logto Console&lt;/strong&gt; and &lt;strong&gt;Management API&lt;/strong&gt; without ever leaving your development environment.&lt;/p&gt;

&lt;p&gt;With this setup, you’ll be able to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create and manage users&lt;/li&gt;
&lt;li&gt;View and filter logs&lt;/li&gt;
&lt;li&gt;Configure login and sign-up flows&lt;/li&gt;
&lt;li&gt;Define API resources, permissions, and roles&lt;/li&gt;
&lt;li&gt;Manage applications and access settings&lt;/li&gt;
&lt;li&gt;And more&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By combining local tooling with AI and Logto’s infrastructure, authentication is no longer a painful integration step, it becomes part of your natural development flow.&lt;/p&gt;



</description>
      <category>bolt</category>
      <category>ai</category>
      <category>directsignin</category>
    </item>
    <item>
      <title>Why AI startups choose Supabase and where it falls short</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Mon, 18 Aug 2025 08:00:20 +0000</pubDate>
      <link>https://dev.to/logto/why-ai-startups-choose-supabase-and-where-it-falls-short-2690</link>
      <guid>https://dev.to/logto/why-ai-startups-choose-supabase-and-where-it-falls-short-2690</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Supabase?
&lt;/h2&gt;

&lt;p&gt;Supabase is an open-source Backend-as-a-Service (BaaS) platform that has become increasingly popular among AI startups and developers building intelligent applications. Often described as the "open-source alternative to Firebase," Supabase combines a PostgreSQL database, real-time subscriptions, authentication, instant APIs, and storage into a unified platform that prioritizes developer experience and rapid deployment.&lt;/p&gt;

&lt;p&gt;Built on top of enterprise-grade tools like PostgreSQL, PostgREST, GoTrue, and Realtime, Supabase offers developers the power of SQL databases with the simplicity of modern web development. The platform automatically generates RESTful APIs from your database schema and provides real-time functionality out of the box, making it particularly attractive for AI companies that need to iterate quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI startups are choosing Supabase
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rapid development speed - The primary driver
&lt;/h3&gt;

&lt;p&gt;Just like Supabase’s slogan, Build in a weekendScale to millions. The main attraction of Supabase for AI companies lies in its ability to accelerate development cycles. In the fast-paced AI industry where time-to-market is crucial, startups cannot afford to be slowed down by complex backend setup. Supabase allows AI developers to focus on their core product developenebt and user experience rather than spending weeks configuring databases, authentication systems, and APIs.&lt;/p&gt;

&lt;p&gt;One of my friends pointed out that as an entrepreneur, testing and quick pivoting are inevitable — so development speed really matters. Supabase’s quick setup, all-in-one services, and affordable pricing make it a great fit for fast-moving developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost-effective solution for startups
&lt;/h3&gt;

&lt;p&gt;Compared to self-hosted AWS solutions or enterprise-grade alternatives, Supabase offers compelling pricing that aligns with startup budgets. The generous free tier allows AI companies to prototype and validate their ideas without upfront infrastructure costs, while the transparent pricing structure makes it easy to predict scaling costs as the product grows.&lt;/p&gt;

&lt;p&gt;For many AI startups bootstrapping their operations, the cost savings compared to traditional cloud services can be substantial, allowing them to allocate more resources to AI model development and talent acquisition.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL foundation for AI workloads
&lt;/h3&gt;

&lt;p&gt;Supabase's PostgreSQL foundation provides several advantages for AI applications. PostgreSQL's support for JSON data types, advanced indexing, and extensions like pgvector make it suitable for storing embeddings, model outputs, and complex AI-generated data structures. This eliminates the need for multiple specialized databases in many AI use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-Era development patterns
&lt;/h3&gt;

&lt;p&gt;An interesting phenomenon in the AI development space is that AI models themselves have been trained on vast amounts of code that uses Supabase, making AI coding assistants particularly effective at generating Supabase-related code. This creates a virtuous cycle where AI developers can leverage AI tools to build on Supabase more efficiently, further accelerating development speed. That’s what it means to build a product the ecosystem wants to adopt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Supabase stands in the Backend-as-a-Service ecosystem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Supabase vs Traditional cloud services
&lt;/h3&gt;

&lt;p&gt;Compared to AWS and other traditional cloud providers, Supabase offers significant advantages in developer experience and setup simplicity. While AWS provides more granular control and enterprise features, the complexity can be overwhelming for small AI teams that need to move fast. Supabase abstracts away much of this complexity while still providing the core functionality most AI applications need.&lt;/p&gt;

&lt;p&gt;However, this simplicity comes with trade-offs. Large-scale AI companies often find they need more specialized services as they grow, leading some to eventually migrate to more traditional cloud architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Competition from lightweight alternatives
&lt;/h3&gt;

&lt;p&gt;Supabase competes with other developer-friendly platforms like Fly.io, Railway, and various serverless solutions. Each has its strengths, but Supabase's combination of database, authentication, and real-time features in a single platform gives it an edge for full-stack AI applications.&lt;/p&gt;

&lt;p&gt;For vector search specifically, some AI companies choose specialized services like Pinecone or Weaviate instead of relying on Supabase's pgvector extension, especially for applications requiring high-performance similarity search at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Market positioning: SMB vs Enterprise
&lt;/h3&gt;

&lt;p&gt;Supabase has found its sweet spot in the small to medium business market, particularly among startups and indie developers. The platform excels at serving companies that need to build and deploy quickly without the overhead of enterprise infrastructure.&lt;/p&gt;

&lt;p&gt;However, as AI companies grow and their requirements become more complex, many find themselves needing more specialized solutions for permissions management, multi-tenancy, or compliance requirements that enterprise-focused alternatives handle better out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Supabase pricing structure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Free Tier - Perfect for AI prototyping
&lt;/h3&gt;

&lt;p&gt;Great for prototypes, testing, and small projects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited API requests&lt;/li&gt;
&lt;li&gt;Up to 50,000 monthly active users (MAUs)&lt;/li&gt;
&lt;li&gt;500 MB database size&lt;/li&gt;
&lt;li&gt;Shared CPU and 500 MB RAM&lt;/li&gt;
&lt;li&gt;5 GB bandwidth&lt;/li&gt;
&lt;li&gt;1 GB file storage&lt;/li&gt;
&lt;li&gt;Community support&lt;/li&gt;
&lt;li&gt;Projects are paused after 1 week of inactivity&lt;/li&gt;
&lt;li&gt;Limit of 2 active projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This lets AI teams build and test their MVPs without worrying about infrastructure costs, important for validating product-market fit. Many AI coding agents support Supabase integration. For example, you can design both the front-end and back-end in Lovable, and use Supabase as your database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro Plan (From $25 / month)
&lt;/h3&gt;

&lt;p&gt;Most popular — for production-ready apps with room to scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Includes $10 in compute credits&lt;/li&gt;
&lt;li&gt;Everything in the Free Plan, plus:

&lt;ul&gt;
&lt;li&gt;100,000 MAUs included, then $0.00325 per extra MAU&lt;/li&gt;
&lt;li&gt;8 GB database (then $0.125 per GB)&lt;/li&gt;
&lt;li&gt;250 GB bandwidth (then $0.09 per GB)&lt;/li&gt;
&lt;li&gt;100 GB file storage (then $0.021 per GB)&lt;/li&gt;
&lt;li&gt;Email support&lt;/li&gt;
&lt;li&gt;Daily backups (stored for 7 days)&lt;/li&gt;
&lt;li&gt;Log retention (7 days)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team Plan (From $599 / month)
&lt;/h3&gt;

&lt;p&gt;For teams needing &lt;a href="https://auth.wiki/enterprise-sso" rel="noopener noreferrer"&gt;SSO&lt;/a&gt;, backup controls, and compliance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything in the Pro Plan, plus:

&lt;ul&gt;
&lt;li&gt;SOC2 compliance&lt;/li&gt;
&lt;li&gt;Project-scoped and read-only access&lt;/li&gt;
&lt;li&gt;HIPAA support (as a paid add-on)&lt;/li&gt;
&lt;li&gt;SSO for Supabase Dashboard&lt;/li&gt;
&lt;li&gt;Priority email support and SLAs&lt;/li&gt;
&lt;li&gt;Daily backups (stored for 14 days)&lt;/li&gt;
&lt;li&gt;Log retention (28 days)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enterprise (Custom pricing)
&lt;/h3&gt;

&lt;p&gt;For large-scale, high-demand applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated support manager&lt;/li&gt;
&lt;li&gt;Uptime SLAs&lt;/li&gt;
&lt;li&gt;Bring Your Own Cloud (BYO Cloud)&lt;/li&gt;
&lt;li&gt;24×7×365 premium enterprise support&lt;/li&gt;
&lt;li&gt;Private Slack channel&lt;/li&gt;
&lt;li&gt;Support for custom security questionnaires&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supabase authentication capabilities for AI products
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core authentication methods
&lt;/h3&gt;

&lt;p&gt;Supabase provides authentication suitable for AI applications handling user data and personalized experiences:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email and password authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure user registration and login&lt;/li&gt;
&lt;li&gt;Email &lt;a href="https://auth.wiki/passwordless" rel="noopener noreferrer"&gt;passwordless authentication&lt;/a&gt; workflows important for AI applications&lt;/li&gt;
&lt;li&gt;Password reset functionality&lt;/li&gt;
&lt;li&gt;Customizable email templates for branded experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Social &lt;a href="https://auth.wiki/oauth-2.0" rel="noopener noreferrer"&gt;OAuth&lt;/a&gt; providers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google, GitHub, Discord, Facebook integration&lt;/li&gt;
&lt;li&gt;Apple, Twitter, LinkedIn, and more&lt;/li&gt;
&lt;li&gt;One-click social login implementation&lt;/li&gt;
&lt;li&gt;Automatic user profile synchronization for personalized AI experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://auth.wiki/magic-link" rel="noopener noreferrer"&gt;Magic Link&lt;/a&gt; authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passwordless login via email&lt;/li&gt;
&lt;li&gt;Enhanced user experience for AI tools&lt;/li&gt;
&lt;li&gt;Reduced security risks&lt;/li&gt;
&lt;li&gt;Perfect for AI applications requiring quick access&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced security features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt;&lt;br&gt;
Critical for AI applications, Supabase's RLS policies ensure users only access their own data, conversations, and AI-generated content. These policies operate at the database level, providing robust isolation between users' AI interactions and personal data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWT token management&lt;/strong&gt;&lt;br&gt;
Automatic &lt;a href="https://auth.wiki/jwt" rel="noopener noreferrer"&gt;JWT&lt;/a&gt; token generation and validation with customizable expiration times. AI applications can securely authenticate API calls to external AI services while maintaining user context throughout complex AI workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://auth.wiki/mfa" rel="noopener noreferrer"&gt;Multi-factor authentication (MFA)&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Built-in support for &lt;a href="https://auth.wiki/totp" rel="noopener noreferrer"&gt;TOTP&lt;/a&gt;-based MFA adds security for AI applications handling sensitive data or providing access to premium AI models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supabase's limitations and considerations
&lt;/h2&gt;

&lt;p&gt;While Supabase is a powerful and developer-friendly backend platform, offering database, storage, authentication, and serverless functions out of the box but it has notable limitations when it comes to &lt;strong&gt;enterprise-grade identity and &lt;a href="https://auth.wiki/authorization" rel="noopener noreferrer"&gt;authorization&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  No OIDC provider support
&lt;/h3&gt;

&lt;p&gt;Supabase &lt;strong&gt;does not support acting as an &lt;a href="https://auth.wiki/openid-connect" rel="noopener noreferrer"&gt;OpenID Connect (OIDC) Provider&lt;/a&gt;&lt;/strong&gt;. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You cannot use Supabase to &lt;strong&gt;federate identity to other systems&lt;/strong&gt;, i.e. it cannot serve as a central identity provider for other applications.&lt;/li&gt;
&lt;li&gt;Supabase &lt;strong&gt;cannot issue standards-compliant ID tokens&lt;/strong&gt; for third-party clients to consume.&lt;/li&gt;
&lt;li&gt;It lacks support for &lt;strong&gt;custom claims&lt;/strong&gt;, &lt;strong&gt;token introspection&lt;/strong&gt;, &lt;strong&gt;scoped access&lt;/strong&gt;, or fine-grained session/token management, all of which are essential for &lt;a href="https://auth.wiki/oauth-2.1" rel="noopener noreferrer"&gt;OAuth 2.1&lt;/a&gt; / OIDC-compliant systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of Logto customers complains:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;And yes, I know there's &lt;strong&gt;Supabase&lt;/strong&gt;, but as far as I can tell, that will require custom OIDC middleware in order to act as my &lt;a href="https://auth.wiki/identity-provider" rel="noopener noreferrer"&gt;IdP&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In contrast, platforms like &lt;strong&gt;&lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, Auth0, or Keycloak&lt;/strong&gt; can act as a fully compliant OIDC Provider, supporting complex login workflows, SSO federation, and secure token issuance, critical for multi-system identity architectures.&lt;/p&gt;

&lt;p&gt;Especially in the AI era, if you want your product to work with AI agents or act as an &lt;a href="https://blog.logto.io/what-is-mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; server, it needs to support OAuth or OIDC. Without this, your product can’t participate in the OAuth-based ecosystem that AI agents rely on, which means missing out on major integration opportunities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Weak authorization model (RBAC/ABAC)
&lt;/h3&gt;

&lt;p&gt;Supabase also lacks a built-in authorization framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no native &lt;a href="https://auth.wiki/rbac" rel="noopener noreferrer"&gt;RBAC (role-based access control)&lt;/a&gt; system for assigning roles to users or defining permissions.&lt;/li&gt;
&lt;li&gt;You must manually implement authorization logic using PostgreSQL Row-Level Security (RLS): a powerful but low-level feature that’s difficult to manage as your product scales.&lt;/li&gt;
&lt;li&gt;There is no &lt;a href="https://auth.wiki/multi-tenancy" rel="noopener noreferrer"&gt;organization&lt;/a&gt;/team hierarchy, no user-role mapping UI, and no ability to apply conditional access policies based on roles, tenant ownership, or permissions.&lt;/li&gt;
&lt;li&gt;There’s no concept of access scopes or policies bound to tokens, making it hard to integrate with secure APIs or microservices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes Supabase less suitable for &lt;strong&gt;multi-tenant SaaS products&lt;/strong&gt;, &lt;strong&gt;B2B platforms&lt;/strong&gt;, or anything requiring enterprise-grade access control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workarounds and common practices
&lt;/h3&gt;

&lt;p&gt;Because of these limitations, many teams use Supabase &lt;strong&gt;together with a dedicated identity provider&lt;/strong&gt; such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://logto.io/" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;&lt;/strong&gt; – An open-source auth solution with full OIDC Provider support, RBAC, organization management, and &lt;a href="https://auth.wiki/multi-tenancy" rel="noopener noreferrer"&gt;multi-tenant auth&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth0 / Okta&lt;/strong&gt; – Commercial identity platforms with extensive protocol and security support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clerk / Descope&lt;/strong&gt; – Developer-first auth tools with more visual control over identity flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These systems handle user authentication, SSO, and authorization logic, while Supabase continues to provide data storage, edge functions, and real-time APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary: Where Supabase falls short
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Capability&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Supabase Status&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Limitation&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OIDC Provider&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;Cannot expose user pool to third-party apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Customization&lt;/td&gt;
&lt;td&gt;❌ Minimal&lt;/td&gt;
&lt;td&gt;No custom claims, scopes, or introspection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RBAC&lt;/td&gt;
&lt;td&gt;❌ Manual via RLS&lt;/td&gt;
&lt;td&gt;No native roles/permissions system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Org/Tenant Hierarchy&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;No built-in support for orgs, teams, or role mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual Policy Management&lt;/td&gt;
&lt;td&gt;❌ Missing&lt;/td&gt;
&lt;td&gt;Must manage all logic via SQL/RLS manually&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In short, Supabase excels at providing a developer-first backend experience, but when it comes to &lt;strong&gt;secure identity, SSO, and advanced authorization&lt;/strong&gt;, it lacks the primitives and abstractions that modern applications demand. If your product involves &lt;strong&gt;multi-tenant auth&lt;/strong&gt;, &lt;strong&gt;enterprise SSO&lt;/strong&gt;, or &lt;strong&gt;fine-grained access control&lt;/strong&gt;, pairing Supabase with a purpose, built identity solution is not just recommended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migration path for growing companies
&lt;/h3&gt;

&lt;p&gt;Many AI companies view Supabase as an excellent starting point but plan eventual migration to more specialized services as they scale. This "graduate and migrate" pattern is common, where startups begin with Supabase for speed, then move to enterprise solutions for advanced features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future outlook and recommendations regarding Supabase
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ideal use cases for AI startups
&lt;/h3&gt;

&lt;p&gt;Supabase is particularly well-suited for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI MVP development&lt;/strong&gt;: Rapid prototyping and validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small to medium-scale AI applications&lt;/strong&gt;: Up to thousands of users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer tools and AI-assisted applications&lt;/strong&gt;: Where development speed is crucial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer AI applications&lt;/strong&gt;: Simple user management and data storage needs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to consider alternatives
&lt;/h3&gt;

&lt;p&gt;AI companies should evaluate alternatives when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex multi-tenancy requirements&lt;/strong&gt;: Enterprise B2B products with sophisticated permission models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-scale vector operations&lt;/strong&gt;: Applications requiring specialized vector database performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict compliance requirements&lt;/strong&gt;: Industries with specific regulatory needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex integration needs&lt;/strong&gt;: Applications requiring deep integration with enterprise systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strategic recommendations
&lt;/h3&gt;

&lt;p&gt;For AI startups considering Supabase:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with Supabase&lt;/strong&gt; for rapid development and validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan for potential migration&lt;/strong&gt; as you scale and requirements become more complex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate permission requirements early&lt;/strong&gt; to understand if custom development will be needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider hybrid approaches&lt;/strong&gt; using Supabase for core functionality while integrating specialized services for specific needs&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Build AI-Ready applications with Supabase’s backend stack and Logto’s auth system
&lt;/h2&gt;

&lt;p&gt;Supabase has become a go-to for a lot of AI startups, mostly because it helps you move fast when speed matters. It’s probably not where you’ll scale forever, but it’s a solid launchpad that gets the job done—especially when you want to focus on your core AI work, not backend plumbing.&lt;/p&gt;

&lt;p&gt;The dev experience is smooth, pricing is reasonable, and the feature set covers most of what you need early on. Just make sure you know where it might hit limits, and have a plan for how you’ll evolve as your needs change.&lt;/p&gt;

&lt;p&gt;If your goal is to get from idea to working product as quickly and cost-effectively as possible, Supabase is honestly one of the best ways to do it.&lt;/p&gt;

&lt;p&gt;That said, when it comes to auth, especially if you’re building for AI agents or planning to support OAuth/OIDC flows, you’ll want something more purpose-built. That’s where &lt;strong&gt;Logto&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;It’s open-source, developer-friendly, and designed from the ground up to support modern identity use cases, including AI agent auth and MCP-style infrastructure. If you’re already on Supabase, plugging in Logto gives you a full-featured identity layer without having to build it all yourself.&lt;/p&gt;

&lt;p&gt;We’ve put together a simple &lt;a href="https://docs.logto.io/docs/guides/integrate-with-supabase/" rel="noopener noreferrer"&gt;Logto + Supabase integration guide&lt;/a&gt; that walks you through the setup, so you can get sign-up, login, and session management running in minutes.&lt;/p&gt;



</description>
      <category>supabase</category>
      <category>ai</category>
      <category>auth</category>
    </item>
    <item>
      <title>Top coding agents in 2025: Tools that actually help you build</title>
      <dc:creator>Xiao Yijun</dc:creator>
      <pubDate>Mon, 18 Aug 2025 08:00:04 +0000</pubDate>
      <link>https://dev.to/logto/top-coding-agents-in-2025-tools-that-actually-help-you-build-3cgd</link>
      <guid>https://dev.to/logto/top-coding-agents-in-2025-tools-that-actually-help-you-build-3cgd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is created by &lt;a href="https://logto.io" rel="noopener noreferrer"&gt;Logto&lt;/a&gt;, an open-source solution that helps developers implement secure auth in minutes instead of months. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The software development world is flooded with "AI agents" in 2025. Most promise to write your code, finish your tasks, and ship your app while you sleep. The reality? Some are noise. A few are signal.&lt;/p&gt;

&lt;p&gt;But a handful of tools actually deliver real leverage. They fit into your workflow, take things off your plate, and help you build faster, especially when you're short on time or context switching too much. These aren't just copilots or chatbots. They're hands-on agents that help you move from vague ideas to working software.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a good coding agent
&lt;/h2&gt;

&lt;p&gt;Good coding agents don't just autocomplete. They understand context, work across files, and integrate into how you actually build software. The best ones feel like pairing with someone who knows your stack, not fighting with a glorified autocomplete tool.&lt;/p&gt;

&lt;p&gt;The tools that work fit into how developers actually build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They understand your whole project, not just the current file&lt;/li&gt;
&lt;li&gt;They can make real changes, not just suggestions&lt;/li&gt;
&lt;li&gt;They stay out of your way when you're in flow&lt;/li&gt;
&lt;li&gt;They handle the boring stuff so you can focus on the interesting problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the following list, I’ll use &lt;code&gt;build a photo gallery app&lt;/code&gt; as a prompt to evaluate the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Cursor - The power tool for developers who live in their editor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://cursor.sh/" rel="noopener noreferrer"&gt;cursor.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cursor is a fork of VS Code with AI built in, but not just as a side panel. It can read your whole codebase, navigate across files, and actually change code in ways that feel useful. It's what Copilot could've been if it understood your repo instead of just guessing line-by-line.&lt;/p&gt;

&lt;p&gt;Here are a few screenshots showing how Cursor responded when I asked it to build a photo gallery app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jxuhyvx0ld3hq5j620c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jxuhyvx0ld3hq5j620c.png" alt="cursor_1.png" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favxggrxjcjki83t2e90j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favxggrxjcjki83t2e90j.png" alt="cursor_2.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Core features of Cursor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smart code completion&lt;/strong&gt;: AI-driven code generation and completion system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural language interaction&lt;/strong&gt;: Intelligent dialogue assistant that understands natural language and provides programming assistance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code refactoring and optimization&lt;/strong&gt;: Advanced features for code refactoring, understanding, and optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Cursor differs from traditional IDEs
&lt;/h3&gt;

&lt;p&gt;Cursor is a VS Code compiler integrated with multiple models, not a plugin used within an IDE. It provides more comprehensive contextual understanding, not only performing code completion but also specifically fixing error code and restructuring code architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing and access
&lt;/h3&gt;

&lt;p&gt;Cursor offers flexible pricing plans, including free access with core features and premium tiers that unlock access to the latest Claude models and more advanced capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Cursor best for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developers seeking a smarter IDE experience&lt;/li&gt;
&lt;li&gt;Engineers focused on clean, maintainable code&lt;/li&gt;
&lt;li&gt;Builders who want AI help without giving up control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our previous blog post, we shared a step-by-step tutorial on vibe coding with Cursor, showing how to build a simple app with authentication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logto.io/cursor-logto-auth" rel="noopener noreferrer"&gt;https://blog.logto.io/cursor-logto-auth&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. GitHub Copilot Workspace - Issue → Plan → PR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;github.com/features/copilot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Copilot is another AI agent inside your IDE. Its autocomplete feature was just the beginning — the real game-changer is &lt;strong&gt;Copilot Workspace.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest advantage? Copilot is deeply integrated into the GitHub ecosystem. If your team relies heavily on GitHub for planning and maintaining code, Copilot is a solid starting point.&lt;/p&gt;

&lt;p&gt;The platform now features an advanced coding agent mode that can make sweeping changes across multiple files by analyzing code, proposing edits, running tests, and validating results.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqozcgi12tt9z0qugsxjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqozcgi12tt9z0qugsxjr.png" alt="Github_copilot.png" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  When GitHub copilot starts to make sense
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're juggling multiple features and don't want to context switch&lt;/li&gt;
&lt;li&gt;You want to delegate a "known shape" of work (CRUD, tests, tweaks)&lt;/li&gt;
&lt;li&gt;You've got a clear task but don't want to handhold it&lt;/li&gt;
&lt;li&gt;Teams already using GitHub ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Copilot key features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-model support including Claude 3.5 Sonnet and Google Gemini 2.0 Flash&lt;/li&gt;
&lt;li&gt;Agent mode for complex, multi-file operations&lt;/li&gt;
&lt;li&gt;Seamless integration with popular IDEs&lt;/li&gt;
&lt;li&gt;Real-time code suggestions and completions&lt;/li&gt;
&lt;li&gt;Pricing: Starting at $10/month for individual developers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Bolt - Multi-agent software building, from the browser
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;bolt.new&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bolt feels like what would happen if you mashed together Figma, GPT, and a backend generator. You describe what you want: a form, a dashboard, a flow, and behind the scenes, multiple agents handle the pieces: UI, logic, backend, state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafiopzhs1hzjky5tn1nt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafiopzhs1hzjky5tn1nt.png" alt="bolt_1.png" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0sgyjc4s1wdqhljk4oec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0sgyjc4s1wdqhljk4oec.png" alt="bolt_2.png" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes Bolt.new stand out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fast iterations, even for non-developers&lt;/li&gt;
&lt;li&gt;Agents work in parallel to co-build components&lt;/li&gt;
&lt;li&gt;In-browser canvas makes it feel less like code, more like building&lt;/li&gt;
&lt;li&gt;No setup required, works directly in your browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is Bolt.new best for
&lt;/h3&gt;

&lt;p&gt;Early MVPs, internal tools, or when you want to skip boilerplate and focus on core logic. Even if you’re not a developer, you can still build a polished, professional product. In contrast, Cursor offers more advanced configuration options suited for developers who want fine-grained control.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Lovable - Natural Language → Full-Stack App
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://lovable.so/" rel="noopener noreferrer"&gt;lovable.so&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lovable is simple: describe what you're building, and it gives you a working app: frontend, backend, database, login flow, the works. It's especially useful when you know what you want but don't want to scaffold everything from scratch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm2quatzhc58w6ui6pgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm2quatzhc58w6ui6pgv.png" alt="lovable.png" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Lovable useful for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Indie hackers&lt;/li&gt;
&lt;li&gt;Product people building internal tools&lt;/li&gt;
&lt;li&gt;MVPs and demos&lt;/li&gt;
&lt;li&gt;Getting a working base fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lovable is not meant for tweaking every edge case  but it gets you a working foundation fast, which is often all you need. Lovable is similar to Bolt.new, but even simpler and more opinionated. It’s tightly integrated with its ecosystem and tools like Supabase. It’s not built for developers who need full control, but rather for indie hackers who want to quickly bring their ideas to life.&lt;/p&gt;

&lt;p&gt;In our previous blog post, we shared a step-by-step tutorial on vibe coding with Lovable, showing how to build a simple app with authentication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logto.io/lovable-logto-auth" rel="noopener noreferrer"&gt;https://blog.logto.io/lovable-logto-auth&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Anthropic's Claude Code - Command line power
&lt;/h2&gt;

&lt;p&gt;Anthropic's Claude Code represents a new approach to coding assistance. As an agentic command line tool, it allows developers to delegate entire coding tasks directly from their terminal, making it particularly powerful for complex development workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbabhiz3r5puoc6ibr8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbabhiz3r5puoc6ibr8j.png" alt="claude_1.png" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk1hh4053l1z8r0da5io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk1hh4053l1z8r0da5io.png" alt="claude_2.png" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdf6v0dorkdn0j2p0ckk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdf6v0dorkdn0j2p0ckk4.png" alt="claude_3.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code key features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Command-line interface for seamless workflow integration&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4 powering advanced reasoning capabilities&lt;/li&gt;
&lt;li&gt;Autonomous task completion&lt;/li&gt;
&lt;li&gt;Integration with development pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Claude is best for
&lt;/h3&gt;

&lt;p&gt;Advanced developers who prefer command-line workflows and need autonomous coding assistance&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Replit - Quick scripts, simple logic, in the browser
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://replit.com/" rel="noopener noreferrer"&gt;replit.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Replit’s biggest moat is that it didn’t start as an AI product — it began as a full-featured Cloud IDE that combines editor, terminal, and deployment into one environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your browser and start coding, running services, using a terminal, or deploying apps&lt;/li&gt;
&lt;li&gt;Ideal for teaching, quick prototyping, and running small projects&lt;/li&gt;
&lt;li&gt;Supports real-time collaboration and live preview&lt;/li&gt;
&lt;li&gt;Extremely beginner-friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How Replit got Compared to Bolt Lovable
&lt;/h3&gt;

&lt;p&gt;Replit builds from the ground up as a developer tool : AI is an enhancement, not the core.&lt;/p&gt;

&lt;p&gt;Bolt and Lovable start with “natural language to code” as the default. They assume you’re not a traditional developer and may not even want an IDE at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84odl9yp5ou8fvv3kk10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84odl9yp5ou8fvv3kk10.png" alt="replit.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Replit does best
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Short tasks, simple ideas&lt;/li&gt;
&lt;li&gt;Educational content, walkthroughs&lt;/li&gt;
&lt;li&gt;Live collaboration with AI in the loop&lt;/li&gt;
&lt;li&gt;Cloud-based development environment&lt;/li&gt;
&lt;li&gt;Instant deployment capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is Replit best for
&lt;/h3&gt;

&lt;p&gt;Beginners, educators, and developers who prefer cloud-based development environments&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Windsurf - The collaborative alternative
&lt;/h2&gt;

&lt;p&gt;Windsurf, formerly known as Codeium, has evolved into a full-featured AI coding platform that now competes directly with Cursor and GitHub Copilot.&lt;/p&gt;

&lt;p&gt;What sets it apart is its focus on the &lt;strong&gt;chat-based, agentic experience&lt;/strong&gt;. While Cursor is still centered around the IDE, Windsurf leans more into conversational interactions, making AI feel more like a coding partner than just a tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6xfmlwc6kow6n29ul97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6xfmlwc6kow6n29ul97.png" alt="windsurf_1.png" width="800" height="464"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favymta801dzm4eiih4uo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favymta801dzm4eiih4uo.png" alt="windsurf_2.png" width="800" height="466"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt21e9qyuuhk147p7sw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt21e9qyuuhk147p7sw1.png" alt="windsurf_3.png" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Windsurf key features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-model AI support&lt;/li&gt;
&lt;li&gt;Real-time collaboration features&lt;/li&gt;
&lt;li&gt;Extensive language support&lt;/li&gt;
&lt;li&gt;Custom model training capabilities&lt;/li&gt;
&lt;li&gt;A browser experience controlled by the Windsurf AI agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Windsurf vs Cursor
&lt;/h3&gt;

&lt;p&gt;Whenever people talk about AI-powered IDEs, Windsurf and Cursor are always part of the conversation. So in this section, I’ll do a detailed comparison between the two.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Category&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Windsurf&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Experience &amp;amp; Interface Design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor IDE focuses on speed and precision, with fast completions and a Composer mode that turns plain English into code. It’s a more established platform with refined workflows.&lt;/td&gt;
&lt;td&gt;Windsurf generally has a cleaner and more polished UI compared to Cursor. It feels like comparing an Apple product to a Microsoft one — those little details make Windsurf feel more refined and intuitive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core AI Technology&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor provides a flexible approach with multiple interaction modes, offering both direct assistance and task execution via Agent mode or the Composer feature.&lt;/td&gt;
&lt;td&gt;Windsurf's Cascade is an AI IDE agent that automatically fills context, runs commands, and remembers user-specific details across sessions. Powered by Codium, it feels like a reliable and intelligent coding partner.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Understanding &amp;amp; Code Intelligence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor can lose context after several prompts and sometimes hallucinates. Its rigid structure may limit creative or unconventional coding workflows.&lt;/td&gt;
&lt;td&gt;Windsurf often gets things right on the first try, recognizing and using project-specific components accurately. It demonstrates stronger contextual understanding and code intelligence.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workflow Philosophy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cursor follows an assistance-first approach. It handles ambiguous prompts well and offers developers more control, making it ideal for those who prefer hands-on involvement.&lt;/td&gt;
&lt;td&gt;Windsurf embraces an agent-first philosophy. It takes initiative in handling complex tasks, making it better suited for developers who prefer a more autonomous AI partner.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Which should you choose?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Choose Windsurf if you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Value clean, refined UI/UX&lt;/li&gt;
&lt;li&gt;Want an AI that proactively understands your codebase&lt;/li&gt;
&lt;li&gt;Prefer an agent-style approach to coding&lt;/li&gt;
&lt;li&gt;Need better context retention across conversations&lt;/li&gt;
&lt;li&gt;Want more autonomous AI assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose Cursor if you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need faster code completions and immediate responses&lt;/li&gt;
&lt;li&gt;Prefer more control over AI interactions&lt;/li&gt;
&lt;li&gt;Work well with ambiguous prompts&lt;/li&gt;
&lt;li&gt;Want a more established platform with proven workflows&lt;/li&gt;
&lt;li&gt;Are comfortable with a steeper learning curve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real talk on AI coding tools
&lt;/h2&gt;

&lt;p&gt;Most "AI dev tools" are either too shallow (autocomplete with hype) or too heavy (agents with zero context). The ones that work fit into how you actually build:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose based on your workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; if you want a smarter IDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt; if you run your life through GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt&lt;/strong&gt; if you want to orchestrate multiple agents to build features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lovable&lt;/strong&gt; if you want a full app without setting up a repo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replit&lt;/strong&gt; if you're building in the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to choose the right tool
&lt;/h2&gt;

&lt;p&gt;The best coding agent depends on your specific needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For individual developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for deep IDE integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lovable&lt;/strong&gt; for rapid prototyping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bolt&lt;/strong&gt; for browser-based development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for command-line workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For teams:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot Workspace&lt;/strong&gt; for GitHub-centric workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf&lt;/strong&gt; for collaborative features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best practices for using coding agents
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with your workflow:&lt;/strong&gt; Pick tools that fit how you already work, not tools that force you to change everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't trust blindly:&lt;/strong&gt; These tools are powerful, but they're not perfect. Always review generated code for accuracy and security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use them for leverage:&lt;/strong&gt; The best coding agents handle the boring stuff so you can focus on the interesting problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay in control:&lt;/strong&gt; You're still the developer. These tools should amplify your abilities, not replace your judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of coding agents
&lt;/h2&gt;

&lt;p&gt;As we move through 2025, coding agents are becoming more sophisticated and integrated into development workflows. The trend is toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better context understanding&lt;/strong&gt; across entire projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More autonomous task completion&lt;/strong&gt; with less handholding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialized agents&lt;/strong&gt; for specific domains and use cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved collaboration&lt;/strong&gt; between human developers and AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;These aren't toys. They're a new layer in the stack, not replacing developers, but changing the rhythm of how we ship software. The best coding agents in 2025 understand that developers don't need another chatbot. They need tools that actually help them build.&lt;/p&gt;

&lt;p&gt;The key is finding the ones that fit your workflow, solve real problems, and stay out of your way when you're in flow. Whether you're building MVPs, managing complex codebases, or just trying to ship faster, there's likely a coding agent that can help you get there.&lt;/p&gt;

&lt;p&gt;The future of software development is collaborative, with AI agents serving as intelligent partners that amplify human creativity and problem-solving capabilities. Choose the right tools, use them wisely, and focus on what you do best: solving problems and building software that matters.&lt;/p&gt;

&lt;p&gt;After exploring how Cursor, GitHub Copilot, and Windsurf shape the future of coding with AI, one thing is clear: the ecosystem is moving toward more conversational, agent-driven development.&lt;/p&gt;

&lt;p&gt;If you’re building modern apps and need authentication done right, &lt;a href="https://logto.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Logto&lt;/strong&gt;&lt;/a&gt; fits right into that workflow. It offers seamless auth, user management, and permission controls: all developer-friendly and easy to integrate with any of these AI-powered coding environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less time on auth. More time shipping.&lt;/strong&gt;&lt;/p&gt;



</description>
      <category>agents</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
