Connect an Application with SSO

Use this guide when an application speaks OpenID Connect and you want FerrisKey to handle sign-in.

By the end you will have:

  • One FerrisKey realm dedicated to the application or organization
  • One OpenID Connect client
  • A client ID and client secret
  • The redirect URI registered in FerrisKey
  • The issuer URL and discovery endpoint your application needs

Before you start

Before opening FerrisKey, find these values in the application you want to connect:

ValueExample
Application URLhttps://vault.example.com
Callback or redirect URIhttps://vault.example.com/identity/connect/oidc-signin
Required scopesopenid profile email

Use the application's exact callback URL

The redirect URI must match what the application sends during login. If the application says the callback is /identity/connect/oidc-signin, do not replace it with the application homepage.

Example values

The walkthrough uses these values. Replace them with your own domains and realm name.

SettingValue
FerrisKey URLhttps://sso.example.com
Realmhome
Client IDvaultwarden
Application URLhttps://vault.example.com
Redirect URIhttps://vault.example.com/identity/connect/oidc-signin
Scopesopenid profile email

Create or select the realm

A realm keeps users, clients, roles, and scopes together. Avoid using master for applications.

Open the realm selector

Click the realm name in the top bar, next to the FerrisKey logo. Pick the realm that will own this application, or Create realm if you need a new one. The selector is searchable, which matters once a deployment holds more than a handful.

FerrisKey realm selector open in the top bar, listing the realms and the Create realm actionFerrisKey realm selector open in the top bar, listing the realms and the Create realm action

Stay in the application realm

After switching, check the realm indicator before creating the client. The client will be created in the realm currently selected in the dashboard.

Create the client

The client is the application entry in FerrisKey. It tells FerrisKey which app is asking users to sign in.

Open Clients

In the sidebar, click Clients, then New client.

FerrisKey clients list with counters for total, active, public and confidential clients, and the New client buttonFerrisKey clients list with counters for total, active, public and confidential clients, and the New client button

The banner at the top of that list is worth reading before you add anything: it names every client that has no redirect URI, because the authorization code flow cannot work without one.

Choose the protocol

Creation starts by asking which protocol the application speaks: OpenID Connect for anything token-based, or SAML 2.0 for applications that speak nothing else.

FerrisKey client protocol dialog offering OpenID Connect or SAML 2.0FerrisKey client protocol dialog offering OpenID Connect or SAML 2.0

This choice is final

It decides how the application signs its users in and cannot be changed after creation. An application that later moves from SAML to OIDC needs a new client, not an edited one. See Authentication for what each protocol gives you.

:::

Fill the client details

Use a stable client ID. In this example:

  • Client ID: vaultwarden
  • Name: Vaultwarden
  • Client enabled: Enabled
  • Client authentication: Confidential

Client authentication is a choice between Confidential and Public, and it is also final. Pick Confidential for a server-side application that can hold a secret — FerrisKey then generates one. Pick Public for an SPA, a mobile app or a CLI, where a secret would end up in the user’s hands and PKCE carries the protection instead.

Leave both capability switches off for browser SSO: Direct access grants is the deprecated password grant, and the device authorization grant is for browserless clients.

FerrisKey new client form with client ID, name, enabled state, the confidential/public choice and the capability switchesFerrisKey new client form with client ID, name, enabled state, the confidential/public choice and the capability switches

Configure the redirect URI

The redirect URI is where FerrisKey sends the browser after a successful login.

Open the client settings

Open the client you just created and stay on the Settings tab.

Add the redirect URI

Scroll to the Access section and add the exact callback URL from your application. Every entry is saved as you add it — there is no separate save button for this list.

For the example:

https://vault.example.com/identity/connect/oidc-signin
FerrisKey client Access section with redirect URIs, web origins and post-logout redirect URIsFerrisKey client Access section with redirect URIs, web origins and post-logout redirect URIs

Two neighbours in the same area matter as much as the redirect URI:

  • Web origins — the origins this application may call FerrisKey from in a browser. The + button derives them from the redirect URIs you just entered, but only from literal ones: regex patterns are skipped. Removing an origin takes a few minutes to clear browser preflight caches, and up to 30 seconds to propagate to the other API replicas.
  • Post-logout redirect URIs, under Logout — where the user lands once the session closes. With no entry, logout ends on the FerrisKey page rather than back in your application.

Copy the client secret

Open Credentials

Open the client’s Credentials tab.

Copy the secret

The secret is masked. Click Reveal to read it, then copy it into the application’s OIDC configuration and treat it like a password.

FerrisKey client credentials tab showing the client ID and the masked client secret with a Reveal actionFerrisKey client credentials tab showing the client ID and the masked client secret with a Reveal action

Revealing a secret is recorded as a security event — client_secret_viewed in SeaWatch — which is intentional: it means an unexplained reveal is visible in the audit trail.

A leaked secret cannot be rotated through the API yet

Rotating a client secret is not exposed by the administration API at this version, as the Credentials tab states. So if a secret is pasted into a public issue, a log, a screenshot or a repository, there is no rotate call to make.

Until it ships, the containment path is to create a replacement client, move the application over, and delete the compromised one. Plan for that being slower than a rotation, and treat client secrets accordingly — in a secret manager, never in a screenshot.

Check the client scopes

Most OIDC applications need openid, profile, and email.

Open Client Scopes

Open the client’s Client Scopes tab.

Confirm required scopes

Each assigned scope carries a default / optional switch. Make sure these three are on default, which means every token gets them without the application asking:

  • openid
  • profile
  • email

If the application needs roles, set roles to default too. A new realm seeds eight scopes, and the remaining ones — address, phone, offline_access — arrive as optional, applied only when a request names them in its scope parameter.

FerrisKey client Client Scopes tab listing the assigned scopes with their default and optional switchesFerrisKey client Client Scopes tab listing the assigned scopes with their default and optional switches

The Evaluate sub-tab next to the assigned list answers the question this step is really about: it shows the claims this client would receive, without you having to run a login first.

Configure the application

Paste these values into the application.

Application settingFerrisKey value
Issuer / Authorityhttps://sso.example.com/realms/home
Discovery endpointhttps://sso.example.com/realms/home/.well-known/openid-configuration
Client IDvaultwarden
Client SecretThe value from the Credentials tab
Scopesopenid profile email
Redirect URIhttps://vault.example.com/identity/connect/oidc-signin

What the discovery endpoint does

The discovery endpoint is where an OpenID Connect application learns how to talk to FerrisKey.

https://sso.example.com/realms/home/.well-known/openid-configuration

When the application opens that URL, FerrisKey returns a JSON document with the realm’s OIDC metadata. That document tells the application:

  • Where to redirect users when they click “Sign in”
  • Where to exchange the authorization code for tokens
  • Which issuer value to expect in tokens
  • Where to fetch the public keys used to verify token signatures
  • Which scopes and response types are supported

That is why so many applications only ask for an issuer, an authority, or a discovery URL, instead of making you fill in every endpoint by hand.

Authority or discovery endpoint

Some applications ask for the issuer or authority URL, others for the discovery endpoint. When it asks for the authority, give it the realm URL without the /.well-known/openid-configuration suffix.

Test the login

  1. Open the application in a private browser window.
  2. Click the SSO or OpenID Connect login button.
  3. Confirm that the browser redirects to FerrisKey.
  4. Sign in with a user from the same realm.
  5. Confirm that FerrisKey redirects back to the application.

If the user signs in but the application says the account is not allowed, look at the application’s own signup, domain, group, or role rules. FerrisKey authenticated the user; the application still gets to decide whether that user is welcome.

Troubleshooting

Invalid redirect URI

FerrisKey rejects the login before showing the sign-in page.

Check that the redirect URI in the client settings exactly matches the callback URL sent by the application. Compare the scheme, domain, path, trailing slash, and port.

Discovery endpoint does not load

Open this URL from your browser and from the application container or server:

https://sso.example.com/realms/home/.well-known/openid-configuration

It should return a JSON document. If it does not, check the FerrisKey public URL, reverse proxy, TLS certificate, and realm name.

Issuer mismatch

Some applications validate that the configured authority equals the issuer field returned by the discovery endpoint.

Open the discovery endpoint and copy the issuer value. Use that exact value as the application’s issuer or authority.

Client authentication failed

The application reaches FerrisKey but token exchange fails.

Check:

  • The client is enabled
  • Client Authentication is enabled for confidential applications
  • The application uses the current client secret
  • There are no extra spaces around the copied secret

Missing email or profile data

The login succeeds but the application cannot create or match the account.

Check that openid, profile, and email are assigned as default client scopes. Also check that the FerrisKey user has an email address.

The application asks for password grant

Prefer authorization code flow when the application supports it. Only enable Direct Access Grants if the application explicitly requires grant_type=password and you trust it to handle user passwords directly.