How to fix auth/missing-continue-uri: Valid continue URL must be provided in Firebase

FirebaseINTERMEDIATEMEDIUMUpdated Dec 22, 2025· 227 views

This Firebase Authentication error occurs when email action handlers (password reset, email verification) are called without a valid continue URL. The continue URL redirects users after completing the action and must be properly configured in your Firebase project settings and API calls.

Quick fix

Fixes auth/missing-continue-uri: Valid continue URL must be provided

// Firebase Web SDK v9+
import { getAuth, sendPasswordResetEmail } from "firebase/auth";

const auth = getAuth();
const actionCodeSettings = {
  url: 'https://yourapp.com/reset-password-complete', // Your continue URL
  handleCodeInApp: false // Set to true if using mobile app
};

sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings)
  .then(() => {
    console.log('Password reset email sent');
  })
  .catch((error) => {
    console.error('Error:', error);
  });
  1. Add continueUrl parameter to your Firebase Authentication calls
  2. Configure authorized domains in Firebase Console
  3. Fix Firebase Admin SDK configuration
  4. Validate your continue URL format
firebase — error
// Firebase Web SDK v9+
import { getAuth, sendPasswordResetEmail } from "firebase/auth";
const auth = getAuth();
const actionCodeSettings = {
url: 'https://yourapp.com/reset-password-complete', // Your continue URL
handleCodeInApp: false // Set to true if using mobile app
};
sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings)
.then(() => {
console.log('Password reset email sent');
})
.catch((error) => {
console.error('Error:', error);
});
auth/missing-continue-uri: Valid continue URL must be provided

What this error means

The "auth/missing-continue-uri" error is a Firebase Authentication error that occurs when you're trying to send an email action (like password reset, email verification, or email change) but haven't provided a valid "continue URL" parameter. In Firebase Authentication, when users click links in password reset or email verification emails, they need to be redirected back to your application after completing the action. The continue URL specifies where they should be redirected. This error happens when: 1. You're calling Firebase Authentication methods (sendPasswordResetEmail, sendEmailVerification, etc.) without providing a continue URL parameter 2. The continue URL you provided is invalid, malformed, or not authorized in your Firebase project settings 3. You're using Firebase Admin SDK without proper URL configuration The error prevents the email from being sent because Firebase needs to know where to redirect users after they complete the action in their email client.

Typical symptoms

  • Firebase Authentication methods throw 'auth/missing-continue-uri' error
  • Password reset emails fail to send with 'Valid continue URL must be provided' error
  • Email verification links don't work and return authentication errors
  • Firebase Admin SDK operations fail when trying to send email actions
  • Error occurs specifically when calling sendPasswordResetEmail(), sendEmailVerification(), or similar methods
  • Console shows Firebase error with code 'auth/missing-continue-uri'

Common causes

  1. Missing continueUrl parameter in Firebase client SDK method calls
  2. Continue URL not properly configured in Firebase Console authorized domains
  3. Using Firebase Admin SDK without setting actionCodeSettings.continueUrl
  4. Invalid URL format (missing protocol, incorrect domain, etc.)
  5. Continue URL points to a domain not authorized in Firebase project settings
  6. Using localhost or non-HTTPS URLs in production Firebase project
  7. Firebase project configured with restrictive URL whitelist that doesn't include your continue URL

How to fix "auth/missing-continue-uri: Valid continue URL must be provided"

1Add continueUrl parameter to your Firebase Authentication calls

When calling Firebase Authentication methods that send emails, you must provide a continueUrl in the actionCodeSettings parameter:

javascript
// Firebase Web SDK v9+
import { getAuth, sendPasswordResetEmail } from "firebase/auth";

const auth = getAuth();
const actionCodeSettings = {
  url: 'https://yourapp.com/reset-password-complete', // Your continue URL
  handleCodeInApp: false // Set to true if using mobile app
};

sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings)
  .then(() => {
    console.log('Password reset email sent');
  })
  .catch((error) => {
    console.error('Error:', error);
  });

For email verification:

javascript
import { getAuth, sendEmailVerification } from "firebase/auth";

const auth = getAuth();
const user = auth.currentUser;
const actionCodeSettings = {
  url: 'https://yourapp.com/email-verified'
};

sendEmailVerification(user, actionCodeSettings)
  .then(() => {
    console.log('Verification email sent');
  });
2Configure authorized domains in Firebase Console

The continue URL's domain must be authorized in your Firebase project:

1. Go to Firebase Console (console.firebase.google.com)
2. Select your project
3. Navigate to Authentication → Settings
4. Under "Authorized domains", add your domain:
- For web apps: Add your production domain (e.g., yourapp.com)
- For development: Add localhost
- For mobile apps with deep links: Configure your app's URL scheme

bash
Authorized domains:
- yourapp.com
- localhost
- yourapp.page.link (for Firebase Dynamic Links)

Without proper authorization, Firebase will reject the continue URL.

3Fix Firebase Admin SDK configuration

If using Firebase Admin SDK (Node.js, Python, etc.), ensure you're passing actionCodeSettings with continueUrl:

javascript
// Firebase Admin SDK for Node.js
const admin = require('firebase-admin');

const actionCodeSettings = {
  url: 'https://yourapp.com/reset-password-complete',
  handleCodeInApp: false
};

admin.auth()
  .generatePasswordResetLink('user@example.com', actionCodeSettings)
  .then((link) => {
    // Send custom email with this link
    console.log('Password reset link:', link);
  })
  .catch((error) => {
    console.error('Error generating link:', error);
  });

For email verification links:

javascript
admin.auth()
  .generateEmailVerificationLink('user@example.com', actionCodeSettings)
  .then((link) => {
    // Send custom verification email
  });
4Validate your continue URL format

Ensure your continue URL follows these requirements:

1. Valid URL format: Must start with http:// or https://
2. Authorized domain: Domain must be in Firebase Console authorized domains
3. No fragments: Should not contain #fragment identifiers
4. Proper encoding: URL parameters must be properly encoded

javascript
// ✅ Valid URLs
'https://yourapp.com/reset-password'
'https://yourapp.com/verify-email?userId=123'
'http://localhost:3000/auth-callback'

// ❌ Invalid URLs
'/reset-password' // Missing protocol and domain
'yourapp.com/reset-password' // Missing protocol
'https://yourapp.com/#/reset' // Contains fragment
'https://unauthorized-domain.com/reset' // Domain not authorized

Test with a simple URL first, then add query parameters if needed.

5Handle localhost and development environments

For development, you need to configure Firebase to accept localhost URLs:

1. Add localhost to authorized domains in Firebase Console
2. Use proper localhost URL in your code:

javascript
// Development configuration
const isDevelopment = process.env.NODE_ENV === 'development';

const actionCodeSettings = {
  url: isDevelopment
    ? 'http://localhost:3000/reset-password-complete'
    : 'https://yourapp.com/reset-password-complete',
  handleCodeInApp: false
};

3. For mobile app deep links, configure your app's URL scheme:

javascript
// iOS/Android deep link configuration
const actionCodeSettings = {
  url: 'yourapp://reset-password',
  handleCodeInApp: true, // Important for mobile apps
  dynamicLinkDomain: 'yourapp.page.link' // For Firebase Dynamic Links
};
6Test and debug the complete flow

Create a test script to verify your configuration works:

javascript
// Test script for password reset
async function testPasswordReset() {
  try {
    const auth = getAuth();
    const actionCodeSettings = {
      url: 'https://yourapp.com/reset-password-complete',
      handleCodeInApp: false
    };

    await sendPasswordResetEmail(auth, 'test@example.com', actionCodeSettings);
    console.log('✅ Test passed: Email sent successfully');

    // Check Firebase Console logs
    console.log('Check Firebase Console → Authentication → Users for email status');

  } catch (error) {
    console.error('❌ Test failed:', error.code, error.message);

    // Common error codes:
    // - auth/missing-continue-uri: Continue URL missing
    // - auth/invalid-continue-uri: URL invalid or unauthorized
    // - auth/unauthorized-continue-uri: Domain not authorized
  }
}

testPasswordReset();

Monitor Firebase Console → Authentication → Users to see if emails are being sent successfully.

Advanced notes

### Understanding Firebase Action URLs

Firebase Authentication generates special action URLs for email operations. These URLs contain:
- Action type (resetPassword, verifyEmail, recoverEmail)
- User identifier
- One-time code
- Continue URL for redirection

When a user clicks the link in their email, Firebase:
1. Validates the one-time code
2. Performs the action (resets password, verifies email)
3. Redirects to your continue URL with success/failure parameters

### Security Considerations

1. URL validation: Firebase validates continue URLs against authorized domains to prevent phishing attacks
2. One-time codes: Action links contain time-limited, single-use codes
3. State preservation: The continue URL can include state parameters (encoded in the link) to restore user session

### Custom Email Templates

When using Firebase Admin SDK to generate links, you can send custom email templates:

javascript
// Generate link with Admin SDK
const resetLink = await admin.auth().generatePasswordResetLink(
  'user@example.com',
  { url: 'https://yourapp.com/reset-complete' }
);

// Send custom email
await sendCustomEmail({
  to: 'user@example.com',
  subject: 'Reset your password',
  html: `<a href="${resetLink}">Click here to reset password</a>`
});

### Firebase Dynamic Links Integration

For mobile apps, use Firebase Dynamic Links to handle the redirect:

javascript
const actionCodeSettings = {
  url: 'https://yourapp.page.link/reset',
  handleCodeInApp: true,
  dynamicLinkDomain: 'yourapp.page.link',
  ios: { bundleId: 'com.yourapp.ios' },
  android: {
    packageName: 'com.yourapp.android',
    installApp: true,
    minimumVersion: '12'
  }
};

This creates a Dynamic Link that opens your mobile app directly.

Frequently asked questions

What does "auth/missing-continue-uri: Valid continue URL must be provided" mean?
The "auth/missing-continue-uri" error is a Firebase Authentication error that occurs when you're trying to send an email action (like password reset, email verification, or email change) but haven't provided a valid "continue URL" parameter. In Firebase Authentication, when users click links in password reset or email verification emails, they need to be redirected back to your application after completing the action. The continue URL specifies where they should be redirected.
How do I fix "auth/missing-continue-uri: Valid continue URL must be provided"?
This Firebase Authentication error occurs when email action handlers (password reset, email verification) are called without a valid continue URL. The continue URL redirects users after completing the action and must be properly configured in your Firebase project settings and API calls.
What causes "auth/missing-continue-uri: Valid continue URL must be provided"?
Missing continueUrl parameter in Firebase client SDK method calls Continue URL not properly configured in Firebase Console authorized domains Using Firebase Admin SDK without setting actionCodeSettings.continueUrl
Is the "auth/missing-continue-uri: Valid continue URL must be provided" error serious?
It is a medium-severity error — more of a blocker than a risk. The steps above resolve it.

Official resources & further reading