apps/docs/content/guides/auth/social-login/auth-keycloak.mdx
To enable Keycloak Auth for your project, you need to set up an Keycloak OAuth application and add the application credentials to your Supabase Dashboard.
To get started with Keycloak, you can run it in a docker container with: docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
This guide will be assuming that you are running Keycloak in a docker container as described in the command above.
Keycloak OAuth consists of five broad steps:
issuer from the "OpenID Endpoint Configuration". This will be used as the Keycloak URL.openid-connect and the "Access Type" is set to "confidential".Client ID of the client created will be used as the client id.Secret from the credentials tab which will be used as the client secret.http://localhost:8080 and clicking on "Administration Console".issuer from the "OpenID Endpoint Configuration" endpoint. The issuer will be used as the Keycloak URL.http://localhost:8080/realms/my_realm_name/.well-known/openid-configurationThe "Client ID" of the created client will serve as the client_id when you make API calls to authenticate the user.
After you've created the client successfully, ensure that you set the following settings:
openid-connect.https://<project-ref>.supabase.co/auth/v1/callback.
This will serve as the client_secret when you make API calls to authenticate the user.
Under the "Credentials" tab, the Secret value will be used as the client secret.
Since Keycloak version 22, the openid scope must be passed. Add this to the supabase.auth.signInWithOAuth() method.
<Tabs scrollable size="small" type="underlined" defaultActiveId="js" queryGroup="language"
<TabPanel id="js" label="JavaScript">
<$Partial path="create_client_snippet.mdx" />
When your user signs in, call signInWithOAuth() with keycloak as the provider:
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('<your-project-url>', '<sb_publishable_... or anon key>')
// ---cut---
async function signInWithKeycloak() {
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'keycloak',
options: {
scopes: 'openid',
},
})
}
When your user signs in, call signInWithOAuth() with keycloak as the provider:
Future<void> signInWithKeycloak() async {
await supabase.auth.signInWithOAuth(
OAuthProvider.keycloak,
redirectTo: kIsWeb ? null : 'my.scheme://my-host', // Optionally set the redirect link to bring back the user via deeplink.
authScreenLaunchMode:
kIsWeb ? LaunchMode.platformDefault : LaunchMode.externalApplication, // Launch the auth screen in a new webview on mobile.
);
}
When your user signs in, call signInWith(Provider) with Keycloak as the Provider:
suspend fun signInWithKeycloak() {
supabase.auth.signInWith(Keycloak) {
scopes.add("openid")
}
}
<$Partial path="oauth_pkce_flow.mdx" />
<Tabs scrollable size="small" type="underlined" defaultActiveId="js" queryGroup="language"
<TabPanel id="js" label="JavaScript">
When your user signs out, call signOut() to remove them from the browser session and any objects from localStorage:
async function signOut() {
const { error } = await supabase.auth.signOut()
}
When your user signs out, call signOut() to remove them from the browser session and any objects from localStorage:
Future<void> signOut() async {
await supabase.auth.signOut();
}
When your user signs out, call signOut() to remove them from the browser session and any objects from localStorage:
import { createClient } from '@supabase/supabase-js';
const supabase = createClient('<your-project-url>', '<sb_publishable_... or anon key>');
// ---cut---
suspend fun signOut() {
supabase.auth.signOut()
}