<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>GoAuth Blog</title>
        <link>https://your-goauth-site.example.com/blog</link>
        <description>GoAuth Blog</description>
        <lastBuildDate>Fri, 01 Mar 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Enterprise-Ready Features in GoAuth]]></title>
            <link>https://your-goauth-site.example.com/blog/enterprise-authentication-features</link>
            <guid>https://your-goauth-site.example.com/blog/enterprise-authentication-features</guid>
            <pubDate>Fri, 01 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[GoAuth includes several modules and capabilities aimed at organizations that need more than basic signup/login. This post covers what is available today for multi-tenant setups, compliance, and advanced security.]]></description>
            <content:encoded><![CDATA[<p>GoAuth includes several modules and capabilities aimed at organizations that need more than basic signup/login. This post covers what is available today for multi-tenant setups, compliance, and advanced security.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="organization-module">Organization Module<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#organization-module" class="hash-link" aria-label="Direct link to Organization Module" title="Direct link to Organization Module">​</a></h2>
<p>The organization module provides multi-org support:</p>
<ul>
<li><strong>Create organizations</strong> with metadata and settings</li>
<li><strong>Role-based membership</strong> -- assign roles (owner, admin, member, or custom) to users within an organization</li>
<li><strong>Invitations</strong> -- invite users to organizations via email with configurable expiration</li>
<li><strong>Multiple memberships</strong> -- users can belong to multiple organizations</li>
</ul>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/bete7512/goauth/pkg/modules/organization"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">organization</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>The organization module adds its own API endpoints for creating orgs, managing members, sending invitations, and switching organization context.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="audit-logging">Audit Logging<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#audit-logging" class="hash-link" aria-label="Direct link to Audit Logging" title="Direct link to Audit Logging">​</a></h2>
<p>The audit module tracks security-relevant events across your system:</p>
<ul>
<li>Login attempts (successful and failed)</li>
<li>Password changes and resets</li>
<li>2FA enrollment and verification</li>
<li>Admin actions on user accounts</li>
<li>Session creation and revocation</li>
</ul>
<p>Each audit entry includes timestamp, actor ID, action, IP address, user agent, and severity level.</p>
<h3 class="anchor anchorWithStickyNavbar_qLCg" id="retention-policies">Retention Policies<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#retention-policies" class="hash-link" aria-label="Direct link to Retention Policies" title="Direct link to Retention Policies">​</a></h3>
<p>Audit logs support configurable retention with automatic cleanup:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/bete7512/goauth/pkg/modules/audit"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">audit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">audit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    RetentionDays</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">90</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CleanupInterval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Hour</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>The cleanup runs as a background goroutine that respects context cancellation for graceful shutdown.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="two-factor-authentication">Two-Factor Authentication<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#two-factor-authentication" class="hash-link" aria-label="Direct link to Two-Factor Authentication" title="Direct link to Two-Factor Authentication">​</a></h2>
<p>GoAuth's 2FA implementation includes:</p>
<ul>
<li><strong>TOTP</strong> (RFC 6238) with configurable issuer, digits, and period</li>
<li><strong>Encrypted secret storage</strong> -- TOTP secrets are encrypted with AES-256-GCM before being written to the database</li>
<li><strong>Backup codes</strong> -- configurable count (default 10) and length (default 8 characters)</li>
<li><strong>Code reuse prevention</strong> -- each TOTP code can only be used once within its validity window</li>
<li><strong>Sync intercept</strong> -- during login, 2FA verification is enforced via <code>EmitSync</code> so the login flow blocks until the code is verified</li>
</ul>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/bete7512/goauth/pkg/modules/twofactor"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">twofactor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TwoFactorConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Issuer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">           </span><span class="token string" style="color:#e3116c">"MyCompany"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    BackupCodesCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CodeLength</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">       </span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="oauth-with-pkce">OAuth with PKCE<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#oauth-with-pkce" class="hash-link" aria-label="Direct link to OAuth with PKCE" title="Direct link to OAuth with PKCE">​</a></h2>
<p>The OAuth module supports 4 providers -- Google, GitHub, Microsoft, and Discord -- with PKCE (Proof Key for Code Exchange) for secure authorization code flows:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/bete7512/goauth/pkg/modules/oauth"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">oauth</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OAuthModuleConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Providers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OAuthProvider</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">         </span><span class="token string" style="color:#e3116c">"google"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ClientID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">     os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"GOOGLE_CLIENT_ID"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ClientSecret</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"GOOGLE_CLIENT_SECRET"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            RedirectURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  </span><span class="token string" style="color:#e3116c">"https://app.example.com/auth/oauth/google/callback"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="event-hooks">Event Hooks<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#event-hooks" class="hash-link" aria-label="Direct link to Event Hooks" title="Direct link to Event Hooks">​</a></h2>
<p>GoAuth's event system supports enterprise integration patterns:</p>
<ul>
<li><strong>Multiple handlers per event</strong> -- attach several handlers to the same event type</li>
<li><strong>Priority ordering</strong> -- handlers execute in priority order (higher priority runs first)</li>
<li><strong>Retry policies</strong> -- configure retries for failed event handlers</li>
<li><strong>Dead-letter queue</strong> -- events that exhaust retries are sent to a DLQ for inspection</li>
<li><strong>Custom async backend</strong> -- replace the default in-memory worker pool with your own <code>types.AsyncBackend</code> implementation (e.g., backed by a message queue)</li>
</ul>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">On</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EventAfterSignup</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data </span><span class="token keyword" style="color:#00009f">interface</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// sync new user to external systems</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="pluggable-storage">Pluggable Storage<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#pluggable-storage" class="hash-link" aria-label="Direct link to Pluggable Storage" title="Direct link to Pluggable Storage">​</a></h2>
<p>GoAuth's storage layer is interface-based:</p>
<ul>
<li><strong>Built-in</strong>: GORM backend supporting PostgreSQL, MySQL, and SQLite</li>
<li><strong>Cache decorator</strong>: In-memory cache for reducing database load</li>
<li><strong>Custom backends</strong>: Implement <code>types.Storage</code> (with <code>Core()</code>, <code>Session()</code>, <code>Stateless()</code> sub-interfaces) to use any data store</li>
</ul>
<p>This means you can use GoAuth with existing enterprise databases or non-SQL backends without forking the library.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="what-goauth-does-not-provide">What GoAuth Does Not Provide<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#what-goauth-does-not-provide" class="hash-link" aria-label="Direct link to What GoAuth Does Not Provide" title="Direct link to What GoAuth Does Not Provide">​</a></h2>
<p>To be clear about scope:</p>
<ul>
<li><strong>No SAML or LDAP</strong> -- GoAuth handles OAuth 2.0 for social login. For SAML/LDAP, integrate at the identity provider level and use GoAuth for session management.</li>
<li><strong>No RBAC system</strong> -- The organization module has roles for org membership. For application-level permissions, implement your own authorization layer on top of GoAuth's user/org identities.</li>
<li><strong>No built-in Redis or RabbitMQ</strong> -- The <code>AsyncBackend</code> and storage interfaces are pluggable, but GoAuth does not ship with Redis or message queue implementations. The in-memory worker pool and GORM storage are the built-in defaults.</li>
<li><strong>No Prometheus metrics or Kubernetes operators</strong> -- GoAuth is a library, not a service. Instrument it with your existing observability stack.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="getting-started">Getting Started<a href="https://your-goauth-site.example.com/blog/enterprise-authentication-features#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>Add the modules you need:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">organization</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">audit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">audit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">RetentionDays</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">90</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">twofactor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">oauth</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OAuthModuleConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>See the <a href="https://your-goauth-site.example.com/docs/showcase">Examples</a> page for complete setup patterns and the individual module docs for configuration details.</p>
<hr>
<p><em>Follow development on <a href="https://github.com/bete7512/goauth" target="_blank" rel="noopener noreferrer">GitHub</a>.</em></p>]]></content:encoded>
            <category>Enterprise</category>
            <category>Security</category>
            <category>Compliance</category>
            <category>organizations</category>
            <category>audit</category>
        </item>
        <item>
            <title><![CDATA[GoAuth Performance: Architecture and Benchmarking]]></title>
            <link>https://your-goauth-site.example.com/blog/goauth-performance-benchmarks</link>
            <guid>https://your-goauth-site.example.com/blog/goauth-performance-benchmarks</guid>
            <pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Performance in an authentication library comes down to how often you hit the database, how you handle concurrent work, and what you do with CPU-intensive operations like password hashing. This post covers the architectural choices in GoAuth that affect performance and how to benchmark them yourself.]]></description>
            <content:encoded><![CDATA[<p>Performance in an authentication library comes down to how often you hit the database, how you handle concurrent work, and what you do with CPU-intensive operations like password hashing. This post covers the architectural choices in GoAuth that affect performance and how to benchmark them yourself.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="authentication-strategy-performance">Authentication Strategy Performance<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#authentication-strategy-performance" class="hash-link" aria-label="Direct link to Authentication Strategy Performance" title="Direct link to Authentication Strategy Performance">​</a></h2>
<p>The single biggest performance decision in GoAuth is choosing between session and stateless authentication:</p>
<table><thead><tr><th>Strategy</th><th>Validation Cost</th><th>Best For</th></tr></thead><tbody><tr><td><strong>Stateless (JWT)</strong></td><td>O(1) -- HMAC verification, no DB call</td><td>High-traffic APIs, microservices</td></tr><tr><td><strong>Session (DB)</strong></td><td>O(log N) -- DB lookup per request</td><td>High-security apps where immediate revocation matters</td></tr><tr><td><strong>Session (Cookie-Cache)</strong></td><td>O(1) most requests, periodic DB sync</td><td>Balanced apps needing revocation without constant DB load</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_qLCg" id="cookie-cache-strategy">Cookie-Cache Strategy<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#cookie-cache-strategy" class="hash-link" aria-label="Direct link to Cookie-Cache Strategy" title="Direct link to Cookie-Cache Strategy">​</a></h3>
<p>The session module's cookie-cache strategy is the most interesting from a performance perspective. It works by:</p>
<ol>
<li>On login, the session is stored in the database and a session cookie is set.</li>
<li>A short-lived cache cookie (configurable TTL, e.g., 5 minutes) is set alongside the session cookie.</li>
<li>On subsequent requests, if the cache cookie is still valid, the session is trusted without a database round-trip.</li>
<li>When the cache cookie expires, the next request checks the database and refreshes the cache.</li>
</ol>
<p>This gives you near-stateless performance for the common case while keeping the ability to revoke sessions within the cache TTL window.</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">session</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionModuleConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">       types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionStrategyCookieCache</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    CookieCacheTTL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="password-hashing">Password Hashing<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#password-hashing" class="hash-link" aria-label="Direct link to Password Hashing" title="Direct link to Password Hashing">​</a></h2>
<p>GoAuth uses <strong>bcrypt</strong> for password hashing. Bcrypt is deliberately slow -- that is the point. The cost factor controls how many rounds of hashing are performed:</p>
<ul>
<li>Default cost: 10 (standard <code>bcrypt.DefaultCost</code>)</li>
<li>Each increment roughly doubles the time</li>
</ul>
<p>This is the most CPU-intensive operation in the auth lifecycle. For most applications, the default cost is appropriate. If you are seeing login latency issues under load, the bottleneck is almost certainly bcrypt, which is by design -- it prevents brute-force attacks.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="refresh-token-hashing">Refresh Token Hashing<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#refresh-token-hashing" class="hash-link" aria-label="Direct link to Refresh Token Hashing" title="Direct link to Refresh Token Hashing">​</a></h2>
<p>Refresh tokens are hashed with <strong>SHA-256</strong> before storage. This is a fast, constant-time operation that adds negligible overhead but ensures that a database breach does not expose raw refresh tokens.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="async-event-processing">Async Event Processing<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#async-event-processing" class="hash-link" aria-label="Direct link to Async Event Processing" title="Direct link to Async Event Processing">​</a></h2>
<p>GoAuth's event system uses a <strong>worker pool</strong> (default: 10 workers, 1000-item queue) for asynchronous event processing. Events like sending notification emails or writing audit logs are dispatched to the pool without blocking the HTTP response.</p>
<p>The worker pool is the default <code>AsyncBackend</code>. You can replace it with a custom implementation (e.g., backed by a message queue) by implementing the <code>types.AsyncBackend</code> interface.</p>
<p>For synchronous intercept points (like checking 2FA during login), GoAuth uses <code>EmitSync</code>, which blocks and returns errors to the caller.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="storage-optimization">Storage Optimization<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#storage-optimization" class="hash-link" aria-label="Direct link to Storage Optimization" title="Direct link to Storage Optimization">​</a></h2>
<p>GoAuth's GORM-based storage includes several optimizations:</p>
<ul>
<li><strong>Selective migrations</strong>: Each module only migrates the tables it needs.</li>
<li><strong>Indexed lookups</strong>: Core tables have indexes on email and username for fast authentication queries.</li>
<li><strong>Type-safe storage access</strong>: <code>Storage.Core()</code>, <code>Storage.Session()</code>, <code>Storage.Stateless()</code> -- no reflection or string-based lookups.</li>
<li><strong>In-memory cache decorator</strong>: An optional cache layer that can be wrapped around any storage implementation.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="running-benchmarks">Running Benchmarks<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#running-benchmarks" class="hash-link" aria-label="Direct link to Running Benchmarks" title="Direct link to Running Benchmarks">​</a></h2>
<p>GoAuth includes benchmarks in the test suite. Run them yourself to see performance on your hardware:</p>
<div class="language-bash codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-bash codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">make test-bench</span><br></span></code></pre></div></div>
<p>This runs Go's standard <code>testing.B</code> benchmarks across the codebase. Results will vary based on your CPU, memory, and disk speed. Do not trust benchmark numbers from blog posts (including this one) -- always measure on your own infrastructure.</p>
<p>You can also run benchmarks for specific packages:</p>
<div class="language-bash codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-bash codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">go test -bench=. -benchmem ./internal/security/...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">go test -bench=. -benchmem ./storage/...</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="practical-recommendations">Practical Recommendations<a href="https://your-goauth-site.example.com/blog/goauth-performance-benchmarks#practical-recommendations" class="hash-link" aria-label="Direct link to Practical Recommendations" title="Direct link to Practical Recommendations">​</a></h2>
<ol>
<li><strong>Use stateless auth by default.</strong> It eliminates database calls for token validation entirely.</li>
<li><strong>If you need session revocation</strong>, use the cookie-cache strategy with a reasonable TTL (2-5 minutes) rather than checking the database on every request.</li>
<li><strong>Keep access token TTL short</strong> (15 minutes default). Short-lived tokens reduce the window of exposure without requiring token blacklisting.</li>
<li><strong>Offload heavy work to the event system.</strong> Email sending, audit logging, and webhook delivery all happen asynchronously by default.</li>
<li><strong>Index your database.</strong> GoAuth's auto-migration creates indexes, but verify they exist if you manage migrations manually.</li>
</ol>
<hr>
<p><em>See the <a href="https://your-goauth-site.example.com/docs/performance">Performance docs</a> for strategy comparison details, and the <a href="https://your-goauth-site.example.com/docs/modules/session">Session Module</a> docs for cookie-cache configuration.</em></p>]]></content:encoded>
            <category>Performance</category>
            <category>Benchmarks</category>
            <category>Go (Golang)</category>
            <category>Authentication</category>
        </item>
        <item>
            <title><![CDATA[JWT Security in GoAuth]]></title>
            <link>https://your-goauth-site.example.com/blog/jwt-security-best-practices</link>
            <guid>https://your-goauth-site.example.com/blog/jwt-security-best-practices</guid>
            <pubDate>Mon, 15 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This post covers how GoAuth handles JWT security -- the signing approach, token lifecycle, refresh token rotation, and the protective measures built into the library.]]></description>
            <content:encoded><![CDATA[<p>This post covers how GoAuth handles JWT security -- the signing approach, token lifecycle, refresh token rotation, and the protective measures built into the library.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="signing-and-algorithms">Signing and Algorithms<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#signing-and-algorithms" class="hash-link" aria-label="Direct link to Signing and Algorithms" title="Direct link to Signing and Algorithms">​</a></h2>
<p>GoAuth uses <strong>HS256</strong> (HMAC-SHA256) for JWT signing. The secret key is configured via <code>SecurityConfig.JwtSecretKey</code> and must be at least 32 characters. The library validates algorithm headers on every token parse to prevent algorithm confusion attacks.</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> auth</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> store</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Migration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MigrationConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">Auto</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SecurityConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        JwtSecretKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"JWT_SECRET"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// min 32 chars</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        EncryptionKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ENCRYPTION_KEY"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// for AES-256-GCM</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="access-and-refresh-token-pair">Access and Refresh Token Pair<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#access-and-refresh-token-pair" class="hash-link" aria-label="Direct link to Access and Refresh Token Pair" title="Direct link to Access and Refresh Token Pair">​</a></h2>
<p>GoAuth issues two tokens on login:</p>
<ul>
<li><strong>Access token</strong> -- Short-lived (default 15 minutes). Carries user claims. Used for API authorization.</li>
<li><strong>Refresh token</strong> -- Longer-lived (default 7 days). Used only to obtain a new access token.</li>
</ul>
<p>The TTLs are configurable:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">Security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SecurityConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    JwtSecretKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> os</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Getenv</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"JWT_SECRET"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Session</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SessionConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        AccessTokenTTL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">  </span><span class="token number" style="color:#36acaa">15</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        RefreshTokenTTL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Hour</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="refresh-token-rotation">Refresh Token Rotation<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#refresh-token-rotation" class="hash-link" aria-label="Direct link to Refresh Token Rotation" title="Direct link to Refresh Token Rotation">​</a></h2>
<p>How refresh tokens are secured depends on the authentication strategy:</p>
<p><strong>Stateless module</strong>: Each refresh token includes a JTI (JWT ID) nonce. The JTI is stored in the database. When a refresh token is used, the old JTI is invalidated and a new token with a fresh JTI is issued. This provides one-time-use semantics -- replaying an old refresh token fails.</p>
<p><strong>Session module</strong>: Refresh tokens are hashed with SHA-256 before storage. The raw token is only returned to the client; the database never holds the plaintext. On refresh, the incoming token is hashed and compared against the stored hash.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="account-lockout">Account Lockout<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#account-lockout" class="hash-link" aria-label="Direct link to Account Lockout" title="Direct link to Account Lockout">​</a></h2>
<p>GoAuth includes brute-force protection via account lockout:</p>
<ul>
<li><strong>Max attempts</strong>: 5 failed login attempts (configurable)</li>
<li><strong>Lockout window</strong>: 15 minutes (configurable)</li>
<li><strong>Lockout behavior</strong>: Returns a <code>429</code> status with time remaining until unlock</li>
</ul>
<p>This is configured via <code>Config.Validate()</code> defaults or explicitly:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">Lockout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LockoutConfig</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MaxAttempts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">     </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    LockoutDuration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Minute</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="password-policy">Password Policy<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#password-policy" class="hash-link" aria-label="Direct link to Password Policy" title="Direct link to Password Policy">​</a></h2>
<p>GoAuth enforces password requirements at the config level:</p>
<ul>
<li>Minimum length: 8 characters (default)</li>
<li>Maximum length: 128 characters (default)</li>
<li>Configurable via <code>PasswordPolicy</code> in the config</li>
</ul>
<p>Passwords are hashed with <strong>bcrypt</strong>. The cost factor is configurable through <code>SecurityConfig</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="encryption-of-sensitive-data">Encryption of Sensitive Data<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#encryption-of-sensitive-data" class="hash-link" aria-label="Direct link to Encryption of Sensitive Data" title="Direct link to Encryption of Sensitive Data">​</a></h2>
<p>Beyond passwords and JWTs, GoAuth encrypts sensitive fields using AES-256-GCM:</p>
<ul>
<li>TOTP secrets stored in the database</li>
<li>OAuth provider tokens</li>
</ul>
<p>The encryption key is set via <code>SecurityConfig.EncryptionKey</code> (32 characters for AES-256).</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="token-storage-on-the-client">Token Storage on the Client<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#token-storage-on-the-client" class="hash-link" aria-label="Direct link to Token Storage on the Client" title="Direct link to Token Storage on the Client">​</a></h2>
<p>GoAuth sets tokens in HTTP-only, secure cookies with <code>SameSite</code> attributes when using the session module. For stateless JWT, tokens are returned in JSON response bodies for the client to store as appropriate.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="what-goauth-does-not-do">What GoAuth Does Not Do<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#what-goauth-does-not-do" class="hash-link" aria-label="Direct link to What GoAuth Does Not Do" title="Direct link to What GoAuth Does Not Do">​</a></h2>
<p>To set expectations clearly:</p>
<ul>
<li><strong>No RS256/ES256</strong> -- GoAuth uses HS256 only. If you need asymmetric signing, you would need to implement a custom security manager satisfying the <code>types.SecurityManager</code> interface.</li>
<li><strong>No built-in rate limiting middleware</strong> -- Account lockout handles brute-force at the application level. For network-level rate limiting, use your reverse proxy or a dedicated middleware.</li>
<li><strong>No token blacklisting for access tokens</strong> -- Access tokens are short-lived by design. The stateless module blacklists refresh token JTIs on revocation.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="security-checklist">Security Checklist<a href="https://your-goauth-site.example.com/blog/jwt-security-best-practices#security-checklist" class="hash-link" aria-label="Direct link to Security Checklist" title="Direct link to Security Checklist">​</a></h2>
<p>Before deploying:</p>
<ul class="contains-task-list containsTaskList_hCnH">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Set <code>JwtSecretKey</code> to a strong, random 32+ character value from environment variables</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Set <code>EncryptionKey</code> to a separate strong, random 32-character value</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Configure appropriate <code>AccessTokenTTL</code> (shorter is safer; 15 minutes is a good default)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Enable HTTPS in production (GoAuth sets <code>Secure</code> flag on cookies)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Enable account lockout (on by default)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Enable email verification if your app requires confirmed email addresses</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Use the CSRF module for browser-based applications</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Review audit logs regularly if using the audit module</li>
</ul>
<hr>
<p><em>For more details, see the <a href="https://your-goauth-site.example.com/docs/modules/stateless">Stateless Module</a> and <a href="https://your-goauth-site.example.com/docs/modules/session">Session Module</a> documentation.</em></p>]]></content:encoded>
            <category>Security</category>
            <category>JWT</category>
            <category>Best Practices</category>
            <category>Go (Golang)</category>
        </item>
        <item>
            <title><![CDATA[Introducing GoAuth]]></title>
            <link>https://your-goauth-site.example.com/blog/welcome</link>
            <guid>https://your-goauth-site.example.com/blog/welcome</guid>
            <pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[GoAuth is a modular, framework-agnostic authentication library for Go. It gives you composable modules for building auth systems -- from basic email/password signup to multi-organization setups with 2FA and audit logging.]]></description>
            <content:encoded><![CDATA[<p>GoAuth is a modular, framework-agnostic authentication library for Go. It gives you composable modules for building auth systems -- from basic email/password signup to multi-organization setups with 2FA and audit logging.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="what-goauth-provides">What GoAuth Provides<a href="https://your-goauth-site.example.com/blog/welcome#what-goauth-provides" class="hash-link" aria-label="Direct link to What GoAuth Provides" title="Direct link to What GoAuth Provides">​</a></h2>
<p>GoAuth ships with 12 modules that you compose via a three-phase lifecycle:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">_</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> auth</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Config</span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// 1. Create</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Use</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">twofactor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">New</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic">// 2. Register modules</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Initialize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Background</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// 3. Initialize</span><br></span></code></pre></div></div>
<p><strong>Core</strong> (auto-registered) handles user registration, login, password reset, email/phone verification, and profile management. You then pick an authentication strategy:</p>
<ul>
<li><strong>Session</strong> -- Server-side sessions with a cookie-cache strategy that avoids a DB round-trip on every request.</li>
<li><strong>Stateless</strong> (default) -- JWT access/refresh token pair with configurable TTLs and refresh token rotation.</li>
</ul>
<p>Session and stateless are mutually exclusive. If you register neither, stateless is used by default.</p>
<p><strong>Optional modules</strong> cover the rest:</p>
<ul>
<li><strong>OAuth</strong> -- Social login with Google, GitHub, Microsoft, and Discord (PKCE supported)</li>
<li><strong>Two-Factor</strong> -- TOTP-based 2FA with encrypted secrets and backup codes</li>
<li><strong>Notification</strong> -- Email/SMS delivery via pluggable senders (SendGrid, SMTP, Twilio, or custom)</li>
<li><strong>Admin</strong> -- User CRUD endpoints with admin auth middleware</li>
<li><strong>Organization</strong> -- Multi-org support with roles and invitations</li>
<li><strong>Audit</strong> -- Security event logging with configurable retention and cleanup</li>
<li><strong>Captcha</strong> -- reCAPTCHA v3 and Cloudflare Turnstile</li>
<li><strong>CSRF</strong> -- Token-based CSRF protection</li>
<li><strong>Magic Link</strong> -- Passwordless authentication via email</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="security-defaults">Security Defaults<a href="https://your-goauth-site.example.com/blog/welcome#security-defaults" class="hash-link" aria-label="Direct link to Security Defaults" title="Direct link to Security Defaults">​</a></h2>
<p>GoAuth ships with sensible defaults out of the box:</p>
<ul>
<li><strong>bcrypt</strong> password hashing with configurable cost factor</li>
<li><strong>HS256</strong> JWT signing with a required 32+ character secret</li>
<li><strong>AES-256-GCM</strong> encryption for sensitive data (TOTP secrets, OAuth tokens)</li>
<li><strong>SHA-256</strong> refresh token hashing in the database</li>
<li><strong>Account lockout</strong> after 5 failed attempts (15-minute window)</li>
<li><strong>Password policy</strong> enforcement (min 8, max 128 characters)</li>
<li><strong>TOTP code reuse prevention</strong> within the validity window</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="framework-adapters">Framework Adapters<a href="https://your-goauth-site.example.com/blog/welcome#framework-adapters" class="hash-link" aria-label="Direct link to Framework Adapters" title="Direct link to Framework Adapters">​</a></h2>
<p>GoAuth includes adapters for 4 Go web frameworks:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">stdhttp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">mux</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic">// net/http</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ginadapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">router</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Gin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chiadapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">router</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// Chi</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fiberadapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Fiber</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="event-system">Event System<a href="https://your-goauth-site.example.com/blog/welcome#event-system" class="hash-link" aria-label="Direct link to Event System" title="Direct link to Event System">​</a></h2>
<p>Every auth action emits typed events that you can hook into:</p>
<div class="language-go codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-go codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">a</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">On</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EventAfterSignup</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">func</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> data </span><span class="token keyword" style="color:#00009f">interface</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin">error</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    user </span><span class="token operator" style="color:#393A34">:=</span><span class="token plain"> types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">EventDataAs</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">types</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SignupEventData</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// sync to CRM, send analytics, etc.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>The event bus supports multiple handlers per event, priority ordering, retry policies, and a dead-letter queue for failed handlers. The default backend is an in-memory worker pool (10 workers, 1000 queue); you can provide a custom <code>types.AsyncBackend</code> for external brokers.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="storage">Storage<a href="https://your-goauth-site.example.com/blog/welcome#storage" class="hash-link" aria-label="Direct link to Storage" title="Direct link to Storage">​</a></h2>
<p>GoAuth uses GORM under the hood with support for PostgreSQL, MySQL, and SQLite. Storage is type-safe -- <code>Storage.Core()</code>, <code>Storage.Session()</code>, <code>Storage.Stateless()</code> -- with no string-based lookups. An in-memory cache decorator is included, and the storage interface is pluggable for custom backends.</p>
<h2 class="anchor anchorWithStickyNavbar_qLCg" id="getting-started">Getting Started<a href="https://your-goauth-site.example.com/blog/welcome#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<div class="language-bash codeBlockContainer_W683 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_hK6T"><pre tabindex="0" class="prism-code language-bash codeBlock_Y_rO thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_M0FV"><span class="token-line" style="color:#393A34"><span class="token plain">go get github.com/bete7512/goauth</span><br></span></code></pre></div></div>
<p>Check the <a href="https://your-goauth-site.example.com/docs/quickstart">Quick Start</a> guide to build a working auth system in a few minutes, or browse the <a href="https://your-goauth-site.example.com/docs/showcase">Examples</a> for specific use cases.</p>
<hr>
<p><em>Follow along on <a href="https://github.com/bete7512/goauth" target="_blank" rel="noopener noreferrer">GitHub</a> for updates and to contribute.</em></p>]]></content:encoded>
            <category>Announcement</category>
            <category>Welcome</category>
            <category>Go (Golang)</category>
            <category>Authentication</category>
        </item>
    </channel>
</rss>