Kotlin: Initializing

Create Supabase Client

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.

OAuth and OTP link verification

supabase-kt provides several platform implementations for OAuth and OTP link verification.
On JVM, it uses a HTTP Callback Server to receive the session data from a successful OAuth login.

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 E-Mail. To send the token, rather than a redirect url, you have to change \{\{ .ConfirmationURL \}\} in your sign up email to \{\{ .Token \}\}

On Android, IOS & MacOS, it uses deeplinks. Refer to the guide below on how to setup deeplinks. Alternatively you could use Native Google Auth or a WebView for OAuth. Refer to our demo to learn more. On JS, it uses the website origin as the callback url. Session importing gets handled automatically. Windows, tvOS, watchOS & Linux currently have no default implementation. Feel free to create a PR.

You always make your own implementation and use gotrue.parseSessionFromFragment(fragment) or gotrue.parseSessionFromUrl(url) to let supabase-kt handle the parsing after receiving a callback. Then you can simply use gotrue.importSession(session).

Configure deeplink callbacks for Authentication

Deeplinks are supported on Android, IOS and MacOS.

  1. Setup a deeplink for you app
    On Android you may setup a deeplink in your Android manifest.
    On IOS & MacOS you may setup a url scheme.
  2. Add your deeplink to the redirect URLs
    Pattern: scheme://host
  3. Configure the GoTrue plugin You have to set the host and the scheme in the GoTrue config:
    install(GoTrue) \{
       host = "deeplink host" // this can be anything, eg. your package name or app/company url (not your supabase url)
       scheme = "deeplink scheme"
    
       //Android only, you can also change that OAuth/SSO logins open in a custom tab, rather than an external browser:
       defaultExternalAuthAction = ExternalAuthAction.CUSTOM_TABS //defaults to EXTERNAL_BROWSER
    \}
    
  4. Call platform specific function on startup
    On Android: supabase.handleDeeplinks(intent)
    On IOS/MacOS: supabase.handleDeeplinks(url)

Then you can just login using OAuth:

supabase.gotrue.loginWith(Google)

Or open OTP links directly in your app.

PKCE Authentication flow

supabase-kt supports the PKCE authentication flow. To use it, you just have to change the flowType in the GoTrue configuration:

install(GoTrue) \{
  flowType = FlowType.PKCE
\}

That's it! If you already implemented deeplinks to handle OTPs and OAuth you don't have to change anything!

Examples

Initialize Client

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(GoTrue)
    install(Postgrest)
    //install other modules
\}

Configure GoTrue module

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(GoTrue) \{
        alwaysAutoRefresh = false // default: true
        autoLoadFromStorage = false // default: true
        //and more...
    \}
\}

Configure PostgREST module

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
    \}
\}

Configure Storage module

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(Storage) \{
        transferTimeout = 90.seconds // Default: 120 seconds
    \}
\}

Configure Realtime module

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(Realtime) \{
        reconnectDelay = 5.seconds // Default: 7 seconds
    \}
\}

Configure Functions plugin

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(Functions) \{
        //no custom settings
    \}
\}

Configure GraphQL plugin

val supabase = createSupabaseClient(
    supabaseUrl = "https://xyzcompany.supabase.co",
    supabaseKey = "public-anon-key"
) \{
    install(GraphQL) \{
        apolloConfiguration \{
          //custom configuration
        \}
    \}
\}