Fixing Backstage sign-in errors

Backstage sign-in failures usually come from a provider that is not wired into the auth config, a resolver that cannot match a user to a catalog entity, or missing org data. This page shows how to tell them apart and fix each one.

On this page

Why Backstage sign-in errors happen and when to fix them first

Most Backstage sign-in errors come from configuration that does not match across three places: the auth provider, the sign-in resolver and the software catalog. When the provider returns one identity shape, the resolver looks for a different one, or the catalog holds no User entity that matches, the portal either refuses sign-in with a "not configured to support sign-in" message or signs the user in without a usable identity. Backstage ships 19 built-in authentication providers, including GitHub, GitLab, Google, Azure, Okta, Auth0 and generic OIDC, and each one has its own resolver options. That breadth is useful, but it also means the mismatch can start with any of them. You will want to pick one provider for workforce sign-in and confirm which claim or username it returns before writing any resolver logic.

The Backstage authentication documentation advises configuring resolvers so that every provider resolves to the same identity, and it advises against offering guest access in production. Guest sign-in is convenient in a development sandbox, but once it is enabled in a shared environment, users may reach the portal without a real identity, which makes ownership, permissions and audit trails unreliable. Decide early whether guest access is off in the production configuration, and confirm that a non-production override does not reach production by accident. Ask your platform team to show you where each environment's configuration file comes from and which values are secrets.

Fix these issues before you onboard teams, not after. A sign-in failure found during a pilot is cheap to correct, but one found after a company-wide announcement becomes a support queue, and a resolver that mis-maps identities can attach users to the wrong owner records. Plan a short test with a few accounts from each provider, confirm that each one lands on the expected catalog user, and check the result with config:check before each deployment. Your partner or internal team should record the provider, resolver and catalog mapping decisions in writing, so that a later upgrade does not silently change them.

Diagnosing 'not configured to support sign-in' and 'unable to resolve user identity'

What does 'not configured to support sign-in' mean in Backstage?

It means the frontend asked for a sign-in method that the backend has no provider configured for. The usual cause is that the provider is missing from the auth configuration, or the sign-in page lists a provider that was renamed or removed. Check the auth section of app-config.yaml and app-config.production.yaml for a providers block with the provider ID the login page requests. Add the provider under auth.providers with its client settings, restart the backend, and confirm the sign-in page only offers providers that exist. Keep the provider key identical in the frontend sign-in component and the backend configuration, because a mismatch produces the same message. The Backstage authentication documentation describes the provider configuration structure for each supported identity provider.

Why does Backstage say it cannot resolve user identity after I sign in?

The provider authenticated the user, but no sign-in resolver turned that result into a Backstage identity. Backstage needs a resolver for each provider that maps the external profile to a User entity in the catalog. Without a resolver, or with one that throws, sign-in fails at this step. Check the backend logs for the resolver error at the time of sign-in, and check the provider block under auth.providers.<provider>.<environment> for a signIn.resolvers entry. Add a resolver that matches the provider's claims, such as the email or username, to a catalog user. Then sign in again with a clean browser session so the old failed attempt does not stay cached. The exact log text varies by provider and version, so confirm the wording in your own logs rather than relying on a copied string.

How do I fix a sign-in resolver that cannot find a matching User entity?

The resolver ran, but the identifier it built, such as an email or username, does not match any User entity in the catalog. Compare the value the resolver produces with the metadata.name or spec.profile.email on the User entity. Common mismatches include different casing, a domain suffix that the directory adds or drops, or a username format that differs between the identity provider and the catalog source. Fix the mismatch in the resolver logic or in the entity source so both use the same key. The authentication documentation advises that every provider resolves to the same identity, so a single agreed key across providers avoids a second class of mismatch. Test the resolver with a known user before rolling it out to everyone.

Why does sign-in fail for users who exist in my directory but not in Backstage?

Backstage resolves identity against User entities that the catalog has already ingested, so a directory user who has not been imported yet has nothing to match. This is a timing and ingestion problem, not a provider problem. Check that the catalog provider for your directory is configured under the catalog section, that it has run, and that the users it imports are within the scope you intended, such as the right group or organization. Look at the catalog processing results for the entity to see whether ingestion failed. Once the user entity exists and processing completes, retry the sign-in. The Backstage architecture overview explains how the catalog fits into the backend, which helps when tracing where a user entity is expected to come from.

What if the frontend still points at guest access or a removed provider?

A frontend that still offers guest sign-in or a provider you removed will send users into a flow the backend no longer supports. Guest access is useful for local development, but the authentication documentation advises against offering it in production. Search the frontend for the sign-in provider list and any guest provider entry, and remove the entries that the backend does not serve. Then rebuild the frontend, because sign-in pages are compiled into the bundle and a config change alone may not update them in every setup. Confirm that the production build no longer offers guest access, and that users landing on the sign-in page see only supported providers.

How do I check the auth configuration before deploying a fix?

Run configuration validation against the same environment files you deploy, so errors surface before users see them. The config:check command in the Backstage CLI reads the configuration and reports values that do not match the schemas that plugins declare. Run it with the production configuration file included, and use --strict in CI so warnings fail the build. Keep provider secrets in environment variables or a secrets store rather than in committed files, and confirm the variables are set in the target environment. Validation catches structural and type errors, but it does not prove that the provider accepts your client settings or that a resolver matches real users, so test sign-in in a non-production environment after the check passes.

Can my own team fix sign-in errors, or do we need a partner?

Your team can usually diagnose and fix sign-in errors with access to the backend logs, the configuration files, and the identity provider's admin console. The work is mostly reading configuration, matching identifiers, and testing one provider at a time. A partner adds value when the identity design spans several providers, when a directory sync or catalog ingestion must be redesigned, or when the change needs to be documented as evidence for a compliance review. DeployOpen implements and documents self-hosted open-source platforms in infrastructure you control, and its work is agreed in a written, fixed scope before it starts. Ask for a quote based on the providers, environments and resolver logic in question.

Resolver mismatches across multiple providers

With one provider, the resolver mapping is simple, but it still determines which User entity each sign-in attaches to. Choose the claim that is stable and unique in your directory, most often the email address for corporate identity providers, and make the resolver look up the matching User entity in the catalog rather than creating an unrelated identity. Confirm the claim with a real sign-in before you rely on it, because the claim your provider sends may differ from what the documentation for another provider suggests.

  • Pick one claim: Use the email claim or the username claim, not both, and write the choice down so later providers follow it.
  • Match the catalog: The resolved name or email must match the metadata.name or the email annotation on an existing User entity, or sign-in fails with the "unable to resolve user identity" message.
  • Check the org data: Confirm the User entity exists and that its group membership is ingested, since ownership and group-based access depend on it.
  • Remove guest access: Guest sign-in in production skips the resolver entirely, so disable it once real providers work.
  • Run config:check: Validate the auth block with config:check before deploying the resolver change.

After the change, sign in with a test account, open its profile, and confirm the entity reference shown matches the User entity you expect.

Fixing sign-in step by step

This sequence moves from confirming that your organization data reached the catalog to proving a single sign-in resolves to the right catalog user, and only then removing guest access. Each step closes with a check you can record before moving on.

  1. Confirm User and Group entities exist in the catalog

    Start by checking that the catalog holds User and Group entities from your organization data source, such as your identity directory or Git-based org files. Someone on the platform team should open the catalog, filter by kind, and confirm that the people and teams who will sign in appear with the expected names and memberships. If the lists are empty or partial, fix ingestion first, because a resolver can only match a user to a catalog entity that already exists. The step is done when a known test user and their group appear as entities in the catalog.

  2. Verify the provider block for the environment

    Next, confirm that the environment you are testing has a sign-in provider block under the auth section of its app-config file, and that the provider's client ID, client secret and callback settings are read from environment variables rather than committed values. Compare the block against the provider's own setup in the Backstage authentication documentation so the provider key and environment names match exactly. The step is done when the backend starts without auth configuration errors and the provider appears on the sign-in page in that environment.

  3. Set or correct the sign-in resolver

    Configure a sign-in resolver for the provider so each sign-in maps to exactly one catalog user, typically by matching a stable identifier such as the email address or the username claim your provider returns. The Backstage authentication documentation advises that every provider resolves to the same identity, so if you use more than one provider, make sure they resolve to the same user entity for the same person. Record which resolver and identifier you chose and why. The step is done when the resolver config is committed and a config check reports no errors for the auth section.

  4. Test one sign-in in a non-production environment

    Have one tester, ideally someone whose catalog entry you already confirmed, sign in through the provider in a non-production environment. Watch the backend logs during the attempt. If you see a message that the provider is not configured to support sign-in, the provider key or resolver is missing from that environment's config. If you see that the identity cannot be resolved, the claim the resolver uses does not match any catalog user. The step is done when the tester reaches the portal home page as their own catalog user without errors in the log.

  5. Check the resolved identity in the catalog

    After a successful sign-in, confirm that the session belongs to the expected entity. Open the user's profile in the portal and compare the displayed name, email and group memberships against the User entity in the catalog. Mismatched groups usually mean the Group entities were not ingested or the user's membership relation is missing from the source data. Compare the identity claims your provider returns with the fields your resolver reads, since a field that is empty or differently cased will fail to match. The step is done when the profile, the catalog entity and the group memberships all agree for the test user.

  6. Repeat the test for each provider and role

    Repeat the single sign-in test for every provider that is enabled and for at least one user from each group whose access you plan to rely on. Confirm that the same person resolves to the same catalog user regardless of which provider they use. Recheck the backend log after each attempt. Keep a short record of the users, providers and results so the team can show what was tested. The step is done when every enabled provider and tested role resolves without errors.

  7. Remove guest access before production

    Once sign-in resolves correctly in non-production, turn off guest access in the production configuration, since the Backstage authentication documentation advises against offering it there. Deploy the change to production, then confirm that an unauthenticated visitor cannot reach the portal and that a signed-in organization user can. Confirm the setting in your production config and check the production deployment's sign-in page once. The step is done when production shows only the organization provider and the unauthenticated check fails as expected.

Configuration options and when each fits

This table compares the sign-in resolver approaches, guest access and identity claim choices that determine how a Backstage user is matched to a catalog entity. Read each row against your identity provider and your production policy. The main takeaway is that every provider should resolve to the same identity, and guest access belongs only in non-production environments.

OptionWhat it doesWhen it fitsTrade-off
Email match resolverMatches the signed-in user's email claim to a User entity in the catalogOrganizations where every provider shares a reliable, unique email and the catalog stores that email on each userFails when email is missing from the provider token, changes, or differs in case or alias between providers
Username match resolverMatches the provider username to the catalog User entity nameSingle provider setups where usernames match catalog entity names and are stable over timeUsernames often differ between providers, so a second provider can resolve to a different or missing identity
Custom resolverRuns your own logic to map provider claims to a catalog user, such as a lookup against org dataMulti-provider setups that need one canonical identity, or claims that do not match a simple ruleYour team owns the mapping code and its tests, and mistakes can grant access to the wrong catalog user
Guest accessSigns users in without an identity provider and assigns a generic guest identityLocal development and evaluation environments onlyGives no per-user audit trail or authorization, so the authentication documentation advises against it in production
Subject or identifier claimUses the stable user identifier from the provider token as the lookup keyProviders where the subject claim is stable and the catalog stores a matching identifierThe identifier must be mapped into catalog metadata, so catalog data and provider data must be kept in step
Email or profile claimUses a human-readable claim such as email or display name from the provider profileProviders that expose email reliably and where the catalog is populated from the same directoryHuman-readable values can change or collide, so confirm uniqueness before relying on them
Organization data sourcePopulates User and Group entities from a directory so resolvers have something to matchAny production setup where users must exist in the catalog before they can sign inWithout this data the resolver reports that it cannot find a user, even when the provider login succeeds

Checking configuration with config:check before users hit it

Run yarn backstage-cli config:check against your app-config files before any deploy, because a malformed auth block is one of the quickest ways to stop every user from signing in. The command loads the configuration the way the backend does and reports values that do not match the schemas declared by the core packages and by each plugin. Auth providers are a good example of why this matters: a misspelled key under a provider, a missing clientId or a resolver entry that does not match the provider's shape can surface here as a schema error before the backend ever starts. Add --strict in your CI pipeline so that warnings fail the build as well as hard errors. Confirm the exact flags and behavior for your Backstage version in the project's documentation, because the command's options can change between releases.

Treat the check as a gate on the same files your production deploy uses, not on a developer's local copy. Keep the shared configuration in app-config.yaml with no secrets, put environment-specific values in files such as app-config.production.yaml, and reference client secrets and signing keys through environment variables with ${VAR_NAME} substitution. Run the check with the same set of --config files your container starts with, or the result will not match what runs in production. Credentials for the identity provider belong in your secrets manager and are injected at runtime, so they never appear in Git history. Ask whoever owns the identity provider to confirm which values are secret and which are safe to commit, and make sure your CI job can read the environment variables it needs without printing them in logs.

The check validates structure and types, not whether the identity provider accepts your client, whether a redirect URL is registered, or whether a resolver will find a matching user in the catalog. A configuration that passes config:check --strict can still fail at sign-in with an identity resolution error, so pair the check with a manual sign-in test in a staging environment that uses the same provider app and callback URL as production. Record which plugin packages contribute schemas in your installation, since a provider whose package is not installed will not be validated by its own schema. Confirm with your platform team how the check fits your pipeline, which environment variables CI needs, and who reviews changes to the auth block before they merge.

Security points to check while fixing sign-in

Sign-in fixes often change who can reach your portal and what they can do once inside. The checks below cover guest access, identity resolution, secret handling, audit visibility and patching, so a change that clears an error does not weaken access.

Guest access in production

Guest sign-in is a convenience for development, and the Backstage authentication documentation advises against offering it in production. When you clear a 'not configured to support sign-in' error, check that no guest provider is still registered in the production app-config.production.yaml or in a shared base file. Confirm that every user reaching the portal passes through your identity provider, and that the build for production does not pick up development-only provider blocks.

Over-broad sign-in resolvers

A resolver maps a provider identity to a catalog user. If it falls back to creating or matching users loosely, any account the provider accepts may end up with the rights of an existing owner or admin. The authentication documentation advises resolving every provider to the same identity. Review each resolver against your directory, confirm it matches on a stable identifier, and test with a user who should have no elevated access.

Shared secrets in committed config

Fixing sign-in usually means editing client IDs, client secrets and signing keys in config files. Keep secrets out of Git and load them from environment variables or your secret store at runtime. Check the history of the repository as well as the current branch, because a secret committed during debugging stays exposed. Rotate any value that was ever pasted into a shared file, and run yarn backstage-cli config:check with the production configuration to confirm the expected values are read from the environment.

Audit logging of sign-in events

When a user reports that sign-in suddenly works for the wrong people, you need a record of who signed in, through which provider and which identity they resolved to. Decide where authentication events go before you change resolvers, and make sure those logs reach your central log platform. Without them, a resolver mistake leaves no trail to reconstruct. Ask your team which events are captured by default in your version and which need custom logging.

Auth packages patched through upgrades

Authentication code changes with the framework, so a sign-in fix made on an old release can miss later security corrections. The versioning policy says high and critical vulnerabilities are backported to releases from the last 6 months where feasible. Keep your release close enough to the supported line to receive those fixes, and move all @backstage packages together with yarn backstage-cli versions:bump so authentication modules do not drift from core.

Questions teams ask before fixing sign-in themselves

How long does a typical Backstage sign-in fix take?

No fixed duration can be given before the environment is reviewed, because the time depends on how many identity providers are involved, how cleanly user records map to catalog entities, and whether the fix needs changes in the identity provider itself. A single provider with a clear user identifier and an existing org model usually needs far less work than a setup with several providers, legacy guest access, or a catalog that has never been populated from the directory. Ask for a written scope that lists each provider, each resolver, and each environment (development, staging, production) so the timeline follows from that list.

Can our internal team fix Backstage sign-in errors without outside help?

Yes, a team that already runs Backstage and understands its identity provider can usually resolve these errors itself, provided it has time to read the authentication configuration and test changes outside production. The errors are often caused by a resolver that does not match what the provider returns, or by a catalog that does not contain the user, and both are traceable in logs and configuration. Outside help is most useful when several providers must resolve to one identity, when the team lacks admin rights in the identity provider, or when a production outage needs a fix under time pressure.

What access and data does a sign-in fix require from our side?

The work needs a named contact who can approve changes, read-only or admin access to the identity provider for the applications Backstage uses, a copy of the current app configuration with secrets removed, and access to the catalog data that describes users and groups. A non-production test tenant or staging instance of the identity provider is strongly preferred, so that resolver changes can be tested without affecting staff who sign in today. Confirm with your identity team which app registrations, client identifiers and claim settings can be shared and under what conditions before any access is granted.

Are sign-in fixes a one-time job or ongoing work?

The initial fix is one-time work, but some of its parts recur. Each new identity provider, each change to how users are named in the directory, and each Backstage upgrade can change the claims a resolver receives, so the configuration needs checking after those events. Routine checks with configuration validation in CI, and a documented list of which resolver serves which provider, reduce the chance of a repeat failure. Ask whether the quote includes handover documentation and whether you want ongoing support through a retainer for upgrades and provider changes.

What cost components make up a sign-in fix quote?

A quote is built from the written scope, and its main components are analysis of the current configuration, changes to Backstage authentication and resolver code, changes to identity provider settings if you allow them, testing in a non-production environment, and documentation with handover. Costs rise with the number of providers, the number of environments, and the complexity of the catalog mapping. Ask each vendor, including DeployOpen, to itemize these components so you can compare scope rather than headline totals. DeployOpen does not publish a price list, and a quote follows from the agreed scope.

What does a fixed-scope sign-in engagement cover?

A fixed-scope engagement covers the agreed set of sign-in problems, the named identity providers and environments, the resolver changes needed to fix them, verification steps, and the documentation that records the final state. Most engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts. Anything outside that list, such as a new provider, a redesign of the catalog model, or unrelated scaffolder failures, would be scoped separately. Ask for the list of deliverables and the acceptance checks in writing before signing.

How do we confirm a sign-in fix is safe to run in production?

Confirm it by running the same sign-in flows in a non-production instance that mirrors the production authentication configuration, then checking the configuration with config:check --strict before deploy. Verify that each provider resolves to the same catalog user, that guest access is disabled in production, and that a user missing from the catalog receives a clear error instead of a broken session. Ask your team to record the test accounts, expected outcomes and rollback steps before the change window opens.

How DeployOpen works on this

DeployOpen approaches sign-in fixes as a planned piece of work inside your own infrastructure. We start from your identity provider, your resolver rules and your catalog data, then agree a written scope before changing anything. Each step leaves configuration, checks and notes your team can reuse.

How we scope

  • Review your current app-config.yaml auth section, provider settings and the exact error text users see
  • Map which identity provider, user directory and catalog user entities must match before resolvers are changed
  • Agree in writing which environments, providers and resolvers are in scope, with engagements fixed-scope

How we build

  • Correct resolver logic so every configured provider maps to the same catalog identity, and remove guest access from production
  • Run config:check against each environment file and confirm secrets are supplied from the environment, not committed
  • Test sign-in end to end for each provider, including users with missing org data, before the change is promoted

How we hand over

  • Document the final auth configuration, resolver mapping and the reason each provider resolves to its identity
  • Provide a troubleshooting runbook that lists the common error messages, their causes and the checks that confirm each fix
  • Walk your platform and security team through the configuration and the test results so they can repeat the checks

How we support

  • Ongoing support, upgrades and continuous testing are available as a retainer after handover
  • Review resolver and provider changes when Backstage versions are bumped, using your agreed test cases
  • Confirm current provider behavior and upgrade notes with the vendor or project before relying on them

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.