Authentication providers
Configure GitHub OAuth, Google OAuth, generic OIDC (SSO), email login, magic link, and signup access control.
canette supports four login methods: GitHub OAuth, Google OAuth, generic OIDC (SSO), and email/password. All four can be active simultaneously. Social providers are hidden from the login page when not configured.
GitHub OAuth
1. Create an OAuth App
- Go to GitHub → Settings → Developer settings → OAuth Apps → New OAuth App
- Fill in the fields:
- Application name: e.g.
canette - Homepage URL: your canette URL, e.g.
https://canette.example.com - Authorization callback URL:
https://canette.example.com/api/auth/callback/github
- Application name: e.g.
- Click Register application
- Copy the Client ID
- Click Generate a new client secret and copy the secret
2. Configure Helm
api:
githubClientId: "<client-id>"
githubClientSecret: "<client-secret>"Or reference a pre-existing Kubernetes Secret for the client secret:
api:
githubClientId: "<client-id>"
githubClientSecretRef:
name: my-github-secret
key: client-secretOnce configured, a Continue with GitHub button appears on the login page.
Google OAuth
1. Create an OAuth 2.0 client
- Open the Google Cloud Console and select or create a project
- Go to APIs & Services → Credentials → Create Credentials → OAuth client ID
- If prompted, configure the OAuth consent screen first (set User Type to Internal for org-only access, or External to allow any Google account)
- Choose Application type: Web application
- Under Authorised redirect URIs, add:
https://canette.example.com/api/auth/callback/google(leave Authorised JavaScript origins empty — that is only needed for browser-side OAuth flows) - Click Create and copy the Client ID and Client secret
2. Configure Helm
api:
googleClientId: "<client-id>"
googleClientSecret: "<client-secret>"Or reference a pre-existing Kubernetes Secret for the client secret:
api:
googleClientId: "<client-id>"
googleClientSecretRef:
name: my-google-secret
key: client-secretOnce configured, a Continue with Google button appears on the login page.
Generic OIDC (SSO)
Generic OIDC lets users log in via your organisation's identity provider — Okta, Auth0, Keycloak, Azure AD, or any OIDC-compliant IdP. It is the recommended method for enterprise deployments where user lifecycle (onboarding, offboarding, MFA) is managed centrally.
1. Create an OIDC application in your IdP
The exact steps vary by provider, but the common fields are:
- Application type: Web application (or equivalent)
- Redirect / callback URL:
https://canette.example.com/api/auth/callback/oidc - Scopes:
openid,profile,email(canette requests these automatically)
Copy the Client ID, Client secret, and Issuer URL from the application settings.
Common issuer URL formats:
| Provider | Issuer URL |
|---|---|
| Okta | https://your-org.okta.com/oauth2/default |
| Auth0 | https://your-tenant.auth0.com |
| Keycloak | https://keycloak.example.com/realms/your-realm |
| Azure AD | https://login.microsoftonline.com/<tenant-id>/v2.0 |
The issuer URL is the base URL as returned in the iss claim of OIDC tokens. canette appends /.well-known/openid-configuration to discover the authorization and token endpoints automatically.
2. Configure Helm
auth:
oidc:
clientId: "<client-id>"
clientSecret: "<client-secret>"
issuerUrl: "https://your-org.okta.com/oauth2/default"Or reference a pre-existing Kubernetes Secret for the client secret:
auth:
oidc:
clientId: "<client-id>"
clientSecretRef:
name: my-oidc-secret
key: client-secret
issuerUrl: "https://your-org.okta.com/oauth2/default"Once configured, a Continue with SSO button with a key icon appears on the login page.
Button label
The button label defaults to SSO. Set auth.oidc.displayName to match your IdP's name:
auth:
oidc:
displayName: "Okta" # renders as "Continue with Okta"Enforcement mode
When OIDC is configured, you can optionally disable all other login methods so that users must authenticate via your IdP:
auth:
oidc:
enforce: trueWhen enforcement is on:
- GitHub OAuth, Google OAuth, and magic-link buttons are hidden from the login page
- The
/login/emailroute redirects back to/login - Email/password, magic-link, and social OAuth providers are not registered in the auth backend — preventing access even via direct API calls
Enforcement applies to all users, including admins. If you need emergency access after an IdP outage, set auth.oidc.enforce: false and run helm upgrade to restore email/password login.
Email login
Email/password login is always available. Users sign in with their email address and a password that meets the minimum policy (12+ characters, at least one uppercase, lowercase, and digit).
Signup mode
The signup mode controls how new users can register via email. It is configured in the admin UI under Admin → Settings → Signup and takes effect immediately — no restart or Helm upgrade required.
| Mode | Behaviour |
|---|---|
| Open (default) | Anyone can create an account |
| Disabled | No new registrations. Existing users can still sign in. |
| Invite code | New users must supply a single static code at signup. Set the code (min. 8 characters) in the admin UI. |
Signup mode only applies to email registration. Social provider sign-ins (GitHub, Google) are not affected — a user signing in via OAuth for the first time will still have an account created regardless of the signup mode.
Hard disable via Helm
For deployments where email signup should be permanently locked at the infrastructure level — regardless of what any admin sets in the UI — use the Helm override:
api:
disableEmailSignup: trueWhen this is set, the admin UI shows a notice that signup is globally disabled via Helm and the mode selector is locked. This is useful for SSO-only deployments or when you want ops to enforce the policy rather than trusting admin UI access.
Magic link login
Magic link login lets users sign in without a password by receiving a one-time link via email. It requires an email provider to be configured.
When enabled, a Sign in with magic link button appears below the password form on the email login page. Magic links are for existing users only — they do not create new accounts. Users must first register via email/password, after which they can sign in with either method.
Password reset
A Forgot password? link is always shown on the email sign-in page. What happens when a user clicks it depends on whether an email provider is configured:
- With an email provider — the user enters their email and receives a reset link. The link expires after 1 hour.
- Without an email provider — the page displays a message directing the user to contact an administrator. Admins can reset any user's password from Admin → Users → Reset password, which generates a temporary password shown once.
Configuring Resend
Resend is the first supported email provider and has a generous free tier.
- Create an account at resend.com and obtain an API key
- Verify your sending domain in the Resend dashboard
- Configure canette:
api:
email:
provider: resend
resendApiKey: "<your-resend-api-key>"
from: "canette <noreply@yourdomain.com>"Or reference a pre-existing Kubernetes Secret for the API key:
api:
email:
provider: resend
from: "canette <noreply@yourdomain.com>"
resendApiKeyRef:
name: my-resend-secret
key: api-keyLeave api.email.provider empty (the default) to disable magic link login entirely. Magic links require email delivery — without a configured provider, the button is not shown on the login page.