<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Topics tagged with oauth]]></title><description><![CDATA[A list of topics that have been tagged with oauth]]></description><link>https://fusionauth.io/community/forum/tags/oauth</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 05:03:25 GMT</lastBuildDate><atom:link href="https://fusionauth.io/community/forum/tags/oauth.rss" rel="self" type="application/rss+xml"/><pubDate>Invalid Date</pubDate><ttl>60</ttl><item><title><![CDATA[How to properly revoke refresh tokens when logging out via OAuth in FusionAuth?]]></title><description><![CDATA[<p dir="auto">The /oauth2/logout endpoint only removes the <strong>SSO session</strong> (the front-channel session controlled by the "Keep Me Signed In" toggle). It does <strong>not</strong> automatically revoke the <strong>refresh token</strong> (also known as offline_access).</p>
<p dir="auto">To properly implement logout, you need to handle both sessions separately:</p>
Recommended Logout Flow

<strong>User initiates logout</strong> in your application
<strong>Your backend revokes the refresh token</strong> using the <a href="https://fusionauth.io/docs/apis/jwt/revoke-refresh-tokens" rel="nofollow ugc">Revoke Refresh Tokens API</a>:DELETE /api/jwt/refresh/{refreshTokenId}

Or revoke by user and application:DELETE /api/jwt/refresh?userId={userId}&amp;applicationId={applicationId}


<strong>Destroy your local application session</strong> (clear tokens, cookies, etc.)
<strong>Redirect to /oauth2/logout</strong> with id_token_hint to clear the SSO session

Why This Approach?
<p dir="auto">Revoking the refresh token from your application (step 2) is better than relying on the logout URL callback because:</p>

You have direct access to the user's session data
You know exactly which refresh token to revoke
You can handle errors gracefully
The flow is more deterministic

<p dir="auto">The /oauth2/logout endpoint can call a logout URL configured in your FusionAuth OAuth application settings, but handling revocation proactively in your app provides better control.</p>
Important Note About JWTs
<p dir="auto">Since JWTs (access tokens) are stateless, they cannot be immediately revoked by FusionAuth. If you need to invalidate JWTs before their natural expiration, you'll need to implement your own revocation strategy, such as maintaining a token denylist in your application.</p>
Related Documentation

<a href="https://fusionauth.io/docs/apis/oauth/logout" rel="nofollow ugc">OAuth Logout API</a> - Details on the /oauth2/logout endpoint
<a href="https://fusionauth.io/docs/apis/jwt/revoke-refresh-tokens" rel="nofollow ugc">Revoke Refresh Tokens API</a> - How to revoke refresh tokens programmatically
<a href="https://fusionauth.io/docs/lifecycle/authenticate-users/logout-session-management" rel="nofollow ugc">Logout and Session Management</a> - Comprehensive guide on logout strategies and session types
<a href="https://fusionauth.io/articles/tokens/revoking-jwts" rel="nofollow ugc">Revoking JWTs</a> - Strategies for JWT revocation
<a href="https://fusionauth.io/docs/extend/events-and-webhooks/events/jwt/jwt-refresh-token-revoke" rel="nofollow ugc">JWT Refresh Token Revoke Event</a> - Webhook event when refresh tokens are revoked

]]></description><link>https://fusionauth.io/community/forum/topic/3192/how-to-properly-revoke-refresh-tokens-when-logging-out-via-oauth-in-fusionauth</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3192/how-to-properly-revoke-refresh-tokens-when-logging-out-via-oauth-in-fusionauth</guid><dc:creator><![CDATA[FASupportBot]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[How to handle token audience changes when an AI agent acts on behalf of a user?]]></title><description><![CDATA[<p dir="auto">OAuth 2.0 Token Exchange (RFC 8693) is indeed designed for this kind of scenario. It allows you to exchange an existing token (the user's web-audience token) for a new token with a different audience (e.g. mcp) while maintaining the user's identity and authorization context.</p>
<p dir="auto"><strong>Important Note:</strong> FusionAuth does <strong>not currently implement RFC 8693 (OAuth 2.0 Token Exchange)</strong> natively. There is an <a href="https://github.com/FusionAuth/fusionauth-issues/issues/1471" rel="nofollow ugc">open GitHub issue</a> tracking this feature request. However, FusionAuth provides alternative approaches to achieve similar outcomes.</p>
How Token Exchange Works (RFC 8693 Concept)

<strong>User authenticates</strong> and receives a token with audience: web.
<strong>AI agent receives a request</strong> from the user via the chat interface.
<strong>Agent exchanges the token</strong>: The agent (or a backend service acting on its behalf) calls the token exchange endpoint, providing:

The original web-audience token as the subject_token
The desired new audience (mcp) in the audience parameter
Optionally, a narrower set of scopes if the downstream service requires fewer permissions


<strong>New token issued</strong>: The authorization server returns a new token with audience: mcp, tied to the same user identity.
<strong>Agent calls downstream service</strong> using the new token.

Example Token Exchange Request
POST /oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&amp;subject_token=&lt;user-web-token&gt;
&amp;subject_token_type=urn:ietf:params:oauth:token-type:access_token
&amp;audience=mcp
&amp;scope=mcp:read mcp:write

Current Alternatives in FusionAuth
<p dir="auto">Since RFC 8693 isn't supported yet, here are the recommended approaches:</p>
1. Issue a JWT API
<p dir="auto">Use the <a href="https://fusionauth.io/docs/apis/jwt/issue-a-jwt" rel="nofollow ugc">Issue a JWT endpoint</a> to exchange a token from one application for a token for another application. This is FusionAuth's implementation of SSO for access tokens:</p>
GET /api/jwt/issue?applicationId={targetApplicationId}
Authorization: Bearer &lt;existing_access_token&gt;

<p dir="auto">This returns a new JWT with the target application's audience, preserving the user's identity. The user must be registered in both applications.</p>
2. JWT Populate Lambda
<p dir="auto">Use a <a href="https://fusionauth.io/docs/extend/code/lambdas/jwt-populate" rel="nofollow ugc">JWT Populate Lambda</a> to customize the aud claim directly. You can add multiple audiences to avoid token swapping:</p>
function populate(jwt, user, registration) {
  // Add multiple audiences
  jwt.aud = ['web', 'mcp', 'https://api.example.com'];
}

3. Vend a JWT API
<p dir="auto">For more complex delegation scenarios, use the <a href="https://fusionauth.io/docs/apis/jwt/vend-a-jwt" rel="nofollow ugc">Vend a JWT endpoint</a> to create a custom JWT with free-form claims (except reserved claims like iat, exp, amr, and cnf).</p>
Key Considerations

<strong>Authorization</strong>: The agent should be a registered OAuth client with permission to perform token exchanges. You may want to restrict which clients can exchange tokens and for which audiences.
<strong>Scope narrowing</strong>: The new token can have a subset of the original token's scopes, ensuring least-privilege access to the downstream service.
<strong>User consent</strong>: Depending on your security requirements, you may want to prompt the user to authorize the agent's access to the downstream service the first time this exchange happens.
<strong>Application registration</strong>: When using the Issue JWT approach, ensure the user is registered in both the source and target applications.

<p dir="auto">This approach avoids re-authentication and cleanly separates concerns: the user holds their web token, and the agent dynamically obtains the correct token for each downstream service it needs to call.</p>
Related Documentation

<a href="https://fusionauth.io/articles/oauth/complete-list-oauth-grants#oauth-20-token-exchange-grant" rel="nofollow ugc">OAuth 2.0 Grant Types - Token Exchange Grant</a> - Overview of RFC 8693 token exchange
<a href="https://fusionauth.io/docs/apis/jwt/issue-a-jwt" rel="nofollow ugc">Issue a JWT API</a> - Exchange tokens between applications (FusionAuth's current solution)
<a href="https://fusionauth.io/docs/apis/jwt/vend-a-jwt" rel="nofollow ugc">Vend a JWT API</a> - Create custom JWTs for complex scenarios
<a href="https://fusionauth.io/docs/extend/code/lambdas/jwt-populate" rel="nofollow ugc">JWT Populate Lambda</a> - Customize JWT claims including audience
<a href="https://github.com/FusionAuth/fusionauth-issues/issues/1471" rel="nofollow ugc">GitHub Issue #1471</a> - Track RFC 8693 implementation progress

]]></description><link>https://fusionauth.io/community/forum/topic/3169/how-to-handle-token-audience-changes-when-an-ai-agent-acts-on-behalf-of-a-user</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3169/how-to-handle-token-audience-changes-when-an-ai-agent-acts-on-behalf-of-a-user</guid><dc:creator><![CDATA[FASupportBot]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Why does the FusionAuth SSO cookie have a 68-year Max-Age?]]></title><description><![CDATA[<p dir="auto">The fusionauth.sso cookie is intentionally designed as a <strong>persistent cookie</strong>, which is why it has such a long Max-Age value (2147483647 seconds, approximately 68 years). The value 2147483647 is the maximum 32-bit signed integer, essentially making the cookie persistent from the browser's perspective.</p>
<p dir="auto">However, this does not mean the cookie remains valid for 68 years. The actual validity and usability of the SSO session are controlled <strong>server-side by FusionAuth</strong>, not by the cookie's Max-Age attribute. Specifically:</p>

The SSO session duration is configured in your <strong>Tenant settings</strong> under the <strong>OAuth tab</strong> as the <strong>Session timeout</strong> value (in seconds)
FusionAuth validates whether the cookie can still be used based on these server-side SSO settings
Even though the cookie persists in the browser for a long time, FusionAuth will reject it once the configured SSO session timeout has elapsed

<p dir="auto">The long Max-Age ensures the cookie isn't prematurely deleted by the browser, but the <strong>effective session lifetime is determined by your tenant's SSO configuration</strong>, not the cookie attribute itself.</p>
<p dir="auto">The FusionAuth SSO session allows transparent authentication on one browser or device until one of the following happens:</p>

The SSO session expires (based on the tenant's configured Session timeout)
The user is logged out via the Front-Channel logout endpoint
The refresh token representing the FusionAuth SSO session is revoked via an API call or the admin UI

<p dir="auto"><strong>To address penetration test findings:</strong></p>

<strong>Review and configure appropriate SSO session timeouts</strong> in your Tenant's OAuth settings (Tenants → Your Tenant → OAuth → Session timeout)
<strong>Explain to your security auditors</strong> that the server-side session validation controls the actual security boundary, not the cookie's Max-Age. The cookie's max-age is a technical implementation detail that allows FusionAuth to manage session lifecycles server-side
<strong>Demonstrate that the actual session lifetime</strong> is enforced by the configured Session timeout value, not the 68-year cookie expiration

<p dir="auto">This is a standard pattern for SSO implementations where server-side session management provides the security control rather than relying solely on cookie expiration. The browser retains the cookie, but FusionAuth enforces when that cookie is actually valid and usable for authentication.</p>
Related Documentation

<a href="https://fusionauth.io/docs/lifecycle/authenticate-users/logout-session-management#fusionauth-sso" rel="nofollow ugc">Logout and Session Management - FusionAuth SSO</a> - Comprehensive guide to how FusionAuth SSO sessions work
<a href="https://fusionauth.io/docs/lifecycle/authenticate-users/logout-session-management#session-timeouts-and-lifetime" rel="nofollow ugc">Session Timeouts and Lifetime</a> - Details on configuring and understanding SSO session timeouts at the tenant level
<a href="https://fusionauth.io/docs/lifecycle/authenticate-users/logout-session-management#types-of-session-management" rel="nofollow ugc">Types of Session Management</a> - Overview of different session types in FusionAuth
<a href="https://fusionauth.io/docs/reference/cookies#cookie-list" rel="nofollow ugc">Login Page Cookies Reference</a> - Documentation of all cookies set by FusionAuth hosted login pages

]]></description><link>https://fusionauth.io/community/forum/topic/3163/why-does-the-fusionauth-sso-cookie-have-a-68-year-max-age</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3163/why-does-the-fusionauth-sso-cookie-have-a-68-year-max-age</guid><dc:creator><![CDATA[FASupportBot]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Does FusionAuth support RFC 8693 token exchange for impersonation use cases?]]></title><description><![CDATA[<p dir="auto">Based on my research of the FusionAuth documentation, I need to provide an important correction to the draft answer. FusionAuth does <strong>not</strong> currently support RFC 8693 token exchange natively. Here's the improved answer:</p>

Answer
<p dir="auto"><strong>Important Clarification:</strong> FusionAuth does <strong>not</strong> currently support RFC 8693 token exchange natively. The draft answer contains inaccurate information that needs correction.</p>
<p dir="auto"><strong>Current RFC 8693 Status:</strong></p>

Native RFC 8693 token exchange is <strong>not implemented</strong> in FusionAuth
There is an <a href="https://github.com/FusionAuth/fusionauth-issues/issues/1471" rel="nofollow ugc">open GitHub issue (#1471)</a> tracking this feature request for implementing impersonation and delegation tokens according to RFC 8693
No confirmed ETA is available for this feature

<p dir="auto"><strong>Workarounds for Token Exchange and Impersonation:</strong></p>
<p dir="auto">While native RFC 8693 support is unavailable, FusionAuth offers alternative approaches:</p>
1. Vend JWT API for Delegation
<p dir="auto">You can use FusionAuth's <a href="https://fusionauth.io/docs/apis/jwt/vend-a-jwt" rel="nofollow ugc">Vend a JWT endpoint</a> to create custom tokens that include an act claim, following RFC 8693 delegation chain semantics:</p>
const response = await client.vendJWT({
  keyId: 'your-signing-key-id',
  timeToLiveInSeconds: 300,
  claims: {
    sub: 'coordinator-agent-entity-id',
    act: {
      sub: 'original-human-user-id'
    },
    permissions: ['read:documents']
  }
});

<p dir="auto">This approach provides delegation semantics where the original actor is tracked in the act claim.</p>
2. Impersonation Implementation
<p dir="auto">For pure impersonation (without delegation tracking), you can implement this at the API level:</p>

Create a backend endpoint (e.g., /api/impersonate/{id}) that verifies the requesting user is an admin
Use the <a href="https://fusionauth.io/docs/apis/jwt/vend-a-jwt" rel="nofollow ugc">Vend JWT API</a> to directly construct a token for the target user
Manage the impersonated session in your application

<p dir="auto"><strong>Note:</strong> Impersonation via the OAuth/OIDC workflow is not supported as it would conflict with the OAuth specification.</p>
3. Other Alternatives

Consolidate services under a single application registration
Alter the aud claim via a JWT lambda
Pass two separate JWTs in different headers (one for the service, one for the user)

<p dir="auto"><strong>Recommendation:</strong><br />
If standards-compliant RFC 8693 token exchange is a hard requirement for your migration, you may want to track or upvote the GitHub issue mentioned above. For immediate needs, evaluate whether the Vend JWT API workaround meets your delegation or impersonation requirements.</p>
Related Documentation

<a href="https://fusionauth.io/docs/apis/jwt/vend-a-jwt" rel="nofollow ugc">Vend a JWT API</a> - API for creating custom JWTs with specified claims
<a href="https://fusionauth.io/articles/oauth/complete-list-oauth-grants#oauth-20-token-exchange-grant" rel="nofollow ugc">OAuth 2.0 Grant Types - Token Exchange Grant</a> - Overview of RFC 8693 token exchange concept
<a href="https://github.com/FusionAuth/fusionauth-issues/issues/1471" rel="nofollow ugc">GitHub Issue #1471: Implement Impersonation and Delegation Tokens (RFC 8693)</a> - Open feature request
<a href="https://fusionauth.io/community/forum/topic/71/does-fusionauth-have-an-impersonation-feature">Forum: Does Fusionauth have an "impersonation" feature?</a> - Community discussion on impersonation approaches
<a href="https://fusionauth.io/community/forum/topic/2878/does-fusionauth-support-uma-grant-and-token-exchange-rfc-8693">Forum: Does FusionAuth Support UMA Grant and Token Exchange (RFC 8693)?</a> - Related community discussion

]]></description><link>https://fusionauth.io/community/forum/topic/3162/does-fusionauth-support-rfc-8693-token-exchange-for-impersonation-use-cases</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3162/does-fusionauth-support-rfc-8693-token-exchange-for-impersonation-use-cases</guid><dc:creator><![CDATA[FASupportBot]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Missing response_type parameter in Forgot Password flow with active MFA session]]></title><description><![CDATA[<p dir="auto">This appears to be a bug in how FusionAuth handles the OAuth flow during password reset when an active session exists.</p>
<p dir="auto"><strong>Root cause:</strong></p>
<p dir="auto">When a user clicks the password reset link from their email, the link doesn't include response_type=code in the URL. Normally, FusionAuth adds this parameter automatically during the OAuth flow.</p>
<p dir="auto">However, when the user already has an active login session in their browser (even though their MFA trust has expired), FusionAuth detects that session and takes a shortcut. Instead of starting a fresh OAuth flow where it would add response_type=code automatically, it attempts to reuse the existing session's OAuth state.</p>
<p dir="auto">This saved OAuth state is incomplete and missing the response_type parameter. When FusionAuth tries to redirect back to the application after MFA verification, it encounters an OAuth error because response_type was never included in the saved state.</p>
<p dir="auto"><strong>Temporary workaround:</strong></p>
<p dir="auto">Manually add response_type=code to the password reset URL until a proper fix is available. While this works, it's a band-aid solution.</p>
<p dir="auto"><strong>Status:</strong></p>
<p dir="auto">This issue appears to have been introduced in a version before 1.69.2 and may require a bug fix from the FusionAuth product team to properly handle OAuth state in password reset flows when active sessions are present. There's currently no tracking GitHub issue that I'm aware of.</p>
]]></description><link>https://fusionauth.io/community/forum/topic/3152/missing-response_type-parameter-in-forgot-password-flow-with-active-mfa-session</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3152/missing-response_type-parameter-in-forgot-password-flow-with-active-mfa-session</guid><dc:creator><![CDATA[FASupportBot]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[How to Restrict Username&#x2F;Password Login to a Single ‘Break Glass’ User in FusionAuth]]></title><description><![CDATA[<p dir="auto">Having only one user be able to log in with username/password is relatively straightforward with FusionAuth. You could use a Login Validation Lambda or transactional user.login.success Webhook to check the authentication type on each login, which will tell you if they are logging in via a specific Identity Provider or with a password then stop users from logging in based on that criteria. Then set it up so that only the break glass user is able to login with a password.</p>
<p dir="auto">The slightly trickier part here is only having the username/password field show up for that user. The only way to accomplish this with Simple Themes would be to have managed domains setup such that all normal users are directed to IdPs but the break glass user is on a separate domain so they get to see the login page. With managed domains, the login field changes just to email address for the first step. Then it will check the users email address against domains you have setup for specific IdPs and if they match a IdP then a user is directed straight to that IdP. Any user with a domain that does not match gets sent to the regular email/password login page.</p>


<p dir="auto"><a href="https://fusionauth.io/docs/extend/code/lambdas/login-validation" rel="nofollow ugc">https://fusionauth.io/docs/extend/code/lambdas/login-validation</a></p>


<p dir="auto"><a href="https://fusionauth.io/docs/extend/events-and-webhooks/events/user-login-success" rel="nofollow ugc">https://fusionauth.io/docs/extend/events-and-webhooks/events/user-login-success</a></p>


<p dir="auto"><a href="https://fusionauth.io/docs/lifecycle/authenticate-users/identity-providers/#managed-domains" rel="nofollow ugc">https://fusionauth.io/docs/lifecycle/authenticate-users/identity-providers/#managed-domains</a></p>


]]></description><link>https://fusionauth.io/community/forum/topic/3029/how-to-restrict-username-password-login-to-a-single-break-glass-user-in-fusionauth</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/3029/how-to-restrict-username-password-login-to-a-single-break-glass-user-in-fusionauth</guid><dc:creator><![CDATA[wesley]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Implementing Passwordless Registration with Magic Links in FusionAuth: Limitations and Workarounds]]></title><description><![CDATA[<p dir="auto">Your understanding is correct: in FusionAuth, a user account <strong>must have a password</strong> to exist, and the platform requires a password when creating a user. This means there’s currently <strong>no way to completely eliminate the password field</strong> from a registration form using Custom Registration Forms, nor is there a supported method to bypass the password requirement entirely.</p>
<p dir="auto">However, there’s a <strong>workaround</strong> if you’d like to simulate a passwordless experience. Using the <strong>Advanced Theme Editor</strong>, you can hide and automatically populate the password field on the registration page via JavaScript. This way, users won’t see or interact with the password field, but FusionAuth still receives a valid (though randomly generated) password value behind the scenes. To users, the experience feels passwordless, even though a hidden dummy password exists for each account.</p>
<p dir="auto">More details about customizing the registration page can be found here:<br />
<a href="https://fusionauth.io/docs/customize/look-and-feel/advanced-theme-editor" rel="nofollow ugc">Advanced Theme Editor Documentation</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/2986/implementing-passwordless-registration-with-magic-links-in-fusionauth-limitations-and-workarounds</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/2986/implementing-passwordless-registration-with-magic-links-in-fusionauth-limitations-and-workarounds</guid><dc:creator><![CDATA[wesley]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Does OAuth Token Refresh Count as a Login in FusionAuth Reports?]]></title><description><![CDATA[<p dir="auto">Yes, exchanging a refresh token for a new access token (<strong>JWT</strong>) <strong>does</strong> count as a login event in the <strong>Login</strong> report.</p>
<p dir="auto"><strong>Events That Count as a "Login"</strong>:</p>

A login is completed using any <strong>Login API</strong> (e.g., normal login, one-time login, passwordless login, Identity Provider login, or Connector-based login).
A user is created with a password (whether through self-service registration or the Registration API).
A refresh token is exchanged for a new JWT.
A user successfully completes a <strong>2FA login</strong>.

<p dir="auto">For more details, refer to:<br />
<a href="https://fusionauth.io/docs/get-started/core-concepts/users#what-makes-a-user-active" rel="nofollow ugc">What Makes a User Active?</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/2945/does-oauth-token-refresh-count-as-a-login-in-fusionauth-reports</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/2945/does-oauth-token-refresh-count-as-a-login-in-fusionauth-reports</guid><dc:creator><![CDATA[wesley]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Constructing a PKCE-Compliant Registration URL in FusionAuth]]></title><description><![CDATA[<p dir="auto">Yes, you can <strong>manually construct a registration URL</strong> that includes <strong>PKCE values</strong>.</p>
<p dir="auto"><strong>1. Understanding the Registration URL with PKCE</strong></p>
<p dir="auto">The <strong>/oauth2/register</strong> endpoint works similarly to the <strong>/oauth2/authorize</strong> endpoint but is used for user registration. Both support PKCE.<br />
<strong>Example URLs:</strong></p>

<strong>Standard Authorization URL:</strong>

https://your-fusionauth-instance/oauth2/authorize?
client_id=yourClientId&amp;
response_type=code&amp;
redirect_uri=https://yourapp.com/oauth-callback


<strong>Registration URL (Same Structure, Different Endpoint)</strong>:

https://your-fusionauth-instance/oauth2/register?
client_id=yourClientId&amp;
response_type=code&amp;
redirect_uri=https://yourapp.com/oauth-callback

<p dir="auto">Since PKCE is enabled, you must append <strong>PKCE parameters</strong>:</p>

<strong>code_challenge</strong> (derived from <strong>code_verifier</strong>)
<strong>code_challenge_method=S256</strong>

<p dir="auto"><strong>2. Generating PKCE Parameters</strong></p>
<p dir="auto">Your application must generate a <strong>code_verifier</strong> and <strong>code_challenge</strong> before redirecting to FusionAuth’s registration page.</p>
<p dir="auto"><strong>Node.js Example</strong>:</p>
const crypto = require('crypto');

function base64URLEncode(str) {
  return str.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
}

function sha256(buffer) {
  return crypto.createHash("sha256").update(buffer).digest();
}

function generateVerifier() {
  return base64URLEncode(crypto.randomBytes(32));
}

function generateChallenge(verifier) {
  return base64URLEncode(sha256(verifier));
}

// Generate PKCE values
const codeVerifier = generateVerifier();
const codeChallenge = generateChallenge(codeVerifier);

console.log("Code Verifier:", codeVerifier);
console.log("Code Challenge:", codeChallenge);

<p dir="auto"><strong>3. Constructing the Registration URL</strong></p>
<p dir="auto">Once you have the <strong>code challenge</strong>, construct the registration URL as follows:</p>
https://your-fusionauth-instance/oauth2/register?
client_id=yourClientId&amp;
response_type=code&amp;
redirect_uri=https://yourapp.com/oauth-callback&amp;
code_challenge=yourGeneratedCodeChallenge&amp;
code_challenge_method=S256

<p dir="auto"><strong>4. Completing the PKCE Flow After Registration</strong></p>
<p dir="auto">After the user completes registration, FusionAuth will <strong>redirect them to your app</strong> with an authorization code.<br />
Your app must then exchange this code for an <strong>access token</strong> by sending the <strong>code_verifier</strong> to <strong>/oauth2/token</strong>.</p>
<p dir="auto">For full details on the <strong>PKCE flow</strong>, see:</p>

<a href="https://fusionauth.io/blog/using-oauth-and-pkce-to-add-authentication-to-your-gatsby-site" rel="nofollow ugc">Using OAuth and PKCE with FusionAuth</a>

<p dir="auto"><strong>Summary</strong></p>

There’s no <strong>auto-generated</strong> PKCE registration URL, but you can manually construct one.
<strong>Generate the PKCE values</strong> before redirecting users to <strong>/oauth2/register</strong>.
<strong>Complete the PKCE flow</strong> by exchanging the authorization code with the <strong>code_verifier</strong>.

]]></description><link>https://fusionauth.io/community/forum/topic/2893/constructing-a-pkce-compliant-registration-url-in-fusionauth</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/2893/constructing-a-pkce-compliant-registration-url-in-fusionauth</guid><dc:creator><![CDATA[wesley]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Does OAuth Token Refresh Count as a Login in FusionAuth Reports?]]></title><description><![CDATA[<p dir="auto">Yes, exchanging a refresh token for a new access token (<strong>JWT</strong>) <strong>does</strong> count as a login event in the <strong>Login</strong> report.</p>
<p dir="auto"><strong>Events That Count as a "Login"</strong>:</p>

A login is completed using any <strong>Login API</strong> (e.g., normal login, one-time login, passwordless login, Identity Provider login, or Connector-based login).
A user is created with a password (whether through self-service registration or the Registration API).
A refresh token is exchanged for a new JWT.
A user successfully completes a <strong>2FA login</strong>.

<p dir="auto">For more details, refer to:<br />
<a href="https://fusionauth.io/docs/get-started/core-concepts/users#what-makes-a-user-active" rel="nofollow ugc">What Makes a User Active?</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/2867/does-oauth-token-refresh-count-as-a-login-in-fusionauth-reports</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/2867/does-oauth-token-refresh-count-as-a-login-in-fusionauth-reports</guid><dc:creator><![CDATA[wesley]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Save user address and return address (postal_code, street, number...) in OAuth token]]></title><description><![CDATA[<p dir="auto">Hi <a class="mention plugin-mentions-user plugin-mentions-a" href="https://fusionauth.io/community/forum/uid/1583">@vinicius-alfonso</a> !</p>
<p dir="auto">As documented here: <a href="https://fusionauth.io/docs/v1/tech/oauth/endpoints#userinfo" rel="nofollow ugc">https://fusionauth.io/docs/v1/tech/oauth/endpoints#userinfo</a> we don't provide the address info, even if you pass the address scope.</p>
<p dir="auto">Per the OpenID spec, section 5.4, it appears that supporting the address scope is optional: <a href="https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims" rel="nofollow ugc">https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims</a></p>
<p dir="auto">If this is important to you, please file an issue here: <a href="https://github.com/fusionauth/fusionauth-issues/issues" rel="nofollow ugc">https://github.com/fusionauth/fusionauth-issues/issues</a> with details about the use case.</p>
<p dir="auto">We are guided by our customers and community when it comes to implementation of issues. Here's our general roadmap guidance: <a href="https://fusionauth.io/docs/v1/tech/core-concepts/roadmap" rel="nofollow ugc">https://fusionauth.io/docs/v1/tech/core-concepts/roadmap</a></p>
]]></description><link>https://fusionauth.io/community/forum/topic/1727/save-user-address-and-return-address-postal_code-street-number-in-oauth-token</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1727/save-user-address-and-return-address-postal_code-street-number-in-oauth-token</guid><dc:creator><![CDATA[dan]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Pending Link strategy does not complete]]></title><description><![CDATA[<p dir="auto">Hi <a class="mention plugin-mentions-user plugin-mentions-a" href="https://fusionauth.io/community/forum/uid/1181">@chrissmueller328</a>,</p>
<p dir="auto">You will want to review our linking strategies.  When this occurs, oftentimes, this is due to custom mapping needed (you can see this in our discord doc).</p>

<a href="https://fusionauth.io/docs/v1/tech/identity-providers/#linking-strategy-examples" rel="nofollow ugc">https://fusionauth.io/docs/v1/tech/identity-providers/#linking-strategy-examples</a>

<p dir="auto">The event log is another great place to look to see how your user is or is not being linked/created.</p>
<p dir="auto">You can also look at our doc for discord as an IDP</p>

<a href="https://fusionauth.io/docs/v1/tech/identity-providers/openid-connect/discord" rel="nofollow ugc">https://fusionauth.io/docs/v1/tech/identity-providers/openid-connect/discord</a>

<p dir="auto">Hope this helps!<br />
Josh</p>
]]></description><link>https://fusionauth.io/community/forum/topic/1551/pending-link-strategy-does-not-complete</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1551/pending-link-strategy-does-not-complete</guid><dc:creator><![CDATA[joshua]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[How to enable Forgot Password Feature]]></title><description><![CDATA[<p dir="auto"><a class="mention plugin-mentions-user plugin-mentions-a" href="https://fusionauth.io/community/forum/uid/1415">@falk-jaeger</a><br />
I figured out where to configure the 'Forgot Password Feature. You have to set a template to the 'Forgot Password' Field in the Email settings of the Tennant.</p>
<p dir="auto">44545473-38b0-41a8-a6ab-e581c7bd04b2-image.png</p>
]]></description><link>https://fusionauth.io/community/forum/topic/1522/how-to-enable-forgot-password-feature</link><guid isPermaLink="true">https://fusionauth.io/community/forum/topic/1522/how-to-enable-forgot-password-feature</guid><dc:creator><![CDATA[falk.jaeger]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>