Independently of which Supabase module you are using, you will need to initialize the main client first and install the module.
To create a new client, you can use the createSupabaseClient
function.
When installing a module, you can pass a block to configure it.
supabase-kt provides several platform implementations for OAuth and OTP link verification.
On Desktop platforms (JVM, MacOS*, Linux, Windows), it uses a HTTP Callback Server to receive the session data from a successful OAuth login. The success page can be customized via AuthConfig#httpCallbackConfig
* If no deeplinks are being used.
Note: OTP link verification such as sign ups are not supported on JVM. You may have to send a verification token rather than a url in your email. To send the token, rather than a redirect url, change \{\{ .ConfirmationURL \}\}
in your sign up email to \{\{ .Token \}\}
On Android, iOS & MacOS, OAuth and OTP verification use deeplinks. Refer to the guide below on how to setup deeplinks. Alternatively you can use Native Google Auth.
On JS, it uses the website origin as the callback url. Session importing gets handled automatically.
tvOS & watchOS currently have no default implementation. Feel free to create a PR.
You always make your own implementation and use auth.parseSessionFromFragment(fragment)
or auth.parseSessionFromUrl(url)
to let supabase-kt handle the parsing after receiving a callback. Then you can simply use auth.importSession(session)
.
Deeplinks are supported on Android, iOS and MacOS.
host
and scheme
in the Auth config:
install(Auth) \{
host = "deeplink host" // this can be anything, eg. your package name or app/company url (not your Supabase url)
scheme = "deeplink scheme"
// On Android only, you can set OAuth and SSO logins to open in a custom tab, rather than an external browser:
defaultExternalAuthAction = ExternalAuthAction.CustomTabs() //defaults to ExternalAuthAction.ExternalBrowser
\}
supabase.handleDeeplinks(intent)
onCreate
function in your MainActivity. supabase.handleDeeplinks(url)
Then you can log in using OAuth:
supabase.auth.signInWith(Google)
Or open OTP links directly in your app.
supabase-kt supports the PKCE authentication flow. To use it, change the flowType
in the Auth configuration:
install(Auth) \{
flowType = FlowType.PKCE
\}
That's it! If you already implemented deeplinks to handle OTPs and OAuth you don't have to change anything!
The unique Supabase URL which is supplied when you create a new project in your project dashboard.
The unique Supabase Key which is supplied when you create a new project in your project dashboard.
Apply additional configuration and install plugins.
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Auth)
install(Postgrest)
//install other modules
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Auth) \{
alwaysAutoRefresh = false // default: true
autoLoadFromStorage = false // default: true
//and more...
\}
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Postgrest) \{
defaultSchema = "schema" // default: "public"
propertyConversionMethod = PropertyConversionMethod.SERIAL_NAME // default: PropertyConversionMethod.CAMEL_CASE_TO_SNAKE_CASE
\}
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Storage) \{
transferTimeout = 90.seconds // Default: 120 seconds
\}
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Realtime) \{
reconnectDelay = 5.seconds // Default: 7 seconds
\}
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(Functions) \{
//no custom settings
\}
\}
val supabase = createSupabaseClient(
supabaseUrl = "https://xyzcompany.supabase.co",
supabaseKey = "public-anon-key"
) \{
install(GraphQL) \{
apolloConfiguration \{
//custom configuration
\}
\}
\}