From 2db1181b7aa92bce3fed62482dc921ebb04a0902 Mon Sep 17 00:00:00 2001 From: Div Arora Date: Fri, 9 Dec 2022 13:57:59 +0800 Subject: [PATCH 01/18] chore: add docs for network restrictions --- .../Navigation/Navigation.constants.ts | 1 + .../guides/platform/network-restrictions.mdx | 71 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 apps/docs/pages/guides/platform/network-restrictions.mdx diff --git a/apps/docs/components/Navigation/Navigation.constants.ts b/apps/docs/components/Navigation/Navigation.constants.ts index 5db85450719..fb3ab2dc305 100644 --- a/apps/docs/components/Navigation/Navigation.constants.ts +++ b/apps/docs/components/Navigation/Navigation.constants.ts @@ -264,6 +264,7 @@ export const menuItems: NavMenu = { url: '/guides/platform/migrating-and-upgrading-projects', items: [], }, + { name: 'Network Restrictions', url: '/guides/platform/network-restrictions', items: [] }, { name: 'Performance Tuning', url: '/guides/platform/performance', items: [] }, { name: 'Permissions', url: '/guides/platform/permissions', items: [] }, { name: 'Production Readiness', url: '/guides/platform/going-into-prod', items: [] }, diff --git a/apps/docs/pages/guides/platform/network-restrictions.mdx b/apps/docs/pages/guides/platform/network-restrictions.mdx new file mode 100644 index 00000000000..0c98e594447 --- /dev/null +++ b/apps/docs/pages/guides/platform/network-restrictions.mdx @@ -0,0 +1,71 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'network-restrictions', + title: 'Network Restrictions', + description: "Apply network restrictions for your project's database.", +} + + + +Network Restrictions are currently in beta, and are being slowly made available to all projects. + +The current iteration of Network Restrictions applies to connections to Postgres and Pgbouncer. Support for restricting connections to Postgrest, Storage, and Auth will be added at a later date. + + + +Each Supabase project comes with configurable restrictions on the IP ranges that are allowed to connect to Postgres and Pgbouncer ("your database"). These restrictions are enforced before traffic reaches your database; if a connection is allowed by a network restriction, it will still need to authenticate successfully with valid credentials. + +To get started: + +1. [Install](/docs/guides/cli) the Supabase CLI 1.22.0+. +1. [Log in](/docs/guides/cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. +1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform#manage-team-members) for the project you'd like to set up network restrictions for. + +## Check restrictions + +You can use the `get` subcommand of the CLI to retrieve the restrictions currently in effect. + +If restrictions have been applied, the output of the `get` command will reflect the IP ranges allowed to connect: + +```bash +> supabase network-restrictions --project-ref {ref} get --experimental +DB Allowed CIDRs: [128.12.1.1/16 183.12.1.1/24] +Restrictions applied successfully: true +``` + +If restrictions have never been applied to your project, the list of allowed CIDRs will be empty, but they will also not have been applied ("Restrictions applied successfully: false"). As a result, all IPs are allowed to connect to your database: + +```bash +> supabase network-restrictions --project-ref {ref} get --experimental +DB Allowed CIDRs: [] +Restrictions applied successfully: false +``` + +## Update restrictions + +The `update` subcommand is used to apply network restrictions to your project: + +```bash +> supabase network-restrictions --project-ref {ref} update --db-allow-cidr 128.12.1.1/16 --db-allow-cidr 183.12.1.1/24 --experimental +DB Allowed CIDRs: [128.12.1.1/16 183.12.1.1/24] +Restrictions applied successfully: true +``` + +The restrictions specified (in the form of CIDRs) replaces any restrictions that might have been applied in the past. +To add to the existing restrictions, you must include the existing restrictions within the list of CIDRs provided to the `update` command. + +## Remove restrictions + +To remove all restrictions on your project, you can use the `update` subcommand with the CIDR `0.0.0.0/0`: + +```bash +> supabase network-restrictions --project-ref {ref} update --db-allow-cidr 0.0.0.0/0 --experimental +DB Allowed CIDRs: [0.0.0.0/0] +Restrictions applied successfully: true +``` + +## Limitations + +1. Network Restrictions do not currently apply to APIs offered over HTTPS (e.g. Postgrest, Storage, Auth). +1. Network Restrictions should not be used if you require your edge functions to be able to connect to your project's postgres or pgbouncer endpoints. From 3d72e3627c8dd3f3c9054f8893376bf4b1e37cf0 Mon Sep 17 00:00:00 2001 From: thorwebdev Date: Sat, 10 Dec 2022 22:10:53 +0800 Subject: [PATCH 02/18] feat: add cloudflare turnstile example. --- .../supabase/functions/_shared/cors.ts | 2 +- .../functions/cloudflare-turnstile/README.md | 25 ++++++++ .../functions/cloudflare-turnstile/index.ts | 61 +++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 examples/edge-functions/supabase/functions/cloudflare-turnstile/README.md create mode 100644 examples/edge-functions/supabase/functions/cloudflare-turnstile/index.ts diff --git a/examples/edge-functions/supabase/functions/_shared/cors.ts b/examples/edge-functions/supabase/functions/_shared/cors.ts index 4be3f02881e..2ac4d89b14a 100644 --- a/examples/edge-functions/supabase/functions/_shared/cors.ts +++ b/examples/edge-functions/supabase/functions/_shared/cors.ts @@ -1,4 +1,4 @@ export const corsHeaders = { 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey', + 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', } diff --git a/examples/edge-functions/supabase/functions/cloudflare-turnstile/README.md b/examples/edge-functions/supabase/functions/cloudflare-turnstile/README.md new file mode 100644 index 00000000000..4d8bc5008cd --- /dev/null +++ b/examples/edge-functions/supabase/functions/cloudflare-turnstile/README.md @@ -0,0 +1,25 @@ +# Cloudflare Turnstile + +Turnstile is Cloudflare's CAPTCHA alternative: https://developers.cloudflare.com/turnstile/get-started/ + +## Setup + +- Follow these steps to set up a new site: https://developers.cloudflare.com/turnstile/get-started/ +- Add the Cloudflare Turnstile widget to your site: https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/ + +## Deploy the server-side validation Edge Functions + +- https://developers.cloudflare.com/turnstile/get-started/server-side-validation/ + +```bash +supabase functions deploy cloudflare-turnstile +supabase secrets set CLOUDFLARE_TURNSTILE_SECRET_KEY=your_secret_key +``` + +## Invoke the function from your site + +```js +const { data, error } = await supabase.functions.invoke('cloudflare-turnstile', { + body: { token }, +}) +``` diff --git a/examples/edge-functions/supabase/functions/cloudflare-turnstile/index.ts b/examples/edge-functions/supabase/functions/cloudflare-turnstile/index.ts new file mode 100644 index 00000000000..5d831d18ab7 --- /dev/null +++ b/examples/edge-functions/supabase/functions/cloudflare-turnstile/index.ts @@ -0,0 +1,61 @@ +// Follow this setup guide to integrate the Deno language server with your editor: +// https://deno.land/manual/getting_started/setup_your_environment +// This enables autocomplete, go to definition, etc. + +import { serve } from 'https://deno.land/std@0.131.0/http/server.ts' +import { corsHeaders } from '../_shared/cors.ts' + +console.log(`Function "cloudflare-turnstile" up and running!`) + +function ips(req: Request) { + return req.headers.get('x-forwarded-for')?.split(/\s*,\s*/) +} + +serve(async (req) => { + // This is needed if you're planning to invoke your function from a browser. + if (req.method === 'OPTIONS') { + return new Response('ok', { headers: corsHeaders }) + } + + try { + const { token } = await req.json() + if (!token) throw new Error('Missing token!') + + const clientIps = ips(req) || [''] + + // Validate the token by calling the + // "/siteverify" API endpoint. + const formData = new FormData() + formData.append('secret', Deno.env.get('CLOUDFLARE_TURNSTILE_SECRET_KEY') ?? '') + formData.append('response', token) + formData.append('remoteip', clientIps[0]) + + const url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify' + const result = await fetch(url, { + body: formData, + method: 'POST', + }) + + const outcome = await result.json() + console.log(outcome) + if (outcome.success) { + return new Response(JSON.stringify(outcome), { + headers: { ...corsHeaders, 'Content-Type': 'application/json' }, + status: 200, + }) + } + + throw new Error('Turnstile validation failed!') + } catch (error) { + return new Response(JSON.stringify({ error: error.message }), { + headers: { ...corsHeaders, 'Content-Type': 'application/json' }, + status: 400, + }) + } +}) + +// To invoke: +// curl -i --location --request POST 'http://localhost:54321/functions/v1/' \ +// --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0' \ +// --header 'Content-Type: application/json' \ +// --data '{"token":"cf-turnstile-response"}' From d28a68b8b678c1c420a4d3da3342ee995deb660d Mon Sep 17 00:00:00 2001 From: Murali Krishna Date: Mon, 12 Dec 2022 22:17:33 +0530 Subject: [PATCH 03/18] Add title and description to oss page --- apps/www/pages/oss.tsx | 202 +++++++++++++++++++++++------------------ 1 file changed, 113 insertions(+), 89 deletions(-) diff --git a/apps/www/pages/oss.tsx b/apps/www/pages/oss.tsx index b39603f9343..684444cd700 100644 --- a/apps/www/pages/oss.tsx +++ b/apps/www/pages/oss.tsx @@ -1,10 +1,12 @@ import { useState, useEffect } from 'react' +import { useRouter } from 'next/router' import { Octokit } from '@octokit/core' import DefaultLayout from '~/components/Layouts/Default' import SectionContainer from '~/components/Layouts/SectionContainer' import maintainers from '../data/maintainers.json' import Sponsors from '../components/Sponsors' import Image from 'next/image' +import { NextSeo } from 'next-seo' export default function Oss() { const octokit = new Octokit() @@ -31,105 +33,127 @@ export default function Oss() { fetchOctoData() }, []) + const router = useRouter() + + const meta_title = 'Open Source | Supabase' + const meta_description = + 'Supabase is an open source company, supporting existing open source tools and communities wherever possible.' + return ( - -
- -
-
-
-

Open source

-

- Supabase is an open source company, supporting existing open source tools and - communities wherever possible. -

+ <> + + +
+ +
+
+
+

Open source

+

+ Supabase is an open source company, supporting existing open source tools and + communities wherever possible. +

+
+

Sponsors

+
-

Sponsors

- -
- + - -
-

Community Maintainers

+ +
+

Community Maintainers

-
-
    - {maintainerPills.map((x) => ( -
  • setActivePill(x)} - > - {x} -
  • - ))} -
-
- + ))} +
-
- + - {/* OSS */} - -
-

Repositories

-
- {repos.length < 1 &&
} - {repos.length >= 1 && - repos.map((props: any, idx: any) => ( - - ))} + {/* OSS */} + +
+

Repositories

+
+ {repos.length < 1 &&
} + {repos.length >= 1 && + repos.map((props: any, idx: any) => ( + + ))} +
-
- -
- +
+
+ + ) } From ec9b0a88907927086e50adb2f45d0b368310b1cd Mon Sep 17 00:00:00 2001 From: Div Arora Date: Tue, 13 Dec 2022 11:16:37 +0800 Subject: [PATCH 04/18] Apply suggestions from code review Co-authored-by: Copple <10214025+kiwicopple@users.noreply.github.com> --- .../pages/guides/platform/network-restrictions.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/docs/pages/guides/platform/network-restrictions.mdx b/apps/docs/pages/guides/platform/network-restrictions.mdx index 0c98e594447..3ff0854d1ab 100644 --- a/apps/docs/pages/guides/platform/network-restrictions.mdx +++ b/apps/docs/pages/guides/platform/network-restrictions.mdx @@ -8,19 +8,19 @@ export const meta = { -Network Restrictions are currently in beta, and are being slowly made available to all projects. +Network Restrictions are currently in beta and are being slowly made available to all projects. -The current iteration of Network Restrictions applies to connections to Postgres and Pgbouncer. Support for restricting connections to Postgrest, Storage, and Auth will be added at a later date. +The current iteration of Network Restrictions applies to connections to Postgres and PgBouncer. Support for restricting connections to PostgREST, Storage, and Auth will be added at a later date. -Each Supabase project comes with configurable restrictions on the IP ranges that are allowed to connect to Postgres and Pgbouncer ("your database"). These restrictions are enforced before traffic reaches your database; if a connection is allowed by a network restriction, it will still need to authenticate successfully with valid credentials. +Each Supabase project comes with configurable restrictions on the IP ranges that are allowed to connect to Postgres and PgBouncer ("your database"). These restrictions are enforced before traffic reaches your database. If a connection is not restricted by IP, it still needs to authenticate successfully with valid database credentials. To get started: 1. [Install](/docs/guides/cli) the Supabase CLI 1.22.0+. 1. [Log in](/docs/guides/cli/local-development#log-in-to-the-supabase-cli) to your Supabase account using the CLI. -1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform#manage-team-members) for the project you'd like to set up network restrictions for. +1. Ensure that you have [Owner or Admin permissions](/docs/guides/hosting/platform#manage-team-members) for the project that you are enabling network restrictions. ## Check restrictions @@ -67,5 +67,5 @@ Restrictions applied successfully: true ## Limitations -1. Network Restrictions do not currently apply to APIs offered over HTTPS (e.g. Postgrest, Storage, Auth). -1. Network Restrictions should not be used if you require your edge functions to be able to connect to your project's postgres or pgbouncer endpoints. +1. Network Restrictions do not currently apply to APIs offered over HTTPS (e.g. PostgREST, Storage, Auth). +1. Network Restrictions should not be used if you require you need to connect to your Postgres database using Edge Functions. From d592752285d09a543c2d01fc72a507a884057cab Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Tue, 13 Dec 2022 12:41:18 +0800 Subject: [PATCH 05/18] add to menu --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index f05bc049aa0..3b4b1e980a9 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -482,6 +482,7 @@ export const platform = { url: '/guides/platform/migrating-and-upgrading-projects', items: [], }, + { name: 'Network Restrictions', url: '/guides/platform/network-restrictions', items: [] }, { name: 'Performance Tuning', url: '/guides/platform/performance', items: [] }, { name: 'Permissions', url: '/guides/platform/permissions', items: [] }, ], From bdd1f5483d640080c57cb51f210bc6dcef6d4a85 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 14 Dec 2022 02:45:10 +0800 Subject: [PATCH 06/18] moved all pages to new home --- apps/docs/components/DocSearch.tsx | 211 ----- .../NavigationMenu.constants.ts | 4 +- apps/docs/pages/guides/auth.mdx | 185 ---- apps/docs/pages/guides/auth/auth-apple.mdx | 207 ----- apps/docs/pages/guides/auth/auth-azure.mdx | 103 --- .../docs/pages/guides/auth/auth-bitbucket.mdx | 95 --- apps/docs/pages/guides/auth/auth-discord.mdx | 97 --- apps/docs/pages/guides/auth/auth-facebook.mdx | 112 --- apps/docs/pages/guides/auth/auth-github.mdx | 105 --- apps/docs/pages/guides/auth/auth-gitlab.mdx | 92 -- apps/docs/pages/guides/auth/auth-google.mdx | 120 --- apps/docs/pages/guides/auth/auth-keycloak.mdx | 92 -- apps/docs/pages/guides/auth/auth-linkedin.mdx | 91 -- .../pages/guides/auth/auth-magic-link.mdx | 96 --- .../pages/guides/auth/auth-messagebird.mdx | 284 ------- apps/docs/pages/guides/auth/auth-notion.mdx | 95 --- apps/docs/pages/guides/auth/auth-slack.mdx | 104 --- apps/docs/pages/guides/auth/auth-spotify.mdx | 99 --- apps/docs/pages/guides/auth/auth-twitch.mdx | 111 --- apps/docs/pages/guides/auth/auth-twitter.mdx | 100 --- apps/docs/pages/guides/auth/auth-vonage.mdx | 277 ------ apps/docs/pages/guides/auth/auth-workos.mdx | 93 -- apps/docs/pages/guides/auth/auth-zoom.mdx | 100 --- apps/docs/pages/guides/auth/overview.mdx | 173 +++- .../email-otp-magic-link.mdx | 91 +- .../phone-sms-otp-messagebird.mdx | 279 +++++- .../phone-sms-otp-twilio.mdx | 300 ++++++- .../phone-sms-otp-vonage.mdx | 272 +++++- .../guides/auth/social-login/auth-apple.mdx | 202 ++++- .../guides/auth/social-login/auth-azure.mdx | 98 ++- .../auth/social-login/auth-bitbucket.mdx | 90 +- .../guides/auth/social-login/auth-discord.mdx | 92 +- .../auth/social-login/auth-facebook.mdx | 107 ++- .../guides/auth/social-login/auth-github.mdx | 100 ++- .../guides/auth/social-login/auth-gitlab.mdx | 87 +- .../guides/auth/social-login/auth-google.mdx | 115 ++- .../auth/social-login/auth-keycloak.mdx | 87 +- .../auth/social-login/auth-linkedin.mdx | 86 +- .../guides/auth/social-login/auth-notion.mdx | 90 +- .../guides/auth/social-login/auth-slack.mdx | 99 ++- .../guides/auth/social-login/auth-spotify.mdx | 94 +- .../guides/auth/social-login/auth-twilio.mdx | 17 - .../guides/auth/social-login/auth-twitch.mdx | 106 ++- .../guides/auth/social-login/auth-twitter.mdx | 95 ++- .../guides/auth/social-login/auth-workos.mdx | 88 +- .../guides/auth/social-login/auth-zoom.mdx | 95 ++- apps/docs/pages/guides/cli.mdx | 122 --- .../pages/guides/cli/local-development.mdx | 261 ------ apps/docs/pages/guides/database/overview.mdx | 89 +- apps/docs/pages/guides/getting-started.mdx | 3 +- .../guides/getting-started/architecture.mdx | 17 - .../pages/guides/getting-started/features.mdx | 17 - .../tutorials/with-angular.mdx | 536 +++++++++++- .../getting-started/tutorials/with-expo.mdx | 503 ++++++++++- .../tutorials/with-flutter.mdx | 794 ++++++++++++++++- .../tutorials/with-ionic-angular.mdx | 532 +++++++++++- .../tutorials/with-ionic-react.mdx | 499 ++++++++++- .../tutorials/with-ionic-vue.mdx | 561 +++++++++++- .../getting-started/tutorials/with-nextjs.mdx | 726 +++++++++++++++- .../getting-started/tutorials/with-nuxt-3.mdx | 426 +++++++++- .../getting-started/tutorials/with-react.mdx | 395 ++++++++- .../tutorials/with-redwoodjs.mdx | 779 ++++++++++++++++- .../tutorials/with-solidjs.mdx | 419 ++++++++- .../getting-started/tutorials/with-svelte.mdx | 374 +++++++- .../tutorials/with-sveltekit.mdx | 440 +++++++++- .../getting-started/tutorials/with-vue-3.mdx | 385 ++++++++- apps/docs/pages/guides/hosting/docker.mdx | 120 --- apps/docs/pages/guides/hosting/overview.mdx | 161 ---- .../pages/guides/migrations/firebase-auth.mdx | 93 -- .../guides/migrations/firebase-storage.mdx | 72 -- apps/docs/pages/guides/migrations/heroku.mdx | 71 -- apps/docs/pages/guides/resources.mdx | 2 +- apps/docs/pages/guides/resources/examples.mdx | 17 - .../resources/migrating-to-supabase.mdx | 13 - .../migrating-to-supabase/firebase-auth.mdx | 87 +- .../migrating-to-supabase/firebase-data.mdx | 18 - .../firebase-storage.mdx | 68 +- .../migrating-to-supabase}/firestore-data.mdx | 0 .../migrating-to-supabase/heroku.mdx | 67 +- .../pages/guides/resources/self-hosting.mdx | 157 +++- .../guides/resources/self-hosting/docker.mdx | 116 ++- .../pages/guides/resources/supabase-cli.mdx | 116 ++- .../supabase-cli/local-development.mdx | 258 +++++- .../supabase-cli/managing-enviroments.mdx | 17 - .../supabase-cli}/managing-environments.mdx | 0 apps/docs/pages/guides/with-angular.mdx | 542 ------------ apps/docs/pages/guides/with-expo.mdx | 512 ----------- apps/docs/pages/guides/with-flutter.mdx | 802 ------------------ apps/docs/pages/guides/with-ionic-angular.mdx | 538 ------------ apps/docs/pages/guides/with-ionic-react.mdx | 507 ----------- apps/docs/pages/guides/with-ionic-vue.mdx | 567 ------------- apps/docs/pages/guides/with-nextjs.mdx | 732 ---------------- apps/docs/pages/guides/with-nuxt-3.mdx | 432 ---------- apps/docs/pages/guides/with-react.mdx | 403 --------- apps/docs/pages/guides/with-redwoodjs.mdx | 785 ----------------- apps/docs/pages/guides/with-solidjs.mdx | 427 ---------- apps/docs/pages/guides/with-svelte.mdx | 380 --------- apps/docs/pages/guides/with-sveltekit.mdx | 446 ---------- apps/docs/pages/guides/with-vue-3.mdx | 391 --------- apps/www/lib/redirects.js | 242 ++++++ 100 files changed, 11156 insertions(+), 11617 deletions(-) delete mode 100644 apps/docs/components/DocSearch.tsx delete mode 100644 apps/docs/pages/guides/auth.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-apple.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-azure.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-bitbucket.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-discord.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-facebook.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-github.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-gitlab.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-google.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-keycloak.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-linkedin.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-magic-link.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-messagebird.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-notion.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-slack.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-spotify.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-twitch.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-twitter.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-vonage.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-workos.mdx delete mode 100644 apps/docs/pages/guides/auth/auth-zoom.mdx delete mode 100644 apps/docs/pages/guides/auth/social-login/auth-twilio.mdx delete mode 100644 apps/docs/pages/guides/cli.mdx delete mode 100644 apps/docs/pages/guides/cli/local-development.mdx delete mode 100644 apps/docs/pages/guides/getting-started/architecture.mdx delete mode 100644 apps/docs/pages/guides/getting-started/features.mdx delete mode 100644 apps/docs/pages/guides/hosting/docker.mdx delete mode 100644 apps/docs/pages/guides/hosting/overview.mdx delete mode 100644 apps/docs/pages/guides/migrations/firebase-auth.mdx delete mode 100644 apps/docs/pages/guides/migrations/firebase-storage.mdx delete mode 100644 apps/docs/pages/guides/migrations/heroku.mdx delete mode 100644 apps/docs/pages/guides/resources/examples.mdx delete mode 100644 apps/docs/pages/guides/resources/migrating-to-supabase.mdx delete mode 100644 apps/docs/pages/guides/resources/migrating-to-supabase/firebase-data.mdx rename apps/docs/pages/guides/{migrations => resources/migrating-to-supabase}/firestore-data.mdx (100%) delete mode 100644 apps/docs/pages/guides/resources/supabase-cli/managing-enviroments.mdx rename apps/docs/pages/guides/{cli => resources/supabase-cli}/managing-environments.mdx (100%) delete mode 100644 apps/docs/pages/guides/with-angular.mdx delete mode 100644 apps/docs/pages/guides/with-expo.mdx delete mode 100644 apps/docs/pages/guides/with-flutter.mdx delete mode 100644 apps/docs/pages/guides/with-ionic-angular.mdx delete mode 100644 apps/docs/pages/guides/with-ionic-react.mdx delete mode 100644 apps/docs/pages/guides/with-ionic-vue.mdx delete mode 100644 apps/docs/pages/guides/with-nextjs.mdx delete mode 100644 apps/docs/pages/guides/with-nuxt-3.mdx delete mode 100644 apps/docs/pages/guides/with-react.mdx delete mode 100644 apps/docs/pages/guides/with-redwoodjs.mdx delete mode 100644 apps/docs/pages/guides/with-solidjs.mdx delete mode 100644 apps/docs/pages/guides/with-svelte.mdx delete mode 100644 apps/docs/pages/guides/with-sveltekit.mdx delete mode 100644 apps/docs/pages/guides/with-vue-3.mdx diff --git a/apps/docs/components/DocSearch.tsx b/apps/docs/components/DocSearch.tsx deleted file mode 100644 index d8bde374580..00000000000 --- a/apps/docs/components/DocSearch.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import { useState, useCallback, useRef, createContext, useContext, useEffect } from 'react' -import { createPortal } from 'react-dom' -import Link from 'next/link' -import Head from 'next/head' -import { useRouter } from 'next/router' -import { DocSearchModal } from '@docsearch/react' -import clsx from 'clsx' -import { useActionKey } from '~/hooks/useActionKey' - -// [Joshen] We're currently using this over Algolia search for the time being -// Refer to the comment in Navigation/AlgoliaSearch for more information about this - -const INDEX_NAME = process.env.NEXT_PUBLIC_ALGOLIA_INDEX_NAME -const API_KEY = process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY -const APP_ID = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID - -const SearchContext = createContext(null) - -export function SearchProvider({ children }: any) { - const router = useRouter() - const [isOpen, setIsOpen] = useState(false) - const [initialQuery, setInitialQuery] = useState(null) - - const onOpen = useCallback(() => { - setIsOpen(true) - }, [setIsOpen]) - - const onClose = useCallback(() => { - setIsOpen(false) - }, [setIsOpen]) - - const onInput = useCallback( - (e) => { - setIsOpen(true) - setInitialQuery(e.key) - }, - [setIsOpen, setInitialQuery] - ) - - useDocSearchKeyboardEvents({ - isOpen, - onOpen, - onClose, - // @ts-ignore - onInput, - }) - - return ( - <> - - - - - {children} - - {isOpen && - createPortal( - { - return `https://github.com/supabase/supabase/issues/new?title=Unable+to+search+docs+with+query:+${query}` - }} - hitComponent={Hit} - transformItems={(items) => { - return items.map((item, index) => { - // We transform the absolute URL into a relative URL to - // leverage Next's preloading. - const a = document.createElement('a') - a.href = item.url - - const hash = a.hash === '#content-wrapper' ? '' : a.hash - - return { - ...item, - url: `${a.pathname}${hash}`, - __is_result: () => true, - __is_parent: () => item.type === 'lvl1' && items.length > 1 && index === 0, - __is_child: () => - item.type !== 'lvl1' && - items.length > 1 && - items[0].type === 'lvl1' && - index !== 0, - __is_first: () => index === 1, - __is_last: () => index === items.length - 1 && index !== 0, - } - }) - }} - />, - document.body - )} - - ) -} - -// @ts-ignore -function Hit({ hit, children }) { - return ( - - - {children} - - - ) -} - -// @ts-ignore -export function SearchButton({ children, ...props }) { - let searchButtonRef = useRef() - let actionKey = useActionKey() - // @ts-ignore - let { onOpen, onInput } = useContext(SearchContext) - - useEffect(() => { - // @ts-ignore - function onKeyDown(event) { - if (searchButtonRef && searchButtonRef.current === document.activeElement && onInput) { - if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) { - onInput(event) - } - } - } - window.addEventListener('keydown', onKeyDown) - return () => { - window.removeEventListener('keydown', onKeyDown) - } - }, [onInput, searchButtonRef]) - - return ( - // @ts-ignore - - ) -} - -// @ts-ignore -function useDocSearchKeyboardEvents({ isOpen, onOpen, onClose }) { - useEffect(() => { - // @ts-ignore - function onKeyDown(event) { - function open() { - // We check that no other DocSearch modal is showing before opening - // another one. - if (!document.body.classList.contains('DocSearch--active')) { - onOpen() - } - } - - if ( - (event.keyCode === 27 && isOpen) || - (event.key === 'k' && (event.metaKey || event.ctrlKey)) || - (!isEditingContent(event) && event.key === '/' && !isOpen) - ) { - event.preventDefault() - - if (isOpen) { - onClose() - } else if (!document.body.classList.contains('DocSearch--active')) { - open() - } - } - } - - window.addEventListener('keydown', onKeyDown) - return () => { - window.removeEventListener('keydown', onKeyDown) - } - }, [isOpen, onOpen, onClose]) -} - -// @ts-ignore -function isEditingContent(event) { - let element = event.target - let tagName = element.tagName - return ( - element.isContentEditable || - tagName === 'INPUT' || - tagName === 'SELECT' || - tagName === 'TEXTAREA' - ) -} diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index dc627058192..af446fd584c 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -512,8 +512,8 @@ export const resources = { items: [], }, { - name: 'Firebase Data', - url: '/guides/resources/migrating-to-supabase/firebase-data', + name: 'Firestore Data', + url: '/guides/resources/migrating-to-supabase/firestore-data', items: [], }, { diff --git a/apps/docs/pages/guides/auth.mdx b/apps/docs/pages/guides/auth.mdx deleted file mode 100644 index 85b1fdc96da..00000000000 --- a/apps/docs/pages/guides/auth.mdx +++ /dev/null @@ -1,185 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import NewContent from '~/pages/new/auth.mdx' -import { useRouter } from 'next/router' - -export const meta = { - id: 'auth', - title: 'Auth', - description: 'Use Supabase to Authenticate and Authorize your users.', - sidebar_label: 'Overview', -} - -## Overview - -There are two parts to every Auth system: - -- **Authentication:** should this person be allowed in? If yes, who are they? -- **Authorization:** once they are in, what are they allowed to do? - -Supabase Auth is designed to work either as a standalone product, or deeply integrated with the other Supabase products. -Postgres is at the heart of everything we do, and the Auth system follows this principle. We leverage Postgres' built-in Auth functionality wherever possible. - -Here's a quick, 2 minute tour of the Auth features built-in to Supabase: - -
- -
- -## Authentication - -You can authenticate your users in several ways: - -- Email & password. -- Magic links (one-click logins). -- Social providers. -- Phone logins. - -### Providers - -We provide a suite of Providers and login methods, as well as [Auth helpers](/docs/guides/auth/auth-helpers/). - -
- -
- -### Configure third-party providers - -You can enable third-party providers with the click of a button by navigating to Authentication > Settings > Auth Providers and inputting your `Client ID` and `Secret` for each. - -![OAuth Logins.](/docs/img/supabase-oauth-logins.png) - -### Redirect URLs and wildcards - -When using third-party providers, the [Supabase client library](/docs/reference/javascript/auth-signinwithoauth#sign-in-using-a-third-party-provider-with-redirect) redirects the user to the provider. When the third-party provider successfully authenticates the user, the provider redirects the user to the Supabase Auth callback URL where they are further redirected to the URL specified in the `redirectTo` parameter. This parameter defaults to the [`SITE_URL`](/docs/reference/auth/config#site_url). You can modify the `SITE_URL` or [add additional redirect URLs](https://app.supabase.com/project/_/auth/settings). - -You can use wildcard match patterns to support preview URLs from providers like Netlify and Vercel. See the [full list of supported patterns](https://pkg.go.dev/github.com/gobwas/glob#Compile). Use [this tool](https://www.digitalocean.com/community/tools/glob?comments=true&glob=http%3A%2F%2Flocalhost%3A3000%2F%2A%2A&matches=false&tests=http%3A%2F%2Flocalhost%3A3000&tests=http%3A%2F%2Flocalhost%3A3000%2F&tests=http%3A%2F%2Flocalhost%3A3000%2F%3Ftest%3Dtest&tests=http%3A%2F%2Flocalhost%3A3000%2Ftest-test%3Ftest%3Dtest&tests=http%3A%2F%2Flocalhost%3A3000%2Ftest%2Ftest%3Ftest%3Dtest) to test your patterns. - -> ⚠️ WARNING: While the "globstar" (`**`) is useful for local development and preview URLs, we recommend setting the exact redirect URL path for your site URL in production. - -#### Netlify preview URLs - -For deployments with Netlify, set the `SITE_URL` to your official site URL. Add the following additional redirect URLs for local development and deployment previews: - -- `http://localhost:3000/**` -- `https://**--my_org.netlify.app/**` - -#### Vercel preview URLs - -For deployments with Vercel, set the `SITE_URL` to your official site URL. Add the following additional redirect URLs for local development and deployment previews: - -- `http://localhost:3000/**` -- `https://*-username.vercel.app/**` - -Vercel provides an environment variable for the URL of the deployment called `NEXT_PUBLIC_VERCEL_URL`. See the [Vercel docs](https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables) for more details. You can use this variable to dynamically redirect depending on the environment: - -```js -const getURL = () => { - let url = - process?.env?.NEXT_PUBLIC_SITE_URL ?? // Set this to your site URL in production env. - process?.env?.NEXT_PUBLIC_VERCEL_URL ?? // Automatically set by Vercel. - 'http://localhost:3000/'; - // Make sure to include `https://` when not localhost. - url = url.includes('http') ? url : `https://${url}`; - // Make sure to including trailing `/`. - url = url.charAt(url.length - 1) === '/' ? url : `${url}/`; - return url; -}; - -const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'github' - options: { - redirectTo: getURL() - } -} -``` - -#### Mobile deep linking URIs - -For mobile applications you can use deep linking URIs. For example for your `SITE_URL` you can specify something like `com.supabase://login-callback/` and for additional redirect URLs something like `com.supabase.staging://login-callback/` if needed. - -## Authorization - -When you need granular authorization rules, nothing beats PostgreSQL's Row Level Security (RLS). - -Policies are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. - -Get started with our [Row Level Security Guides](/docs/guides/auth/row-level-security). - -### Row Level Security - -Authentication only gets you so far. When you need granular authorization rules, nothing beats PostgreSQL's [Row Level Security (RLS)](https://www.postgresql.org/docs/current/ddl-rowsecurity.html). Supabase makes it simple to turn RLS on and off. - - - -### Policies - -[Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. - - - -With policies, your database becomes the rules engine. Instead of repetitively filtering your queries, like this ... - -```js -const loggedInUserId = 'd0714948' -let { data, error } = await supabase - .from('users') - .select('user_id, name') - .eq('user_id', loggedInUserId) - -// console.log(data) -// => { id: 'd0714948', name: 'Jane' } -``` - -... you can simply define a rule on your database table, `auth.uid() = user_id`, and your request will return the rows which pass the rule, even when you remove the filter from your middleware: - -```js -let { data, error } = await supabase.from('users').select('user_id, name') - -// console.log(data) -// Still => { id: 'd0714948', name: 'Jane' } -``` - -### How It Works - -1. A user signs up. Supabase creates a new user in the `auth.users` table. -2. Supabase returns a new JWT, which contains the user's `UUID`. -3. Every request to your database also sends the JWT. -4. Postgres inspects the JWT to determine the user making the request. -5. The user's UID can be used in policies to restrict access to rows. - -Supabase provides a special function in Postgres, `auth.uid()`, which extracts the user's UID from the JWT. This is especially useful when creating policies. - -## User Management - -Supabase provides multiple endpoints to authenticate and manage your users: - -- [Sign up](/docs/reference/javascript/auth-signup) -- [Sign in with password](/docs/reference/javascript/auth-signinwithpassword) -- [Sign in with passwordless / one-time password (OTP)](/docs/reference/javascript/auth-signinwithotp) -- [Sign in with OAuth](/docs/reference/javascript/auth-signinwithoauth) -- [Sign out](/docs/reference/javascript/auth-signout) - -When users sign up, Supabase assigns them a unique ID. You can reference this ID anywhere in your database. For example, you might create a `profiles` table referencing `id` in the `auth.users` table using a `user_id` field. - - - -export const Page = ({ children }) => { - const router = useRouter() - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true' && !router.asPath.includes('overview')) { - return NewContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-apple.mdx b/apps/docs/pages/guides/auth/auth-apple.mdx deleted file mode 100644 index d5bf22f9205..00000000000 --- a/apps/docs/pages/guides/auth/auth-apple.mdx +++ /dev/null @@ -1,207 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-apple', - title: 'Login with Apple', - description: 'Add Apple OAuth to your Supabase project', -} - -To enable Apple Auth for your project, you need to set up an Apple OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Apple OAuth consists of six broad steps: - -- Obtaining an `App Id` with “Sign In with Apple” capabilities. -- Obtaining a `Services Id` - this will serve as the `client_id`. -- Obtaining a `secret key` that will be used to get our `client_secret`. -- Generating the `client_secret` using the `secret key`. -- Add your `client id` and `client secret` keys to your [Supabase Project](https://app.supabase.com). -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). - -## Access your Apple Developer account - -- Go to [developer.apple.com](https://developer.apple.com). -- Click on `Account` at the top right to log in. - -![Apple Developer Portal.](/docs/img/guides/auth-apple/apple-developer-portal.png) - -## Obtain an App ID - -- Go to `Certificates, Identifiers & Profiles`. -- Click on `Identifiers` at the left. -- Click on the `+` sign in the upper left next to `Identifiers`. -- Select `App IDs` and click `Continue`. -- Select type `App` and click `Continue`. -- Fill out your app information: - - App description. - - Bundle ID (Apple recommends reverse-domain name style, so if your domain is acme.com and your app is called roadrunner, use: "com.acme.roadrunner"). - - Scroll down and check `Sign In With Apple`. - - Click `Continue` at the top right. - - Click `Register` at the top right. - -## Obtain a Services ID - -This will serve as the `client_id` when you make API calls to authenticate the user. - -- Go to `Certificates, Identifiers & Profiles`. -- Click on `Identifiers` at the left. -- Click on the `+` sign in the upper left next to `Identifiers`. -- Select `Services IDs` and click `Continue`. -- Fill out your information: - - App description. - - Bundle ID (you can't use the same Bundle ID from the previous step, but you can just add something to the beginning, such as "app." to make it app.com.acme.roadrunner"). - - SAVE THIS ID -- this ID will become your `client_id` later. - - Click `Continue` at the top right. - - Click `Register` at the top right. - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Configure your Services ID - -- Under `Identifiers`, click on your newly-created Services ID. -- Check the box next to `Sign In With Apple` to enable it. -- Click `Configure` to the right. -- Make sure your newly created Bundle ID is selected under `Primary App ID` -- Add your domain to the `Domains and Subdomains` box (do not add `https://`, just add the domain). -- In the `Return URLs` box, type the callback URL of your app which you found in the previous step and click `Next` at the bottom right. -- Click `Done` at the bottom. -- Click `Continue` at the top right. -- Click `Save` at the top right. - -## Download your secret key - -Now you'll need to download a `secret key` file from Apple that will be used to generate your `client_secret`. - -- Go to `Certificates, Identifiers & Profiles`. -- Click on `Keys` at the left. -- Click on the `+` sign in the upper left next to `Keys`. -- Enter a `Key Name`. -- Check `Sign In with Apple`. -- Click `Configure` to the right. -- Select your newly-created Services ID from the dropdown selector. -- Click `Save` at the top right. -- Click `Continue` at the top right. -- Click `Register` at the top right. -- Click `Download` at the top right. -- Save the downloaded file -- this contains your "secret key" that will be used to generate your `client_secret`. -- Click `Done` at the top right. - -## Generate a `client_secret` - -The `secret key` you downloaded is used to create the `client_secret` string you'll need to authenticate your users. - -According to the [Apple Docs](https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens) it needs to be a JWT -token encrypted using the Elliptic Curve Digital Signature Algorithm (ECDSA) with the P-256 curve and the SHA-256 hash algorithm. - -At this time, the easiest way to generate this JWT token is with [Ruby](https://www.ruby-lang.org/en/). -If you don't have Ruby installed, you can [Download Ruby Here](https://www.ruby-lang.org/en/downloads). - -- Install Ruby (or check to make sure it's installed on your system). -- Install [ruby-jwt](https://github.com/jwt/ruby-jwt). -- From the command line, run: `sudo gem install jwt`. - -Create the script below using a text editor: `secret_gen.rb` - -```ruby -require "jwt" - -key_file = "Path to the private key" -team_id = "Your Team ID" -client_id = "The Service ID of the service you created" -key_id = "The Key ID of the private key" - -validity_period = 180 # In days. Max 180 (6 months) according to Apple docs. - -private_key = OpenSSL::PKey::EC.new IO.read key_file - -token = JWT.encode( - { - iss: team_id, - iat: Time.now.to_i, - exp: Time.now.to_i + 86400 * validity_period, - aud: "https://appleid.apple.com", - sub: client_id - }, - private_key, - "ES256", - header_fields= - { - kid: key_id - } -) -puts token -``` - -1. Edit the `secret_gen.rb` file: - -- `key_file` = "Path to the private key you downloaded from Apple". It should look like this: `AuthKey_XXXXXXXXXX.p8`. -- `team_id` = "Your Team ID". This is found at the top right of the Apple Developer site (next to your name). -- `client_id` = "The Service ID of the service you created". This is the `Services ID` you created in the above step `Obtain a Services ID`. If you've lost this ID, you can find it in the Apple Developer Site: - - Go to `Certificates, Identifiers & Profiles`. - - Click `Identifiers` at the left. - - At the top right drop-down, select `Services IDs`. - - Find your Identifier in the list (i.e. app.com.acme.roadrunner). -- `key_id` = "The Key ID of the private key". This can be found in the name of your downloaded secret file (For a file named `AuthKey_XXXXXXXXXX.p8` your key_id is `XXXXXXXXXX`). If you've lost this ID, you can find it in the Apple Developer Site: - - Go to `Certificates, Identifiers & Profiles`. - - Click `Keys` at the left. - - Click on your newly-created key in the list. - - Look under `Key ID` to find your key_id. - -2. From the command line, run: `ruby secret_gen.rb > client_secret.txt`. -3. Your `client_secret` is now stored in this `client_secret.txt` file. - -## Add your OAuth credentials to Supabase - -- Go to your [Supabase Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `Apple Enabled` to ON. -- Enter your `client_id` and `client_secret` saved in the previous steps. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `apple` as the `provider`: - -```js -async function signInWithApple() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'apple', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Apple Developer Account](https://developer.apple.com). -- [Ruby](https://www.ruby-lang.org/en/) Docs. -- [ruby-jwt](https://github.com/jwt/ruby-jwt) library. -- Thanks to [Janak Amarasena](https://medium.com/@janakda) who did all the heavy lifting in [How to configure Sign In with Apple](https://medium.com/identity-beyond-borders/how-to-configure-sign-in-with-apple-77c61e336003). - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-azure.mdx b/apps/docs/pages/guides/auth/auth-azure.mdx deleted file mode 100644 index d75a365b1d5..00000000000 --- a/apps/docs/pages/guides/auth/auth-azure.mdx +++ /dev/null @@ -1,103 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-azure', - title: 'Login with Azure', - description: 'Add Azure OAuth to your Supabase project', -} - -To enable Azure Auth for your project, you need to set up an Azure OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Azure OAuth consists of four broad steps: - -- Create an application under Azure Active Directory. -- Obtain a `Application (client) ID` with “Sign In with Azure” capabilities. This will be used as the `client id`. -- Create a `Secret ID` with “Sign In with Azure” capabilities. The value of the secret will be used as the `client secret`. -- Add the callback url of your application to the allowlist. - -## Access your Azure Developer account - -- Go to [portal.azure.com](https://portal.azure.com/#home). -- Login and select "Azure Active Directory" under the list of Azure Services. - -## Register an application - -- Under Azure Active Directory, select "App registrations" in the side panel. -- Select "New registration". -- Choose a name and select your preferred option for the supported account types. -- Specify the "Redirect URI". -- The redirect / callback URI should look like this: `https://.supabase.co/auth/v1/callback` -- Click "Register" at the bottom of the form. - -![Register an application.](/docs/img/guides/auth-azure/azure-register-app.png) - -## Obtain a Client ID - -This will serve as the `client_id` when you make API calls to authenticate the user. - -- Once your app has been registered, the client id can be found under the [list of app registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) under the column titled "Application (client) ID". - -![Obtain the client id](/docs/img/guides/auth-azure/azure-client-id.png) - -## Obtain a Secret ID - -This will serve as the `client_secret` when you make API calls to authenticate the user. - -- Click on the name of the app registered above. -- Under "Essentials", click on "Client credentials". -- Navigate to the "Client secrets" tab and select "New client secret". -- Enter a description and choose your preferred expiry for the secret. -- Once the secret is generated, save the `value` (not the secret ID). - -![Obtain the client secret](/docs/img/guides/auth-azure/azure-client-secret.png) - -## Obtain the Tenant URL - -This will allow your users to use your custom Azure login page when logging in. - -- Select the Directory (Tenant) ID value. -- The Azure Tenant URL should look like this: `https://login.microsoftonline.com/` - -![Obtain the tenant url](/docs/img/guides/auth-azure/azure-tenant-url.png) - -## Add login code to your client app - - - -Supabase Auth requires that Azure returns a valid email address. Therefore you must request the `email` scope in the `signIn` method above. - - - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `azure` as the `provider`: - -```js -async function signInWithAzure() { - const { data, error } = await supabase.auth.signInWithOAuth( - { - provider: 'azure', - }, - { - scopes: 'email', - } - ) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Azure Developer Account](https://portal.azure.com) -- [GitHub Discussion](https://github.com/supabase/gotrue/pull/54#issuecomment-757043573) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-bitbucket.mdx b/apps/docs/pages/guides/auth/auth-bitbucket.mdx deleted file mode 100644 index 626b1ef3cf7..00000000000 --- a/apps/docs/pages/guides/auth/auth-bitbucket.mdx +++ /dev/null @@ -1,95 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-bitbucket', - title: 'Login with Bitbucket', - description: 'Add Bitbucket OAuth to your Supabase project', -} - -To enable Bitbucket Auth for your project, you need to set up a BitBucket OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Bitbucket logins for your application consists of 3 parts: - -- Create and configure a Bitbucket OAuth Consumer on [Bitbucket](https://bitbucket.org) -- Add your Bitbucket OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Bitbucket account - -- Go to [bitbucket.org](https://bitbucket.org/). -- Click on `Login` at the top right to log in. - -![Bitbucket Developer Portal.](/docs/img/guides/auth-bitbucket/bitbucket-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Bitbucket OAuth app - -- Click on your profile icon at the bottom left -- Click on `All Workspaces` -- Select a workspace and click on it to select it -- Click on `Settings` on the left -- Click on `OAuth consumers` on the left under `Apps and Features` (near the bottom) -- Click `Add Consumer` at the top -- Enter the name of your app under `Name` -- In `Callback URL`, type the callback URL of your app -- Check the permissions you need (Email, Read should be enough) -- Click `Save` at the bottom -- Click on your app name (the name of your new OAuth Consumer) -- Copy your `Key` (`client_key`) and `Secret` (`client_secret`) codes - -## Add your Bitbucket credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Bitbucket Enabled` to ON -- Enter your `client_id` and `client_secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `bitbucket` as the `provider`: - -```js -async function signInWithBitbucket() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'bitbucket', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Bitbucket Account](https://bitbucket.org) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-discord.mdx b/apps/docs/pages/guides/auth/auth-discord.mdx deleted file mode 100644 index dc599979d0e..00000000000 --- a/apps/docs/pages/guides/auth/auth-discord.mdx +++ /dev/null @@ -1,97 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-discord', - title: 'Login with Discord', - description: 'Add Discord OAuth to your Supabase project', -} - -To enable Discord Auth for your project, you need to set up a Discord Application and add the Application OAuth credentials to your Supabase Dashboard. - -## Overview - -Setting up Discord logins for your application consists of 3 parts: - -- Create and configure a Discord Application [Discord Developer Portal](https://discord.com/developers) -- Add your Discord OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Discord account - -- Go to [discord.com](https://discord.com/). -- Click on `Login` at the top right to log in. - -![Discord Portal.](/docs/img/guides/auth-discord/discord-portal.png) - -- Once logged in, go to [discord.com/developers](https://discord.com/developers). - -![Discord Portal.](/docs/img/guides/auth-discord/discord-developer-portal.png) - -## Find your callback URL - -In the next step you require a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Discord Application - -- Click on `New Application` at the top right. -- Enter the name of your application and click `Create`. -- Click on `OAuth2` under `Settings` in the left side panel. -- Click `Add Redirect` under `Redirects`. -- Type or paste your `callback URL` into the `Redirects` box. -- Click `Save Changes` at the bottom. -- Copy your `Client ID` and `Client Secret` under `Client information`. - -## Add your Discord credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Discord Enabled` to ON -- Enter your `client_id` and `client_secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `discord` as the `provider`: - -```js -async function signInWithDiscord() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'discord', - }) -} -``` - -If your user is already signed in, Discord prompts the user again for authorization. - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Discord Account](https://discord.com) -- [Discord Developer Portal](https://discord.com/developers) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-facebook.mdx b/apps/docs/pages/guides/auth/auth-facebook.mdx deleted file mode 100644 index 43658f38b00..00000000000 --- a/apps/docs/pages/guides/auth/auth-facebook.mdx +++ /dev/null @@ -1,112 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-facebook', - title: 'Login with Facebook', - description: 'Add Facebook OAuth to your Supabase project', -} - -To enable Facebook Auth for your project, you need to set up a Facebook OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Facebook logins for your application consists of 3 parts: - -- Create and configure a Facebook Application on the [Facebook Developers Site](https://developers.facebook.com) -- Add your Facebook keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Facebook Developer account - -- Go to [developers.facebook.com](https://developers.facebook.com). -- Click on `Log In` at the top right to log in. - -![Facebook Developer Portal.](/docs/img/guides/auth-facebook/facebook-portal.png) - -## Create a Facebook App - -- Click on `My Apps` at the top right. -- Click `Create App` near the top right. -- Select your app type and click `Continue`. -- Fill in your app information, then click `Create App`. -- This should bring you to the screen: `Add Products to Your App`. (Alternatively you can click on `Add Product` in the left sidebar to get to this screen.) - -## Find your callback URI - -The next step requires a callback URI, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Set up FaceBook Login for your Facebook App - -From the `Add Products to your App` screen: - -- Click `Setup` under `Facebook Login` -- Skip the Quickstart screen, instead, in the left sidebar, click `Settings` under `Facebook Login` -- Enter your callback URI under `Valid OAuth Redirect URIs` on the `Facebook Login Settings` page -- Enter this in the `Valid OAuth Redirect URIs` box -- Click `Save Changes` at the bottom right - -Be aware that you have to set the right access levels on your Facebook App to enable 3rd party applications to read the email address. -From the `App Review -> Permissions and Features` screen: - -- Click the button `Request Advanced Access` on the right side of `public_profile` and `email` - -You can read more about access levels [here](https://developers.facebook.com/docs/graph-api/overview/access-levels/) - -## Copy your Facebook App ID and Secret - -- Click `Settings / Basic` in the left sidebar -- Copy your App ID from the top of the `Basic Settings` page -- Under `App Secret` click `Show` then copy your secret -- Make sure all required fields are completed on this screen. - -## Enter your Facebook App ID and Secret into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Facebook Enabled` to ON -- Enter your `Facebook client ID` and `Facebook secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `facebook` as the `provider`: - -```js -async function signInWithFacebook() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'facebook', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Facebook Developers Dashboard](https://developers.facebook.com/) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-github.mdx b/apps/docs/pages/guides/auth/auth-github.mdx deleted file mode 100644 index 6ddcdac1ede..00000000000 --- a/apps/docs/pages/guides/auth/auth-github.mdx +++ /dev/null @@ -1,105 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-github', - title: 'Login with GitHub', - description: 'Add GitHub OAuth to your Supabase project', -} - -To enable GitHub Auth for your project, you need to set up a GitHub OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up GitHub logins for your application consists of 3 parts: - -- Create and configure a GitHub OAuth App on [GitHub](https://github.com) -- Add your GitHub OAuth keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your GitHub account - -- Go to [github.com](https://github.com). -- Click on `Sign In` at the top right to log in. - -![GitHub Developer Portal.](/docs/img/guides/auth-github/github-portal.png) - -## Create a GitHub Oauth App - -Go to the [GitHub Developer Settings](https://github.com/settings/developers) page: - -- Click on your profile photo at the top right -- Click Settings near the bottom of the menu -- In the left sidebar, click `Developer settings` (near the bottom) -- In the left sidebar, click `OAuth Apps` - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Register a new OAuth application - -- Click `Register a new application`. If you've created an app before, click `New OAuth App` here. -- In `Application name`, type the name of your app. -- In `Homepage URL`, type the full URL to your app's website. -- In `Authorization callback URL`, type the callback URL of your app. -- Enter the URL in the `Valid OAuth Redirect URIs` box. -- Click `Save Changes` at the bottom right. -- Click `Register Application`. - -Copy your new OAuth credentials - -- Copy and save your `Client ID`. -- Click `Generate a new client secret`. -- Copy and save your `Client secret`. - -## Enter your GitHub credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `GitHub Enabled` to ON -- Enter your `GitHub Client ID` and `GitHub Client Secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `github` as the `provider`: - -```js -async function signInWithGitHub() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'github', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [GitHub Developer Settings](https://github.com/settings/developers) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-gitlab.mdx b/apps/docs/pages/guides/auth/auth-gitlab.mdx deleted file mode 100644 index 870c292a0b8..00000000000 --- a/apps/docs/pages/guides/auth/auth-gitlab.mdx +++ /dev/null @@ -1,92 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-gitlab', - title: 'Login with GitLab', - description: 'Add GitLab OAuth to your Supabase project', -} - -To enable GitLab Auth for your project, you need to set up a GitLab OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up GitLab logins for your application consists of 3 parts: - -- Create and configure a GitLab Application on [GitLab](https://gitlab.com) -- Add your GitLab Application keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your GitLab account - -- Go to [gitlab.com](https://gitlab.com). -- Click on `Login` at the top right to log in. - -![GitLab Developer Portal.](/docs/img/guides/auth-gitlab/gitlab-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create your GitLab Application - -- Click on your `profile logo` (avatar) in the top-right corner. -- Select `Edit profile`. -- In the left sidebar, select Applications. -- Enter the name of the application. -- In the `Redirect URI` box, type the callback URL of your app. -- Check the box next to `Confidential` (make sure it is checked). -- Check the scope named `read_user` (this is the only required scope). -- Click `Save Application` at the bottom. -- Copy and save your `Application ID` (`client_id`) and `Secret` (`client_secret`) which you'll need later. - -## Add your GitLab credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `GitLab Enabled` to ON. -- Enter your `client_id` and `client_secret` saved in the previous step. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `gitlab` as the `provider`: - -```js -async function signInWithGitLab() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'gitlab', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [GitLab Account](https://gitlab.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-google.mdx b/apps/docs/pages/guides/auth/auth-google.mdx deleted file mode 100644 index 4a8a2c3b222..00000000000 --- a/apps/docs/pages/guides/auth/auth-google.mdx +++ /dev/null @@ -1,120 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-google', - title: 'Login with Google', - description: 'Add Google OAuth to your Supabase project', -} - -To enable Google Auth for your project, you need to set up a Google OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Google logins for your application consists of 3 parts: - -- Create and configure a Google Project on the [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard) -- Add your Google OAuth keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Google Cloud Platform account - -- Go to [cloud.google.com](https://cloud.google.com). -- Click on `Sign in` at the top right to log in. - -![Google Developer Portal.](/docs/img/guides/auth-google/google-portal.png) - -## Create a Google Cloud Platform Project - -- Click on `Select a Project` at the top left. - - (Or, if a project is currently selected, click on the current project name at the top left.) -- Click `New Project` at the top right. -- Fill in your app information, then click `Create`. - - (This can take a few minutes.) -- This should bring you to the dashboard for your new project. - -## Create the OAuth Keys for your project - -From your project's dashboard screen: - -- In the search bar at the top labeled `Search products and resources` type `OAuth`. -- Click on `OAuth consent screen` from the list of results. -- On the `OAuth consent screen` page select `External`. -- Click `Create`. - -## Edit your app information - -- On the `Edit app registration` page fill out your app information. -- Click `Save and continue` at the bottom. - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create your Google credentials - -- Click `Credentials` at the left to go to the `Credentials` page on the Google Cloud Platform console. -- Click `Create Credentials` near the top then select `OAuth client ID` -- On the `Create OAuth client ID` page, select your application type. If you're not sure, choose `Web application`. -- Fill in your app name. -- At the bottom, under `Authorized redirect URIs` click `Add URI`. -- Enter your callback URI under `Authorized redirect URIs` at the bottom. -- Enter your callback URI in the `Valid OAuth Redirect URIs` box. -- Click `Save Changes` at the bottom right. -- Click `Create`. - -Copy your new OAuth credentials - -- A box will appear called `OAuth client created`. -- Copy and save the values under `Your Client ID` and `Your Client Secret`. - -## Enter your Google credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Google Enabled` to ON -- Enter your `Google Client ID` and `Google Client Secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `google` as the `provider`: - -```js -async function signInWithGoogle() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'google', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-keycloak.mdx b/apps/docs/pages/guides/auth/auth-keycloak.mdx deleted file mode 100644 index b0078e6cfae..00000000000 --- a/apps/docs/pages/guides/auth/auth-keycloak.mdx +++ /dev/null @@ -1,92 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-keycloak', - title: 'Login with Keycloak', - description: 'Add Keycloak OAuth to your Supabase project', -} - -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. - -## Overview - -To get started with Keycloak, you can run it in a docker container with: `docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -p 8080:8080 jboss/keycloak:latest` - -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: - -- Create a new client in your specified keycloak realm. -- Obtain the `issuer` from the "OpenID Endpoint Configuration". This will be used as the `Keycloak URL`. -- Ensure that the new client has the "Client Protocol" set to "openid-connect" and the "Access Type" is set to "confidential". -- The `Client ID` of the client created will be used as the `client id`. -- Obtain the `Secret` from the credentials tab which will be used as the `client secret`. -- Add the callback url of your application to your allowlist. - -## Access your Keycloak Admin console - -- Login by visiting [`http://localhost:8080`](http://localhost:8080) and clicking on "Administration Console". - -## Create a Keycloak Realm - -- Once you've logged in to the Keycloak console, you can add a realm from the side panel. The default realm should be named "Master". -- After you've added a new realm, you can retrieve the `issuer` from the "OpenID Endpoint Configuration" endpoint. The `issuer` will be used as the `Keycloak URL`. -- You can find this endpoint from the realm settings under the "General Tab" or visit [`http://localhost:8080/realms/my_realm_name/.well-known/openid-configuration`](http://localhost:8080/realms/my_realm_name/.well-known/openid-configuration) - -![Add a Keycloak Realm.](/docs/img/guides/auth-keycloak/keycloak-create-realm.png) - -## Create a Keycloak Client - -The "Client ID" of the created client will serve as the `client_id` when you make API calls to authenticate the user. - -![Add a Keycloak client](/docs/img/guides/auth-keycloak/keycloak-add-client.png) - -## Client Settings - -After you've created the client successfully, ensure that you set the following settings: - -1. The "Client Protocol" should be set to "openid-connect". -2. The "Access Type" should be set to "confidential". -3. The "Valid Redirect URIs" should be set to: `https://.supabase.co/auth/v1/callback`. - -![Obtain the client id, set the client protocol and access type](/docs/img/guides/auth-keycloak/keycloak-client-id.png) -![Set redirect uri](/docs/img/guides/auth-keycloak/keycloak-redirect-uri.png) - -## Obtain the Client Secret - -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`. - -![Obtain the client secret](/docs/img/guides/auth-keycloak/keycloak-client-secret.png) - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `keycloak` as the `provider`: - -```js -async function signInWithKeycloak() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'keycloak', - options: { - scopes: 'openid', - }, - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- You can find the keycloak openid endpoint configuration under the realm settings. - ![Keycloak OpenID Endpoint Configuration](/docs/img/guides/auth-keycloak/keycloak-openid-endpoint-config.png) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-linkedin.mdx b/apps/docs/pages/guides/auth/auth-linkedin.mdx deleted file mode 100644 index 22fb6f1f05e..00000000000 --- a/apps/docs/pages/guides/auth/auth-linkedin.mdx +++ /dev/null @@ -1,91 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-linkedin', - title: 'Login with LinkedIn', - description: 'Add LinkedIn OAuth to your Supabase project', -} - -To enable LinkedIn Auth for your project, you need to set up a LinkedIn OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up LinkedIn logins for your application consists of 3 parts: - -- Create and configure a LinkedIn Project and App on the [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). -- Add your LinkedIn `client_id` and `client_secret` to your [Supabase Project](https://app.supabase.com). -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). - -## Access your LinkedIn Developer account - -- Go to [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). -- Log in (if necessary.) - -![LinkedIn Developer Portal](/docs/img/guides/auth-linkedin/linkedin_developers_page.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a LinkedIn OAuth app - -- Go to [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). -- Click on `Create App` at the top right -- Enter your `LinkedIn Page` and `App Logo` -- Save your app -- Click `Auth` from the top menu -- Add your `Redirect URL` to the `Authorized Redirect URLs for your app` section -- Copy and save your newly-generated `Client ID` -- Copy and save your newly-generated `Client Secret` - -## Enter your LinkedIn credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `LinkedIn Enabled` to ON. -- Enter your `client_id` and `client_secret` saved in the previous step. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `linkedin` as the `provider`: - -```js -async function signInWithLinkedIn() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'linkedin', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [LinkedIn Developer Dashboard](https://api.LinkedIn.com/apps) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-magic-link.mdx b/apps/docs/pages/guides/auth/auth-magic-link.mdx deleted file mode 100644 index 181954436ae..00000000000 --- a/apps/docs/pages/guides/auth/auth-magic-link.mdx +++ /dev/null @@ -1,96 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-magic-link', - title: 'Login With Magic Link', - description: 'Use Supabase to authenticate and authorize your users using magic links.', -} - -Magic links are a form of passwordless logins where users click on a link sent to their email address to log in to their accounts. -Magic links only work with email addresses. By default, a user can only request a magic link once every 60 seconds. - -## Overview - -Setting up Magic Link logins for your Supabase application. - -- Add Magic Link authenticator to your [Supabase Project](https://app.supabase.com) -- Add the login code to your application - [JavaScript](https://github.com/supabase/supabase-js) | [Flutter](https://github.com/supabase/supabase-flutter) - -## Add Magic Link into your Supabase Project - -1. For [Site URL](https://app.supabase.com/project/_/auth/url-configuration), enter the final (hosted) URL of your app. -1. For [Auth Providers](https://app.supabase.com/project/_/auth/providers), **enable email provider**. - -## Add login code to your client app - - - - -When your user signs in, call [signInWithOtp()](/docs/reference/javascript/auth-signinwithotp) with their email address: - -```js -async function signInWithEmail() { - const { data, error } = await supabase.auth.signInWithOtp({ - email: 'example@email.com', - }) -} -``` - - - - -When your user signs in, call [signIn()](/docs/reference/dart/auth-signinwithotp) with their email address: - -```dart -Future signInWithEmail() async { - final AuthResponse res = await supabase.auth.signinwithotp(email: 'example@email.com'); -} -``` - - - - - - - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signOut() { - const { error } = await supabase.auth.signOut() -} -``` - - - - -When your user signs out, call [signOut()](/docs/reference/dart/auth-signout) to remove them from the browser session and any objects from localStorage: - -```dart -Future signOut() async { - await supabase.auth.signOut(); -} -``` - - - - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Supabase Flutter Client](https://github.com/supabase/supabase-flutter) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-messagebird.mdx b/apps/docs/pages/guides/auth/auth-messagebird.mdx deleted file mode 100644 index 38651a9876d..00000000000 --- a/apps/docs/pages/guides/auth/auth-messagebird.mdx +++ /dev/null @@ -1,284 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-messagebird', - title: 'Phone Auth with MessageBird', - description: 'How to set up and use Mobile OTP with MessageBird and Supabase.', -} - -## Overview - -In this guide we'll show you how to authenticate your users with SMS based OTP (One-Time Password) tokens. - -There are two reasons to use Supabase SMS OTP tokens: - -- You want users to log in with mobile + password, and the mobile should be verified via SMS -- You want users to log in with mobile ONLY (i.e. passwordless login) - -We'll cover: - -- [Finding your MessageBird credentials](#finding-your-messagebird-credentials) -- [Using OTP with password based logins](#using-otp-with-password-based-logins) -- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) - -What you'll need: - -- A MessageBird account (sign up here: https://dashboard.messagebird.com/en/sign-up) -- A Supabase project (create one here: https://app.supabase.com) -- A mobile phone capable of receiving SMS - -## Steps - -### Finding your MessageBird credentials - -Start by logging into your MessageBird account and verify the mobile number you'll be using to test with: https://dashboard.messagebird.com/en/getting-started/sms - -This is the number that will be receiving the SMS OTPs. - -![Verify your own phone number](/docs/img/guides/auth-messagebird/1.png) - -![Get your API Keys](/docs/img/guides/auth-messagebird/2.png) - -Navigate to the [dashboard settings](https://dashboard.messagebird.com/en/settings/sms) to set the default originator. The messagebird originator is the name or number from which the message is sent. -For more information, you can refer to the messagebird article on choosing an originator [here](https://support.messagebird.com/hc/en-us/articles/115002628665-Choosing-an-originator) - -![Set the default originator](/docs/img/guides/auth-messagebird/3.png) - -You will need the following values to get started: - -- Live API Key / Test API Key -- MessageBird originator - -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). - -You should see an option to enable Phone Signup. - -![Enable Phone Sign-Up](/docs/img/guides/auth-twilio/7.png) - -Toggle it on, and copy the 2 values over from the messagebird dashboard. Click save. - -Note: If you use the Test API Key, the OTP will not be delivered to the mobile number specified but messagebird will log the response in the dashboard. -If the Live API Key is used instead, the OTP will be delivered and there will be a deduction in your free credits. - -Plugin MessageBird credentials - -Now the backend should be setup, we can proceed to add our client-side code! - -#### SMS custom template - -The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. - -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). - -Use the variable `.Code` in the template to display the code. - -### Using OTP with password based logins - -In this use scenario we'll be using the user's mobile phone number as an alternative to an email address when signing up along with a password. You may want to think hard about the permanency of this however. It is not uncommon for mobile phone numbers to be recycled by phone networks when users cancel their phone contracts or move countries, therefore granting access to the user's account to whoever takes over the phone number in the future. Soon we'll add multi-factor auth, which will mitigate this risk, but for now you may want to give some thought to allowing your users to recover their account by some other means in an emergency. - -Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: - - - - -```js -let { user, error } = await supabase.auth.signUp({ - phone: '+13334445555', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/signup' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555", - "password": "some-password" -}' -``` - - - - -The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. - -You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '+13334445555', - token: '123456', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "+13334445555", - "token": "123456" -}' -``` - - - - -If successful the user will now be logged in and you should receive a valid session like: - -```json -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" -} -``` - -The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. - -Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: - - - - -```js -let { user, error } = await supabase.auth.signInWithPassword({ - phone: '+13334445555', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/token?grant_type=password' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555", - "password": "some-password" -}' -``` - - - - -### Using OTP as a passwordless sign-in mechanism - -In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. - -In javascript we can use the `signIn` method with a single parameter: `phone` - - - - -```js -let { user, error } = await supabase.auth.signInWithOtp({ - phone: '+13334445555', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/otp' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555" -}' -``` - - - - -The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '+13334445555', - token: '123456', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "+13334445555", - "token": "123456" -}' -``` - - - - -and the response should also be the same as above: - -```json -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" -} -``` - -The user does not have a password therefore will need to sign in via this method each time they want to access your service. - -## Resources - -- [MessageBird Signup](https://dashboard.messagebird.com/en/sign-up) -- [Supabase Dashboard](https://app.supabase.com) -- [Supabase Row Level Security](/docs/guides/auth#row-level-security) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-notion.mdx b/apps/docs/pages/guides/auth/auth-notion.mdx deleted file mode 100644 index 1f1d74e465a..00000000000 --- a/apps/docs/pages/guides/auth/auth-notion.mdx +++ /dev/null @@ -1,95 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-notion', - title: 'Login with Notion', - description: 'Add Notion OAuth to your Supabase project', -} - -To enable Notion Auth for your project, you need to set up a Notion Application and add the Application OAuth credentials to your Supabase Dashboard. - -## Overview - -Setting up Notion logins for your application consists of 3 parts: - -- Create and configure a Notion Application [Notion Developer Portal](https://www.notion.so/my-integrations) -- Retrieve your OAuth client ID and OAuth client secret and add them to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Create your notion integration - -- Go to [developers.notion.com](https://developers.notion.com/). -- Click "View my integrations" and login. - -![notion.so](/docs/img/guides/auth-notion/notion.png) - -- Once logged in, go to [notion.so/my-integrations](https://notion.so/my-integrations) and create a new integration. -- When creating your integration, ensure that you select "Public integration" under "Integration type" and "Read user information including email addresses" under "Capabilities". -- You will need to add a redirect uri, see [Add the redirect uri](#add-the-redirect-uri) -- Once you've filled in the necessary fields, click "Submit" to finish creating the integration. - -![notion.so](/docs/img/guides/auth-notion/notion-developer.png) - -## Add the redirect URI - -- After selecting "Public integration", you should see an option to add "Redirect URIs". - -![notion.so](/docs/img/guides/auth-notion/notion-redirect-uri.png) - -You can retrieve the redirect uri with the following steps: - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - -Your redirect uri should look like the following: `https://.supabase.co/auth/v1/callback` - - - -## Add your Notion credentials into your Supabase Project - -- Once you've created your notion integration, you should be able to retrieve the "OAuth client ID" and "OAuth client secret" from the "OAuth Domain and URIs" tab. - -![notion.so](/docs/img/guides/auth-notion/notion-creds.png) - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Under `External OAuth Providers` turn `Notion Enabled` to ON -- Enter the "OAuth client ID" and "OAuth client secret" obtained in the `client id` and `client secret` fields. -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `notion` as the `provider`: - -```js -async function signInWithNotion() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'notion', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Notion Account](https://notion.so) -- [Notion Developer Portal](https://www.notion.so/my-integrations) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-slack.mdx b/apps/docs/pages/guides/auth/auth-slack.mdx deleted file mode 100644 index 6d700e6f961..00000000000 --- a/apps/docs/pages/guides/auth/auth-slack.mdx +++ /dev/null @@ -1,104 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-slack', - title: 'Login with Slack', - description: 'Add Slack OAuth to your Supabase project', -} - -To enable Slack Auth for your project, you need to set up a Slack OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Slack logins for your application consists of 3 parts: - -- Create and configure a Slack Project and App on the [Slack Developer Dashboard](https://api.slack.com/apps). -- Add your Slack `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). - -## Access your Slack Developer account - -- Go to [api.slack.com](https://api.slack.com/apps). -- Click on `Your Apps` at the top right to log in. - -![Slack Developer Portal.](/docs/img/guides/auth-slack/slack-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Slack OAuth app - -- Go to [api.slack.com](https://api.slack.com/apps). -- Click on `Create an App` - -Under `Create an app...`: - -- Click `From scratch` -- Type the name of your app -- Select your `Slack Workspace` -- Click `Create App` - -Under `App Credentials`: - -- Copy and save your newly-generated `Client ID` -- Copy and save your newly-generated `Client Secret` -- Click `Permissions` - -Under `Redirect URLs`: - -- Click `Add New Redirect URL` -- Paste your `Callback URL` then click `Add` -- Click `Save URLs` - -## Enter your Slack credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `Slack Enabled` to ON. -- Enter your `Client ID` (`client_id`) and `Client Secret` (`client_secret`) saved in the previous step. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `slack` as the `provider`: - -```js -async function signInWithSlack() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'slack', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Slack Developer Dashboard](https://api.slack.com/apps) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-spotify.mdx b/apps/docs/pages/guides/auth/auth-spotify.mdx deleted file mode 100644 index c5f3a0872f2..00000000000 --- a/apps/docs/pages/guides/auth/auth-spotify.mdx +++ /dev/null @@ -1,99 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-spotify', - title: 'Login with Spotify', - description: 'Add Spotify OAuth to your Supabase project', -} - -To enable Spotify Auth for your project, you need to set up a Spotify OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Spotify logins for your application consists of 3 parts: - -- Create and configure a Spotify Project and App on the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/). -- Add your Spotify `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). - -## Access your Spotify Developer account - -- Log into [Spotify](https://spotify.com) -- Access the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) - -![Spotify Developer Portal.](/docs/img/guides/auth-spotify/spotify-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Spotify OAuth app - -- Log into [Spotify](https://spotify.com). -- Go to the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) -- Click `Create an App` -- Type your `App name` -- Type your `App description` -- Check the box to agree with the `Developer TOS and Branding Guidelines` -- Click `Create` -- Save your `Client ID` -- Save your `Client Secret` -- Click `Edit Settings` - -Under `Redirect URIs`: - -- Paste your Supabase Callback URL in the box -- Click `Add` -- Click `Save` at the bottom - -## Enter your Spotify credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `Spotify Enabled` to ON. -- Enter your `Client ID` (`client_id`) and `Client Secret` (`client_secret`) saved in the previous step. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `spotify` as the `provider`: - -```js -async function signInWithSpotify() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'spotify', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-twitch.mdx b/apps/docs/pages/guides/auth/auth-twitch.mdx deleted file mode 100644 index fab1f8e42e3..00000000000 --- a/apps/docs/pages/guides/auth/auth-twitch.mdx +++ /dev/null @@ -1,111 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-twitch', - title: 'Login with Twitch', - description: 'Add Twitch OAuth to your Supabase project', -} - -To enable Twitch Auth for your project, you need to set up a Twitch Application and add the Application OAuth credentials to your Supabase Dashboard. - -## Overview - -Setting up Twitch logins for your application consists of 3 parts: - -- Create and configure a Twitch Application [Twitch Developer Console](https://dev.twitch.tv/console) -- Add your Twitch OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Twitch Developer account - -- Go to [dev.twitch.tv](https://dev.twitch.tv). -- Click on `Log in with Twitch` at the top right to log in. -- If you have not already enabled 2-Factor Authentication for your Twitch Account, you will need to do that at [Twitch Security Settings](https://www.twitch.tv/settings/security) before you can continue. - -![Twitch Developer Page](/docs/img/guides/auth-twitch/twitch-developer-page.png) - -- Once logged in, go to the [Twitch Developer Console](https://dev.twitch.tv/console). - -![Twitch Developer Console](/docs/img/guides/auth-twitch/twitch-console.png) - -## Find your callback URL - -In the next step you require a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Twitch Application - -![Twitch Developer Console](/docs/img/guides/auth-twitch/twitch-console.png) - -- Click on `+ Register Your Application` at the top right. - -![Register Application](/docs/img/guides/auth-twitch/twitch-register-your-application.png) - -- Enter the name of your application. -- Type or paste your `OAuth Redirect URL` (the callback URL from the previous step.) -- Select a category for your app. -- Check the Captcha box and click `Create`. - -## Retrieve your Twitch OAuth Client ID and Client Secret - -- Click `Manage` at the right of your application entry in the list. - -![Twitch Applications List](/docs/img/guides/auth-twitch/twitch-applications-list.png) - -- Copy your Client ID. -- Click `New Secret` to create a new Client Secret. -- Copy your Client Secret. - -![Get Client ID and Secret](/docs/img/guides/auth-twitch/twitch-get-keys.png) - -## Add your Twitch credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Twitch Enabled` to ON -- Enter your `client_id` and `client_secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `twitch` as the `provider`: - -```js -async function signInWithTwitch() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'twitch', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Twitch Account](https://twitch.tv) -- [Twitch Developer Console](https://dev.twitch.tv/console) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-twitter.mdx b/apps/docs/pages/guides/auth/auth-twitter.mdx deleted file mode 100644 index 40cf31af0da..00000000000 --- a/apps/docs/pages/guides/auth/auth-twitter.mdx +++ /dev/null @@ -1,100 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-twitter', - title: 'Login with Twitter', - description: 'Add Twitter OAuth to your Supabase project', -} - -To enable Twitter Auth for your project, you need to set up a Twitter OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Twitter logins for your application consists of 3 parts: - -- Create and configure a Twitter Project and App on the [Twitter Developer Dashboard](https://developer.twitter.com/en/portal/dashboard). -- Add your Twitter `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). - -## Access your Twitter Developer account - -- Go to [developer.twitter.com](https://developer.twitter.com). -- Click on `Sign in` at the top right to log in. - -![Twitter Developer Portal.](/docs/img/guides/auth-twitter/twitter-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Twitter OAuth app - -- Click `+ Create Project`. - - Enter your project name, click `Next`. - - Select your use case, click `Next`. - - Enter a description for your project, click `Next`. - - Enter a name for your app, click `Complete`. - - Copy and save your `API Key` (this is your `client_id`). - - Copy and save your `API Secret Key` (this is your `client_secret`). -- At the bottom, under `Next, setup your App` click the link `enable 3rd party authentication`. -- Under `App Settings`, click on the gear icon next to your app name to go to `App Settings`. -- At the bottom, next to `Authentication settings`, click `Edit`. -- Turn `Enable 3-legged OAuth` ON. -- Turn `Request email address from users` ON. -- Enter your `Callback URL`. -- Enter your `Website URL`. -- Enter your `Terms of service URL`. -- Enter your `Privacy policy URL`. -- Click `Save`. - -## Enter your Twitter credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- In the left sidebar, click the `Authentication` icon (near the top). -- Click `Settings` from the list to go to the `Authentication Settings` page. -- Enter the final (hosted) URL of your app under `Site URL` (this is important). -- Under `External OAuth Providers` turn `Twitter Enabled` to ON. -- Enter your `API Key` (`client_id`) and `API Secret Key` (`client_secret`) saved in the previous step. -- Click `Save`. - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `twitter` as the `provider`: - -```js -async function signInWithTwitter() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'twitter', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Twitter Developer Dashboard](https://developer.twitter.com/en/portal/dashboard) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-vonage.mdx b/apps/docs/pages/guides/auth/auth-vonage.mdx deleted file mode 100644 index 5ebe1de41d0..00000000000 --- a/apps/docs/pages/guides/auth/auth-vonage.mdx +++ /dev/null @@ -1,277 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-vonage', - title: 'Phone Auth with Vonage', - description: 'How to set up and use Mobile OTP with Vonage and Supabase.', -} - -## Overview - -In this guide we'll show you how to authenticate your users with SMS based OTP (One-Time Password) tokens. - -There are two reasons to use Supabase SMS OTP tokens: - -- You want users to log in with mobile + password, and the mobile should be verified via SMS -- You want users to log in with mobile ONLY (i.e. passwordless login) - -We'll cover: - -- [Getting your Vonage API Key](#finding-your-vonage-api-key) -- [Using OTP with password based logins](#using-otp-with-password-based-logins) -- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) - -What you'll need: - -- A Vonage account (sign up here: https://dashboard.nexmo.com/sign-up) -- A Supabase project (create one here: https://app.supabase.com) -- A mobile phone capable of receiving SMS - -## Steps - -### Getting your Vonage credentials - -Start by logging into your Vonage Dashboard at https://dashboard.nexmo.com/ - -You will see you API Key and API Secret here, which is actually all you need to get started. - -In most countries, a phone number is actually optional and you can also use any Alphanumeric Sender ID of up to 11 characters length (8 for India) as a Sender ID (from). This means you do not need a number to test with in most cases. - -To find out more about supported countries for Alphanumeric Sender ID, check this overview: https://help.nexmo.com/hc/en-us/articles/115011781468-SMS-Features-Overview-Outbound-only- - -Hint: Some countries might need a Sender ID Registration to allow sending with an Alphanumeric Sender ID. You can find this information in the help article as well. If Alpha Sender IDs are not supported, you will need to buy a phone number. - -### Getting a phone number (optional) - -If you want a phone number to send SMS from, you can buy one from the Vonage Dashboard under Numbers > Buy Numbers (https://dashboard.nexmo.com/buy-numbers). - -Select the country you want a number for. You will need a mobile phone number with SMS or SMS+Voice capability. After you have bought the number, you will be able to send SMS from it. - -### Configure Supabase - -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). - -You should see an option to enable Phone Signup. - -Toggle it on, and copy the api key, api secret and optionally phone number values over from the Vonage dashboard. Click save. - -Now the backend should be setup, we can proceed to add our client-side code! - -#### SMS custom template - -The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. - -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). - -Use the variable `.Code` in the template to display the code. - -### Using OTP with password based logins - -In this use scenario we'll be using the user's mobile phone number as an alternative to an email address when signing up along with a password. You may want to think hard about the permanency of this however. It is not uncommon for mobile phone numbers to be recycled by phone networks when users cancel their phone contracts or move countries, therefore granting access to the user's account to whoever takes over the phone number in the future. - -Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: - - - - -```js -let { user, error } = await supabase.auth.signUp({ - phone: '491512223334444', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://xxx.supabase.co/auth/v1/signup' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "491512223334444", - "password": "some-password" -}' -``` - - - - -The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. - -You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '491512223334444', - token: '123456', -}) -``` - - - - -```bash -curl -X POST 'https://xxx.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "491512223334444", - "token": "123456" -}' -``` - - - - -If successful the user will now be logged in and you should receive a valid session like: - -```json -{ - "access_token": "eyJxxx...", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "yyy..." -} -``` - -The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. - -Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: - - - - -```js -let { user, error } = await supabase.auth.signInWithPassword({ - phone: '491512223334444', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://xxx.supabase.co/auth/v1/token?grant_type=password' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "491512223334444", - "password": "some-password" -}' -``` - - - - -### Using OTP as a passwordless sign-in mechanism - -In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. - -In javascript we can use the `signIn` method with a single parameter: `phone` - - - - -```js -let { user, error } = await supabase.auth.signInWithOtp({ - phone: '491512223334444', -}) -``` - - - - -```bash -curl -X POST 'https://xxx.supabase.co/auth/v1/otp' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "491512223334444" -}' -``` - - - - -The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '491512223334444', - token: '123456', -}) -``` - - - - -```bash -curl -X POST 'https://xxx.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "491512223334444", - "token": "123456" -}' -``` - - - - -and the response should also be the same as above: - -```json -{ - "access_token": "eyJxxx...", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "yyy..." -} -``` - -The user does not have a password therefore will need to sign in via this method each time they want to access your service. - -## Resources - -- [Vonage Signup](https://dashboard.nexmo.com/sign-up) -- [Supabase Dashboard](https://app.supabase.com) -- [Supabase Row Level Security](/docs/guides/auth#row-level-security) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-workos.mdx b/apps/docs/pages/guides/auth/auth-workos.mdx deleted file mode 100644 index 806a838207a..00000000000 --- a/apps/docs/pages/guides/auth/auth-workos.mdx +++ /dev/null @@ -1,93 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-workos', - title: 'Login with WorkOS', - description: 'Add WorkOS OAuth to your Supabase project', -} - -To enable WorkOS Auth for your project, you need to set up WorkOS OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -In this guide, we will cover how to use Supabase OAuth with WorkOS to implement Single-Sign-On(SSO). - -The procedure consists of five broad steps: - -- Create a new organization from your WorkOS Dashboard. -- Obtain the `Client ID` from the Configuration tab and configure redirect URI. -- Obtain the `WorkOS Secret` from the credentials tab. -- Connect a WorkOS Supported Identity Provider -- Add your WorkOS credentials into your Supabase project - -## Create a WorkOS Organization - -Log in to the dashboard and hop over to the Organizations tab to create and organization -![Create an Organization](/docs/img/guides/auth-workos/workos-create-organization.png) - -## Obtain the Client ID and configure Redirect URI - -Head over to the Configuration tab and configure the redirect URI.The redirect URI should look like `https://.supabase.co/auth/v1/callback` -Note that this is distinct from the redirect URI referred to in the Supabase dashboard - -![Fetch Client ID and configure Redirect URI](/docs/img/guides/auth-workos/workos-clientid-redirect-uri.png) - -## Obtain the WorkOS Secret - -Head over to the API Keys page and obtain the secret key. - -![WorkOS Secret Key](/docs/img/guides/auth-workos/workos-secret-key.png) - -## Connect a WorkOS Supported Identity Provider - -Set up the identity provider by visiting the setup link. - -![Visiting the setup link](/docs/img/guides/auth-workos/workos-setup-identity-provider.png) - -You can pick between any one of the many identity providers that WorkOS supports. - -## Add your WorkOS credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Under `External OAuth Providers` turn `WorkOS Enabled` to ON -- Enter the `Client ID`, `Secret`, and `WorkOS URL` saved in the previous steps. The ``WorkOS URL` setting should be set to https://api.workos.com/ -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `workos` as the `provider`: - -```js -async function signInWithWorkOS() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'workos', - options: { - queryParams: { - connection: '', - organization: '', - }, - }, - }) -} -``` - -Refer to the [WorkOS Documentation](https://workos.com/docs/reference/sso/authorize/) to learn more about the different methods. - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [WorkOS Documentation](https://workos.com/docs/sso/guide) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/auth-zoom.mdx b/apps/docs/pages/guides/auth/auth-zoom.mdx deleted file mode 100644 index 13d9de860c5..00000000000 --- a/apps/docs/pages/guides/auth/auth-zoom.mdx +++ /dev/null @@ -1,100 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-zoom', - title: 'Login with Zoom', - description: 'Add Zoom OAuth to your Supabase project', -} - -To enable Zoom Auth for your project, you need to set up a Zoom OAuth application and add the application credentials to your Supabase Dashboard. - -## Overview - -Setting up Zoom logins for your application consists of 3 parts: - -- Create and configure a Zoom OAuth App on [Zoom App Marketplace](https://marketplace.zoom.us/) -- Add your Zoom OAuth keys to your [Supabase Project](https://app.supabase.com) -- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) - -## Access your Zoom Developer account - -- Go to [marketplace.zoom.us](https://marketplace.zoom.us/). -- Click on `Sign In` at the top right to log in. - -![Zoom Developer Portal.](/docs/img/guides/auth-zoom/zoom-portal.png) - -## Find your callback URL - -The next step requires a callback URL, which looks like this: - -`https://.supabase.co/auth/v1/callback` - -- Go to your [Supabase Project Dashboard](https://app.supabase.com). -- Click on the `Settings` icon at the bottom of the left sidebar. -- Click on `API` in the list. -- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. -- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. - - - -## Create a Zoom Oauth App - -- Go to [marketplace.zoom.us](https://marketplace.zoom.us/). -- Click on `Sign In` at the top right to log in. -- Click `Build App` (from the dropdown Develop) -- In the OAuth card, click `Create` -- Type the name of your app -- Choose app type -- Click `Create` - -Under `App credentials` - -- Copy and save your `Client ID`. -- Copy and save your `Client secret`. - -Under `Redirect URL for OAuth` - -- Paste your `Callback URL` -- Click `Continue` - -## Enter your Zoom credentials into your Supabase Project - -- Go to your [Supabase Project Dashboard](https://app.supabase.com) -- In the left sidebar, click the `Authentication` icon (near the top) -- Click `Settings` from the list to go to the `Authentication Settings` page -- Enter the final (hosted) URL of your app under `Site URL` (this is important) -- Under `External OAuth Providers` turn `Zoom Enabled` to ON -- Enter your `Zoom Client ID` and `Zoom Client Secret` saved in the previous step -- Click `Save` - -## Add login code to your client app - -When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `zoom` as the `provider`: - -```js -async function signInWithZoom() { - const { data, error } = await supabase.auth.signInWithOAuth({ - provider: 'zoom', - }) -} -``` - -When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: - -```js -async function signout() { - const { error } = await supabase.auth.signOut() -} -``` - -## Resources - -- [Supabase Account - Free Tier OK](https://supabase.com) -- [Supabase JS Client](https://github.com/supabase/supabase-js) -- [Zoom App Marketplace](https://marketplace.zoom.us/) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/auth/overview.mdx b/apps/docs/pages/guides/auth/overview.mdx index 210374ebf3c..85b1fdc96da 100644 --- a/apps/docs/pages/guides/auth/overview.mdx +++ b/apps/docs/pages/guides/auth/overview.mdx @@ -1,5 +1,6 @@ import Layout from '~/layouts/DefaultGuideLayout' -import OldContent from '~/pages/guides/auth.mdx' +import NewContent from '~/pages/new/auth.mdx' +import { useRouter } from 'next/router' export const meta = { id: 'auth', @@ -8,9 +9,175 @@ export const meta = { sidebar_label: 'Overview', } +## Overview + +There are two parts to every Auth system: + +- **Authentication:** should this person be allowed in? If yes, who are they? +- **Authorization:** once they are in, what are they allowed to do? + +Supabase Auth is designed to work either as a standalone product, or deeply integrated with the other Supabase products. +Postgres is at the heart of everything we do, and the Auth system follows this principle. We leverage Postgres' built-in Auth functionality wherever possible. + +Here's a quick, 2 minute tour of the Auth features built-in to Supabase: + +
+ +
+ +## Authentication + +You can authenticate your users in several ways: + +- Email & password. +- Magic links (one-click logins). +- Social providers. +- Phone logins. + +### Providers + +We provide a suite of Providers and login methods, as well as [Auth helpers](/docs/guides/auth/auth-helpers/). + +
+ +
+ +### Configure third-party providers + +You can enable third-party providers with the click of a button by navigating to Authentication > Settings > Auth Providers and inputting your `Client ID` and `Secret` for each. + +![OAuth Logins.](/docs/img/supabase-oauth-logins.png) + +### Redirect URLs and wildcards + +When using third-party providers, the [Supabase client library](/docs/reference/javascript/auth-signinwithoauth#sign-in-using-a-third-party-provider-with-redirect) redirects the user to the provider. When the third-party provider successfully authenticates the user, the provider redirects the user to the Supabase Auth callback URL where they are further redirected to the URL specified in the `redirectTo` parameter. This parameter defaults to the [`SITE_URL`](/docs/reference/auth/config#site_url). You can modify the `SITE_URL` or [add additional redirect URLs](https://app.supabase.com/project/_/auth/settings). + +You can use wildcard match patterns to support preview URLs from providers like Netlify and Vercel. See the [full list of supported patterns](https://pkg.go.dev/github.com/gobwas/glob#Compile). Use [this tool](https://www.digitalocean.com/community/tools/glob?comments=true&glob=http%3A%2F%2Flocalhost%3A3000%2F%2A%2A&matches=false&tests=http%3A%2F%2Flocalhost%3A3000&tests=http%3A%2F%2Flocalhost%3A3000%2F&tests=http%3A%2F%2Flocalhost%3A3000%2F%3Ftest%3Dtest&tests=http%3A%2F%2Flocalhost%3A3000%2Ftest-test%3Ftest%3Dtest&tests=http%3A%2F%2Flocalhost%3A3000%2Ftest%2Ftest%3Ftest%3Dtest) to test your patterns. + +> ⚠️ WARNING: While the "globstar" (`**`) is useful for local development and preview URLs, we recommend setting the exact redirect URL path for your site URL in production. + +#### Netlify preview URLs + +For deployments with Netlify, set the `SITE_URL` to your official site URL. Add the following additional redirect URLs for local development and deployment previews: + +- `http://localhost:3000/**` +- `https://**--my_org.netlify.app/**` + +#### Vercel preview URLs + +For deployments with Vercel, set the `SITE_URL` to your official site URL. Add the following additional redirect URLs for local development and deployment previews: + +- `http://localhost:3000/**` +- `https://*-username.vercel.app/**` + +Vercel provides an environment variable for the URL of the deployment called `NEXT_PUBLIC_VERCEL_URL`. See the [Vercel docs](https://vercel.com/docs/concepts/projects/environment-variables#system-environment-variables) for more details. You can use this variable to dynamically redirect depending on the environment: + +```js +const getURL = () => { + let url = + process?.env?.NEXT_PUBLIC_SITE_URL ?? // Set this to your site URL in production env. + process?.env?.NEXT_PUBLIC_VERCEL_URL ?? // Automatically set by Vercel. + 'http://localhost:3000/'; + // Make sure to include `https://` when not localhost. + url = url.includes('http') ? url : `https://${url}`; + // Make sure to including trailing `/`. + url = url.charAt(url.length - 1) === '/' ? url : `${url}/`; + return url; +}; + +const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'github' + options: { + redirectTo: getURL() + } +} +``` + +#### Mobile deep linking URIs + +For mobile applications you can use deep linking URIs. For example for your `SITE_URL` you can specify something like `com.supabase://login-callback/` and for additional redirect URLs something like `com.supabase.staging://login-callback/` if needed. + +## Authorization + +When you need granular authorization rules, nothing beats PostgreSQL's Row Level Security (RLS). + +Policies are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. + +Get started with our [Row Level Security Guides](/docs/guides/auth/row-level-security). + +### Row Level Security + +Authentication only gets you so far. When you need granular authorization rules, nothing beats PostgreSQL's [Row Level Security (RLS)](https://www.postgresql.org/docs/current/ddl-rowsecurity.html). Supabase makes it simple to turn RLS on and off. + + + +### Policies + +[Policies](https://www.postgresql.org/docs/current/sql-createpolicy.html) are PostgreSQL's rule engine. They are incredibly powerful and flexible, allowing you to write complex SQL rules which fit your unique business needs. + + + +With policies, your database becomes the rules engine. Instead of repetitively filtering your queries, like this ... + +```js +const loggedInUserId = 'd0714948' +let { data, error } = await supabase + .from('users') + .select('user_id, name') + .eq('user_id', loggedInUserId) + +// console.log(data) +// => { id: 'd0714948', name: 'Jane' } +``` + +... you can simply define a rule on your database table, `auth.uid() = user_id`, and your request will return the rows which pass the rule, even when you remove the filter from your middleware: + +```js +let { data, error } = await supabase.from('users').select('user_id, name') + +// console.log(data) +// Still => { id: 'd0714948', name: 'Jane' } +``` + +### How It Works + +1. A user signs up. Supabase creates a new user in the `auth.users` table. +2. Supabase returns a new JWT, which contains the user's `UUID`. +3. Every request to your database also sends the JWT. +4. Postgres inspects the JWT to determine the user making the request. +5. The user's UID can be used in policies to restrict access to rows. + +Supabase provides a special function in Postgres, `auth.uid()`, which extracts the user's UID from the JWT. This is especially useful when creating policies. + +## User Management + +Supabase provides multiple endpoints to authenticate and manage your users: + +- [Sign up](/docs/reference/javascript/auth-signup) +- [Sign in with password](/docs/reference/javascript/auth-signinwithpassword) +- [Sign in with passwordless / one-time password (OTP)](/docs/reference/javascript/auth-signinwithotp) +- [Sign in with OAuth](/docs/reference/javascript/auth-signinwithoauth) +- [Sign out](/docs/reference/javascript/auth-signout) + +When users sign up, Supabase assigns them a unique ID. You can reference this ID anywhere in your database. For example, you might create a `profiles` table referencing `id` in the `auth.users` table using a `user_id` field. + + + export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return OldContent() + const router = useRouter() + if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true' && !router.asPath.includes('overview')) { + return NewContent() } return } diff --git a/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx b/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx index 8e6bb09d58e..181954436ae 100644 --- a/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx +++ b/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-magic-link.mdx' export const meta = { id: 'auth-magic-link', @@ -7,11 +6,91 @@ export const meta = { description: 'Use Supabase to authenticate and authorize your users using magic links.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +Magic links are a form of passwordless logins where users click on a link sent to their email address to log in to their accounts. +Magic links only work with email addresses. By default, a user can only request a magic link once every 60 seconds. + +## Overview + +Setting up Magic Link logins for your Supabase application. + +- Add Magic Link authenticator to your [Supabase Project](https://app.supabase.com) +- Add the login code to your application - [JavaScript](https://github.com/supabase/supabase-js) | [Flutter](https://github.com/supabase/supabase-flutter) + +## Add Magic Link into your Supabase Project + +1. For [Site URL](https://app.supabase.com/project/_/auth/url-configuration), enter the final (hosted) URL of your app. +1. For [Auth Providers](https://app.supabase.com/project/_/auth/providers), **enable email provider**. + +## Add login code to your client app + + + + +When your user signs in, call [signInWithOtp()](/docs/reference/javascript/auth-signinwithotp) with their email address: + +```js +async function signInWithEmail() { + const { data, error } = await supabase.auth.signInWithOtp({ + email: 'example@email.com', + }) } +``` + + + + +When your user signs in, call [signIn()](/docs/reference/dart/auth-signinwithotp) with their email address: + +```dart +Future signInWithEmail() async { + final AuthResponse res = await supabase.auth.signinwithotp(email: 'example@email.com'); +} +``` + + + + + + + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signOut() { + const { error } = await supabase.auth.signOut() +} +``` + + + + +When your user signs out, call [signOut()](/docs/reference/dart/auth-signout) to remove them from the browser session and any objects from localStorage: + +```dart +Future signOut() async { + await supabase.auth.signOut(); +} +``` + + + + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Supabase Flutter Client](https://github.com/supabase/supabase-flutter) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-messagebird.mdx b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-messagebird.mdx index 93e300fd59b..38651a9876d 100644 --- a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-messagebird.mdx +++ b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-messagebird.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-messagebird.mdx' export const meta = { id: 'auth-messagebird', @@ -7,11 +6,279 @@ export const meta = { description: 'How to set up and use Mobile OTP with MessageBird and Supabase.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +## Overview + +In this guide we'll show you how to authenticate your users with SMS based OTP (One-Time Password) tokens. + +There are two reasons to use Supabase SMS OTP tokens: + +- You want users to log in with mobile + password, and the mobile should be verified via SMS +- You want users to log in with mobile ONLY (i.e. passwordless login) + +We'll cover: + +- [Finding your MessageBird credentials](#finding-your-messagebird-credentials) +- [Using OTP with password based logins](#using-otp-with-password-based-logins) +- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) + +What you'll need: + +- A MessageBird account (sign up here: https://dashboard.messagebird.com/en/sign-up) +- A Supabase project (create one here: https://app.supabase.com) +- A mobile phone capable of receiving SMS + +## Steps + +### Finding your MessageBird credentials + +Start by logging into your MessageBird account and verify the mobile number you'll be using to test with: https://dashboard.messagebird.com/en/getting-started/sms + +This is the number that will be receiving the SMS OTPs. + +![Verify your own phone number](/docs/img/guides/auth-messagebird/1.png) + +![Get your API Keys](/docs/img/guides/auth-messagebird/2.png) + +Navigate to the [dashboard settings](https://dashboard.messagebird.com/en/settings/sms) to set the default originator. The messagebird originator is the name or number from which the message is sent. +For more information, you can refer to the messagebird article on choosing an originator [here](https://support.messagebird.com/hc/en-us/articles/115002628665-Choosing-an-originator) + +![Set the default originator](/docs/img/guides/auth-messagebird/3.png) + +You will need the following values to get started: + +- Live API Key / Test API Key +- MessageBird originator + +Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). + +You should see an option to enable Phone Signup. + +![Enable Phone Sign-Up](/docs/img/guides/auth-twilio/7.png) + +Toggle it on, and copy the 2 values over from the messagebird dashboard. Click save. + +Note: If you use the Test API Key, the OTP will not be delivered to the mobile number specified but messagebird will log the response in the dashboard. +If the Live API Key is used instead, the OTP will be delivered and there will be a deduction in your free credits. + +Plugin MessageBird credentials + +Now the backend should be setup, we can proceed to add our client-side code! + +#### SMS custom template + +The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. + +Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). + +Use the variable `.Code` in the template to display the code. + +### Using OTP with password based logins + +In this use scenario we'll be using the user's mobile phone number as an alternative to an email address when signing up along with a password. You may want to think hard about the permanency of this however. It is not uncommon for mobile phone numbers to be recycled by phone networks when users cancel their phone contracts or move countries, therefore granting access to the user's account to whoever takes over the phone number in the future. Soon we'll add multi-factor auth, which will mitigate this risk, but for now you may want to give some thought to allowing your users to recover their account by some other means in an emergency. + +Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: + + + + +```js +let { user, error } = await supabase.auth.signUp({ + phone: '+13334445555', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/signup' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555", + "password": "some-password" +}' +``` + + + + +The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. + +You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '+13334445555', + token: '123456', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "+13334445555", + "token": "123456" +}' +``` + + + + +If successful the user will now be logged in and you should receive a valid session like: + +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" } +``` + +The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. + +Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: + + + + +```js +let { user, error } = await supabase.auth.signInWithPassword({ + phone: '+13334445555', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/token?grant_type=password' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555", + "password": "some-password" +}' +``` + + + + +### Using OTP as a passwordless sign-in mechanism + +In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. + +In javascript we can use the `signIn` method with a single parameter: `phone` + + + + +```js +let { user, error } = await supabase.auth.signInWithOtp({ + phone: '+13334445555', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/otp' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555" +}' +``` + + + + +The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '+13334445555', + token: '123456', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "+13334445555", + "token": "123456" +}' +``` + + + + +and the response should also be the same as above: + +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" +} +``` + +The user does not have a password therefore will need to sign in via this method each time they want to access your service. + +## Resources + +- [MessageBird Signup](https://dashboard.messagebird.com/en/sign-up) +- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Row Level Security](/docs/guides/auth#row-level-security) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-twilio.mdx b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-twilio.mdx index 922d4a33db1..fa45a547970 100644 --- a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-twilio.mdx +++ b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-twilio.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-twilio.mdx' export const meta = { id: 'auth-twilio', @@ -7,11 +6,300 @@ export const meta = { description: 'How to set up and use Mobile OTP with Twilio and Supabase.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +## Overview + +In this guide we'll show you how to authenticate your users with SMS based One-Time Password (OTP) tokens. + +There are two reasons to use Supabase SMS OTP tokens: + +- You want users to log in with mobile number + password, and the mobile number should be verified via SMS +- You want users to log in with mobile number ONLY (i.e. passwordless login) + +We'll cover: + +- [Finding your Twilio credentials](#finding-your-twilio-credentials) +- [Using OTP with password based logins](#using-otp-with-password-based-logins) +- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) + +What you'll need: + +- A Twilio account (sign up here: https://www.twilio.com/try-twilio) +- A Supabase project (create one here: https://app.supabase.com) +- A mobile phone capable of receiving SMS + +## Video + +
+ +
+ +## Steps + +### Finding your Twilio credentials + +Start by logging into your Twilio account and starting a new project: https://www.twilio.com/console/projects/create + +Give your project a name and verify the mobile number you'll be using to test with. This is the number that will be receiving the SMS OTPs. + +![Name your twilio project](/docs/img/guides/auth-twilio/1.png) +![verify your own phone number](/docs/img/guides/auth-twilio/2.png) + +Select 'SMS', 'Identity & Verification', and 'With code' as options on the welcome form. + +![Form Fields](/docs/img/guides/auth-twilio/3.png) + +When you're back on the [Twilio console screen](https://www.twilio.com/console), you need to scroll down and click 'Get a trial phone number' - this is the number that you'll be sending SMSs from. + +![Get a trial phone number](/docs/img/guides/auth-twilio/4.png) + +![Successful phone number](/docs/img/guides/auth-twilio/5.png) + +You should now be able to see all three values you'll need to get started: + +- Account SID +- Auth Token +- Sender Phone Number + +![All the credentials you'll need](/docs/img/guides/auth-twilio/6.png) + +Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). + +You should see an option to enable Phone Signup: + +![Enable Phone Sign-Up](/docs/img/guides/auth-twilio/7.png) + +Toggle it on, and copy the 3 values over from the twilio dashboard. Click save. + +Note: for "Twilio Message Service SID" you can use the Sender Phone Number generated above. + +![Plug in Twilio credentials](/docs/img/guides/auth-twilio/8.png) + +Now the backend should be setup, we can proceed to add our client-side code! + +#### SMS custom template + +The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. + +Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). + +Use the variable `.Code` in the template to display the OTP code. Here's an example in the SMS template. + +![example in the SMS template](/docs/img/guides/auth-twilio/9.png) + +### Using OTP with password based logins + +In this scenario we'll be using the user's mobile phone number and a corresponding password as an alternative to signing up with an email address. Note: please thoroughly consider potential security implications when signing up with a combination of phone number and password. Phone numbers are sometimes recycled by phone networks when users cancel their phone contracts or move countries, thereby granting access to the user's account to the subsequent owner of the phone number. In the near future Supabase will support multifactor authentication, which will mitigate this risk, but for now you may want to consider allowing your users to recover their account by some other means in an emergency. + +Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: + + + + +```js +let { user, error } = await supabase.auth.signUp({ + phone: '+13334445555', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/signup' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555", + "password": "some-password" +}' +``` + + + + +The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. + +You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '+13334445555', + token: '123456', + type: 'sms', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "+13334445555", + "token": "123456" +}' +``` + + + + +If successful the user will now be logged in and you should receive a valid session like: + +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" } +``` + +The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. + +Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: + + + + +```js +let { user, error } = await supabase.auth.signInWithPassword({ + phone: '+13334445555', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/token?grant_type=password' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555", + "password": "some-password" +}' +``` + + + + +### Using OTP as a passwordless sign-in mechanism + +In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. + +In javascript we can use the `signIn` method with a single parameter: `phone` + + + + +```js +let { user, error } = await supabase.auth.signInWithOtp({ + phone: '+13334445555', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/otp' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "+13334445555" +}' +``` + + + + +The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '+13334445555', + token: '123456', + type: 'sms', +}) +``` + + + + +```bash +curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "+13334445555", + "token": "123456" +}' +``` + + + + +and the response should also be the same as above: + +```json +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" +} +``` + +The user does not have a password therefore will need to sign in via this method each time they want to access your service. + +## Resources + +- [Twilio Signup](https://www.twilio.com/try-twilio) +- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Row Level Security](/docs/guides/auth#row-level-security) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-vonage.mdx b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-vonage.mdx index deec90db1d5..5ebe1de41d0 100644 --- a/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-vonage.mdx +++ b/apps/docs/pages/guides/auth/passwordless-login/phone-sms-otp-vonage.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-vonage.mdx' export const meta = { id: 'auth-vonage', @@ -7,11 +6,272 @@ export const meta = { description: 'How to set up and use Mobile OTP with Vonage and Supabase.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +## Overview + +In this guide we'll show you how to authenticate your users with SMS based OTP (One-Time Password) tokens. + +There are two reasons to use Supabase SMS OTP tokens: + +- You want users to log in with mobile + password, and the mobile should be verified via SMS +- You want users to log in with mobile ONLY (i.e. passwordless login) + +We'll cover: + +- [Getting your Vonage API Key](#finding-your-vonage-api-key) +- [Using OTP with password based logins](#using-otp-with-password-based-logins) +- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) + +What you'll need: + +- A Vonage account (sign up here: https://dashboard.nexmo.com/sign-up) +- A Supabase project (create one here: https://app.supabase.com) +- A mobile phone capable of receiving SMS + +## Steps + +### Getting your Vonage credentials + +Start by logging into your Vonage Dashboard at https://dashboard.nexmo.com/ + +You will see you API Key and API Secret here, which is actually all you need to get started. + +In most countries, a phone number is actually optional and you can also use any Alphanumeric Sender ID of up to 11 characters length (8 for India) as a Sender ID (from). This means you do not need a number to test with in most cases. + +To find out more about supported countries for Alphanumeric Sender ID, check this overview: https://help.nexmo.com/hc/en-us/articles/115011781468-SMS-Features-Overview-Outbound-only- + +Hint: Some countries might need a Sender ID Registration to allow sending with an Alphanumeric Sender ID. You can find this information in the help article as well. If Alpha Sender IDs are not supported, you will need to buy a phone number. + +### Getting a phone number (optional) + +If you want a phone number to send SMS from, you can buy one from the Vonage Dashboard under Numbers > Buy Numbers (https://dashboard.nexmo.com/buy-numbers). + +Select the country you want a number for. You will need a mobile phone number with SMS or SMS+Voice capability. After you have bought the number, you will be able to send SMS from it. + +### Configure Supabase + +Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). + +You should see an option to enable Phone Signup. + +Toggle it on, and copy the api key, api secret and optionally phone number values over from the Vonage dashboard. Click save. + +Now the backend should be setup, we can proceed to add our client-side code! + +#### SMS custom template + +The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. + +Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). + +Use the variable `.Code` in the template to display the code. + +### Using OTP with password based logins + +In this use scenario we'll be using the user's mobile phone number as an alternative to an email address when signing up along with a password. You may want to think hard about the permanency of this however. It is not uncommon for mobile phone numbers to be recycled by phone networks when users cancel their phone contracts or move countries, therefore granting access to the user's account to whoever takes over the phone number in the future. + +Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: + + + + +```js +let { user, error } = await supabase.auth.signUp({ + phone: '491512223334444', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://xxx.supabase.co/auth/v1/signup' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "491512223334444", + "password": "some-password" +}' +``` + + + + +The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. + +You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '491512223334444', + token: '123456', +}) +``` + + + + +```bash +curl -X POST 'https://xxx.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "491512223334444", + "token": "123456" +}' +``` + + + + +If successful the user will now be logged in and you should receive a valid session like: + +```json +{ + "access_token": "eyJxxx...", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "yyy..." } +``` + +The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. + +Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: + + + + +```js +let { user, error } = await supabase.auth.signInWithPassword({ + phone: '491512223334444', + password: 'some-password', +}) +``` + + + + +```bash +curl -X POST 'https://xxx.supabase.co/auth/v1/token?grant_type=password' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "491512223334444", + "password": "some-password" +}' +``` + + + + +### Using OTP as a passwordless sign-in mechanism + +In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. + +In javascript we can use the `signIn` method with a single parameter: `phone` + + + + +```js +let { user, error } = await supabase.auth.signInWithOtp({ + phone: '491512223334444', +}) +``` + + + + +```bash +curl -X POST 'https://xxx.supabase.co/auth/v1/otp' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "phone": "491512223334444" +}' +``` + + + + +The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: + + + + +```js +let { session, error } = await supabase.auth.verifyOTP({ + phone: '491512223334444', + token: '123456', +}) +``` + + + + +```bash +curl -X POST 'https://xxx.supabase.co/auth/v1/verify' \ +-H "apikey: SUPABASE_KEY" \ +-H "Content-Type: application/json" \ +-d '{ + "type": "sms", + "phone": "491512223334444", + "token": "123456" +}' +``` + + + + +and the response should also be the same as above: + +```json +{ + "access_token": "eyJxxx...", + "token_type": "bearer", + "expires_in": 3600, + "refresh_token": "yyy..." +} +``` + +The user does not have a password therefore will need to sign in via this method each time they want to access your service. + +## Resources + +- [Vonage Signup](https://dashboard.nexmo.com/sign-up) +- [Supabase Dashboard](https://app.supabase.com) +- [Supabase Row Level Security](/docs/guides/auth#row-level-security) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-apple.mdx b/apps/docs/pages/guides/auth/social-login/auth-apple.mdx index 43257cc81c4..d5bf22f9205 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-apple.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-apple.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-apple.mdx' export const meta = { id: 'auth-apple', @@ -7,11 +6,202 @@ export const meta = { description: 'Add Apple OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Apple Auth for your project, you need to set up an Apple OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Apple OAuth consists of six broad steps: + +- Obtaining an `App Id` with “Sign In with Apple” capabilities. +- Obtaining a `Services Id` - this will serve as the `client_id`. +- Obtaining a `secret key` that will be used to get our `client_secret`. +- Generating the `client_secret` using the `secret key`. +- Add your `client id` and `client secret` keys to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your Apple Developer account + +- Go to [developer.apple.com](https://developer.apple.com). +- Click on `Account` at the top right to log in. + +![Apple Developer Portal.](/docs/img/guides/auth-apple/apple-developer-portal.png) + +## Obtain an App ID + +- Go to `Certificates, Identifiers & Profiles`. +- Click on `Identifiers` at the left. +- Click on the `+` sign in the upper left next to `Identifiers`. +- Select `App IDs` and click `Continue`. +- Select type `App` and click `Continue`. +- Fill out your app information: + - App description. + - Bundle ID (Apple recommends reverse-domain name style, so if your domain is acme.com and your app is called roadrunner, use: "com.acme.roadrunner"). + - Scroll down and check `Sign In With Apple`. + - Click `Continue` at the top right. + - Click `Register` at the top right. + +## Obtain a Services ID + +This will serve as the `client_id` when you make API calls to authenticate the user. + +- Go to `Certificates, Identifiers & Profiles`. +- Click on `Identifiers` at the left. +- Click on the `+` sign in the upper left next to `Identifiers`. +- Select `Services IDs` and click `Continue`. +- Fill out your information: + - App description. + - Bundle ID (you can't use the same Bundle ID from the previous step, but you can just add something to the beginning, such as "app." to make it app.com.acme.roadrunner"). + - SAVE THIS ID -- this ID will become your `client_id` later. + - Click `Continue` at the top right. + - Click `Register` at the top right. + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Configure your Services ID + +- Under `Identifiers`, click on your newly-created Services ID. +- Check the box next to `Sign In With Apple` to enable it. +- Click `Configure` to the right. +- Make sure your newly created Bundle ID is selected under `Primary App ID` +- Add your domain to the `Domains and Subdomains` box (do not add `https://`, just add the domain). +- In the `Return URLs` box, type the callback URL of your app which you found in the previous step and click `Next` at the bottom right. +- Click `Done` at the bottom. +- Click `Continue` at the top right. +- Click `Save` at the top right. + +## Download your secret key + +Now you'll need to download a `secret key` file from Apple that will be used to generate your `client_secret`. + +- Go to `Certificates, Identifiers & Profiles`. +- Click on `Keys` at the left. +- Click on the `+` sign in the upper left next to `Keys`. +- Enter a `Key Name`. +- Check `Sign In with Apple`. +- Click `Configure` to the right. +- Select your newly-created Services ID from the dropdown selector. +- Click `Save` at the top right. +- Click `Continue` at the top right. +- Click `Register` at the top right. +- Click `Download` at the top right. +- Save the downloaded file -- this contains your "secret key" that will be used to generate your `client_secret`. +- Click `Done` at the top right. + +## Generate a `client_secret` + +The `secret key` you downloaded is used to create the `client_secret` string you'll need to authenticate your users. + +According to the [Apple Docs](https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens) it needs to be a JWT +token encrypted using the Elliptic Curve Digital Signature Algorithm (ECDSA) with the P-256 curve and the SHA-256 hash algorithm. + +At this time, the easiest way to generate this JWT token is with [Ruby](https://www.ruby-lang.org/en/). +If you don't have Ruby installed, you can [Download Ruby Here](https://www.ruby-lang.org/en/downloads). + +- Install Ruby (or check to make sure it's installed on your system). +- Install [ruby-jwt](https://github.com/jwt/ruby-jwt). +- From the command line, run: `sudo gem install jwt`. + +Create the script below using a text editor: `secret_gen.rb` + +```ruby +require "jwt" + +key_file = "Path to the private key" +team_id = "Your Team ID" +client_id = "The Service ID of the service you created" +key_id = "The Key ID of the private key" + +validity_period = 180 # In days. Max 180 (6 months) according to Apple docs. + +private_key = OpenSSL::PKey::EC.new IO.read key_file + +token = JWT.encode( + { + iss: team_id, + iat: Time.now.to_i, + exp: Time.now.to_i + 86400 * validity_period, + aud: "https://appleid.apple.com", + sub: client_id + }, + private_key, + "ES256", + header_fields= + { + kid: key_id + } +) +puts token +``` + +1. Edit the `secret_gen.rb` file: + +- `key_file` = "Path to the private key you downloaded from Apple". It should look like this: `AuthKey_XXXXXXXXXX.p8`. +- `team_id` = "Your Team ID". This is found at the top right of the Apple Developer site (next to your name). +- `client_id` = "The Service ID of the service you created". This is the `Services ID` you created in the above step `Obtain a Services ID`. If you've lost this ID, you can find it in the Apple Developer Site: + - Go to `Certificates, Identifiers & Profiles`. + - Click `Identifiers` at the left. + - At the top right drop-down, select `Services IDs`. + - Find your Identifier in the list (i.e. app.com.acme.roadrunner). +- `key_id` = "The Key ID of the private key". This can be found in the name of your downloaded secret file (For a file named `AuthKey_XXXXXXXXXX.p8` your key_id is `XXXXXXXXXX`). If you've lost this ID, you can find it in the Apple Developer Site: + - Go to `Certificates, Identifiers & Profiles`. + - Click `Keys` at the left. + - Click on your newly-created key in the list. + - Look under `Key ID` to find your key_id. + +2. From the command line, run: `ruby secret_gen.rb > client_secret.txt`. +3. Your `client_secret` is now stored in this `client_secret.txt` file. + +## Add your OAuth credentials to Supabase + +- Go to your [Supabase Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `Apple Enabled` to ON. +- Enter your `client_id` and `client_secret` saved in the previous steps. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `apple` as the `provider`: + +```js +async function signInWithApple() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'apple', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Apple Developer Account](https://developer.apple.com). +- [Ruby](https://www.ruby-lang.org/en/) Docs. +- [ruby-jwt](https://github.com/jwt/ruby-jwt) library. +- Thanks to [Janak Amarasena](https://medium.com/@janakda) who did all the heavy lifting in [How to configure Sign In with Apple](https://medium.com/identity-beyond-borders/how-to-configure-sign-in-with-apple-77c61e336003). + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-azure.mdx b/apps/docs/pages/guides/auth/social-login/auth-azure.mdx index 09100d4fb3d..d75a365b1d5 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-azure.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-azure.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-azure.mdx' export const meta = { id: 'auth-azure', @@ -7,11 +6,98 @@ export const meta = { description: 'Add Azure OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Azure Auth for your project, you need to set up an Azure OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Azure OAuth consists of four broad steps: + +- Create an application under Azure Active Directory. +- Obtain a `Application (client) ID` with “Sign In with Azure” capabilities. This will be used as the `client id`. +- Create a `Secret ID` with “Sign In with Azure” capabilities. The value of the secret will be used as the `client secret`. +- Add the callback url of your application to the allowlist. + +## Access your Azure Developer account + +- Go to [portal.azure.com](https://portal.azure.com/#home). +- Login and select "Azure Active Directory" under the list of Azure Services. + +## Register an application + +- Under Azure Active Directory, select "App registrations" in the side panel. +- Select "New registration". +- Choose a name and select your preferred option for the supported account types. +- Specify the "Redirect URI". +- The redirect / callback URI should look like this: `https://.supabase.co/auth/v1/callback` +- Click "Register" at the bottom of the form. + +![Register an application.](/docs/img/guides/auth-azure/azure-register-app.png) + +## Obtain a Client ID + +This will serve as the `client_id` when you make API calls to authenticate the user. + +- Once your app has been registered, the client id can be found under the [list of app registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) under the column titled "Application (client) ID". + +![Obtain the client id](/docs/img/guides/auth-azure/azure-client-id.png) + +## Obtain a Secret ID + +This will serve as the `client_secret` when you make API calls to authenticate the user. + +- Click on the name of the app registered above. +- Under "Essentials", click on "Client credentials". +- Navigate to the "Client secrets" tab and select "New client secret". +- Enter a description and choose your preferred expiry for the secret. +- Once the secret is generated, save the `value` (not the secret ID). + +![Obtain the client secret](/docs/img/guides/auth-azure/azure-client-secret.png) + +## Obtain the Tenant URL + +This will allow your users to use your custom Azure login page when logging in. + +- Select the Directory (Tenant) ID value. +- The Azure Tenant URL should look like this: `https://login.microsoftonline.com/` + +![Obtain the tenant url](/docs/img/guides/auth-azure/azure-tenant-url.png) + +## Add login code to your client app + + + +Supabase Auth requires that Azure returns a valid email address. Therefore you must request the `email` scope in the `signIn` method above. + + + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `azure` as the `provider`: + +```js +async function signInWithAzure() { + const { data, error } = await supabase.auth.signInWithOAuth( + { + provider: 'azure', + }, + { + scopes: 'email', + } + ) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Azure Developer Account](https://portal.azure.com) +- [GitHub Discussion](https://github.com/supabase/gotrue/pull/54#issuecomment-757043573) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx b/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx index 0d3b621ea44..626b1ef3cf7 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-bitbucket.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-bitbucket.mdx' export const meta = { id: 'auth-bitbucket', @@ -7,11 +6,90 @@ export const meta = { description: 'Add Bitbucket OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Bitbucket Auth for your project, you need to set up a BitBucket OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Bitbucket logins for your application consists of 3 parts: + +- Create and configure a Bitbucket OAuth Consumer on [Bitbucket](https://bitbucket.org) +- Add your Bitbucket OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Bitbucket account + +- Go to [bitbucket.org](https://bitbucket.org/). +- Click on `Login` at the top right to log in. + +![Bitbucket Developer Portal.](/docs/img/guides/auth-bitbucket/bitbucket-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Bitbucket OAuth app + +- Click on your profile icon at the bottom left +- Click on `All Workspaces` +- Select a workspace and click on it to select it +- Click on `Settings` on the left +- Click on `OAuth consumers` on the left under `Apps and Features` (near the bottom) +- Click `Add Consumer` at the top +- Enter the name of your app under `Name` +- In `Callback URL`, type the callback URL of your app +- Check the permissions you need (Email, Read should be enough) +- Click `Save` at the bottom +- Click on your app name (the name of your new OAuth Consumer) +- Copy your `Key` (`client_key`) and `Secret` (`client_secret`) codes + +## Add your Bitbucket credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Bitbucket Enabled` to ON +- Enter your `client_id` and `client_secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `bitbucket` as the `provider`: + +```js +async function signInWithBitbucket() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'bitbucket', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Bitbucket Account](https://bitbucket.org) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-discord.mdx b/apps/docs/pages/guides/auth/social-login/auth-discord.mdx index 67701ea1187..dc599979d0e 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-discord.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-discord.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-discord.mdx' export const meta = { id: 'auth-discord', @@ -7,11 +6,92 @@ export const meta = { description: 'Add Discord OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Discord Auth for your project, you need to set up a Discord Application and add the Application OAuth credentials to your Supabase Dashboard. + +## Overview + +Setting up Discord logins for your application consists of 3 parts: + +- Create and configure a Discord Application [Discord Developer Portal](https://discord.com/developers) +- Add your Discord OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Discord account + +- Go to [discord.com](https://discord.com/). +- Click on `Login` at the top right to log in. + +![Discord Portal.](/docs/img/guides/auth-discord/discord-portal.png) + +- Once logged in, go to [discord.com/developers](https://discord.com/developers). + +![Discord Portal.](/docs/img/guides/auth-discord/discord-developer-portal.png) + +## Find your callback URL + +In the next step you require a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Discord Application + +- Click on `New Application` at the top right. +- Enter the name of your application and click `Create`. +- Click on `OAuth2` under `Settings` in the left side panel. +- Click `Add Redirect` under `Redirects`. +- Type or paste your `callback URL` into the `Redirects` box. +- Click `Save Changes` at the bottom. +- Copy your `Client ID` and `Client Secret` under `Client information`. + +## Add your Discord credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Discord Enabled` to ON +- Enter your `client_id` and `client_secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `discord` as the `provider`: + +```js +async function signInWithDiscord() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'discord', + }) } +``` + +If your user is already signed in, Discord prompts the user again for authorization. + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Discord Account](https://discord.com) +- [Discord Developer Portal](https://discord.com/developers) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx b/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx index ed30fbca144..43658f38b00 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-facebook.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-facebook.mdx' export const meta = { id: 'auth-facebook', @@ -7,11 +6,107 @@ export const meta = { description: 'Add Facebook OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Facebook Auth for your project, you need to set up a Facebook OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Facebook logins for your application consists of 3 parts: + +- Create and configure a Facebook Application on the [Facebook Developers Site](https://developers.facebook.com) +- Add your Facebook keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Facebook Developer account + +- Go to [developers.facebook.com](https://developers.facebook.com). +- Click on `Log In` at the top right to log in. + +![Facebook Developer Portal.](/docs/img/guides/auth-facebook/facebook-portal.png) + +## Create a Facebook App + +- Click on `My Apps` at the top right. +- Click `Create App` near the top right. +- Select your app type and click `Continue`. +- Fill in your app information, then click `Create App`. +- This should bring you to the screen: `Add Products to Your App`. (Alternatively you can click on `Add Product` in the left sidebar to get to this screen.) + +## Find your callback URI + +The next step requires a callback URI, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Set up FaceBook Login for your Facebook App + +From the `Add Products to your App` screen: + +- Click `Setup` under `Facebook Login` +- Skip the Quickstart screen, instead, in the left sidebar, click `Settings` under `Facebook Login` +- Enter your callback URI under `Valid OAuth Redirect URIs` on the `Facebook Login Settings` page +- Enter this in the `Valid OAuth Redirect URIs` box +- Click `Save Changes` at the bottom right + +Be aware that you have to set the right access levels on your Facebook App to enable 3rd party applications to read the email address. +From the `App Review -> Permissions and Features` screen: + +- Click the button `Request Advanced Access` on the right side of `public_profile` and `email` + +You can read more about access levels [here](https://developers.facebook.com/docs/graph-api/overview/access-levels/) + +## Copy your Facebook App ID and Secret + +- Click `Settings / Basic` in the left sidebar +- Copy your App ID from the top of the `Basic Settings` page +- Under `App Secret` click `Show` then copy your secret +- Make sure all required fields are completed on this screen. + +## Enter your Facebook App ID and Secret into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Facebook Enabled` to ON +- Enter your `Facebook client ID` and `Facebook secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `facebook` as the `provider`: + +```js +async function signInWithFacebook() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'facebook', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Facebook Developers Dashboard](https://developers.facebook.com/) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-github.mdx b/apps/docs/pages/guides/auth/social-login/auth-github.mdx index 3d9de6485f7..6ddcdac1ede 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-github.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-github.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-github.mdx' export const meta = { id: 'auth-github', @@ -7,11 +6,100 @@ export const meta = { description: 'Add GitHub OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable GitHub Auth for your project, you need to set up a GitHub OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up GitHub logins for your application consists of 3 parts: + +- Create and configure a GitHub OAuth App on [GitHub](https://github.com) +- Add your GitHub OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your GitHub account + +- Go to [github.com](https://github.com). +- Click on `Sign In` at the top right to log in. + +![GitHub Developer Portal.](/docs/img/guides/auth-github/github-portal.png) + +## Create a GitHub Oauth App + +Go to the [GitHub Developer Settings](https://github.com/settings/developers) page: + +- Click on your profile photo at the top right +- Click Settings near the bottom of the menu +- In the left sidebar, click `Developer settings` (near the bottom) +- In the left sidebar, click `OAuth Apps` + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Register a new OAuth application + +- Click `Register a new application`. If you've created an app before, click `New OAuth App` here. +- In `Application name`, type the name of your app. +- In `Homepage URL`, type the full URL to your app's website. +- In `Authorization callback URL`, type the callback URL of your app. +- Enter the URL in the `Valid OAuth Redirect URIs` box. +- Click `Save Changes` at the bottom right. +- Click `Register Application`. + +Copy your new OAuth credentials + +- Copy and save your `Client ID`. +- Click `Generate a new client secret`. +- Copy and save your `Client secret`. + +## Enter your GitHub credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `GitHub Enabled` to ON +- Enter your `GitHub Client ID` and `GitHub Client Secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `github` as the `provider`: + +```js +async function signInWithGitHub() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'github', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [GitHub Developer Settings](https://github.com/settings/developers) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx b/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx index 5447cc696b6..870c292a0b8 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-gitlab.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-gitlab.mdx' export const meta = { id: 'auth-gitlab', @@ -7,11 +6,87 @@ export const meta = { description: 'Add GitLab OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable GitLab Auth for your project, you need to set up a GitLab OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up GitLab logins for your application consists of 3 parts: + +- Create and configure a GitLab Application on [GitLab](https://gitlab.com) +- Add your GitLab Application keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your GitLab account + +- Go to [gitlab.com](https://gitlab.com). +- Click on `Login` at the top right to log in. + +![GitLab Developer Portal.](/docs/img/guides/auth-gitlab/gitlab-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create your GitLab Application + +- Click on your `profile logo` (avatar) in the top-right corner. +- Select `Edit profile`. +- In the left sidebar, select Applications. +- Enter the name of the application. +- In the `Redirect URI` box, type the callback URL of your app. +- Check the box next to `Confidential` (make sure it is checked). +- Check the scope named `read_user` (this is the only required scope). +- Click `Save Application` at the bottom. +- Copy and save your `Application ID` (`client_id`) and `Secret` (`client_secret`) which you'll need later. + +## Add your GitLab credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `GitLab Enabled` to ON. +- Enter your `client_id` and `client_secret` saved in the previous step. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `gitlab` as the `provider`: + +```js +async function signInWithGitLab() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'gitlab', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [GitLab Account](https://gitlab.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-google.mdx b/apps/docs/pages/guides/auth/social-login/auth-google.mdx index e19c0d8a935..4a8a2c3b222 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-google.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-google.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-google.mdx' export const meta = { id: 'auth-google', @@ -7,11 +6,115 @@ export const meta = { description: 'Add Google OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Google Auth for your project, you need to set up a Google OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Google logins for your application consists of 3 parts: + +- Create and configure a Google Project on the [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard) +- Add your Google OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Google Cloud Platform account + +- Go to [cloud.google.com](https://cloud.google.com). +- Click on `Sign in` at the top right to log in. + +![Google Developer Portal.](/docs/img/guides/auth-google/google-portal.png) + +## Create a Google Cloud Platform Project + +- Click on `Select a Project` at the top left. + - (Or, if a project is currently selected, click on the current project name at the top left.) +- Click `New Project` at the top right. +- Fill in your app information, then click `Create`. + - (This can take a few minutes.) +- This should bring you to the dashboard for your new project. + +## Create the OAuth Keys for your project + +From your project's dashboard screen: + +- In the search bar at the top labeled `Search products and resources` type `OAuth`. +- Click on `OAuth consent screen` from the list of results. +- On the `OAuth consent screen` page select `External`. +- Click `Create`. + +## Edit your app information + +- On the `Edit app registration` page fill out your app information. +- Click `Save and continue` at the bottom. + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create your Google credentials + +- Click `Credentials` at the left to go to the `Credentials` page on the Google Cloud Platform console. +- Click `Create Credentials` near the top then select `OAuth client ID` +- On the `Create OAuth client ID` page, select your application type. If you're not sure, choose `Web application`. +- Fill in your app name. +- At the bottom, under `Authorized redirect URIs` click `Add URI`. +- Enter your callback URI under `Authorized redirect URIs` at the bottom. +- Enter your callback URI in the `Valid OAuth Redirect URIs` box. +- Click `Save Changes` at the bottom right. +- Click `Create`. + +Copy your new OAuth credentials + +- A box will appear called `OAuth client created`. +- Copy and save the values under `Your Client ID` and `Your Client Secret`. + +## Enter your Google credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Google Enabled` to ON +- Enter your `Google Client ID` and `Google Client Secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `google` as the `provider`: + +```js +async function signInWithGoogle() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'google', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Google Cloud Platform Console](https://console.cloud.google.com/home/dashboard) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-keycloak.mdx b/apps/docs/pages/guides/auth/social-login/auth-keycloak.mdx index e71dc8a393f..b0078e6cfae 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-keycloak.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-keycloak.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-keycloak.mdx' export const meta = { id: 'auth-keycloak', @@ -7,11 +6,87 @@ export const meta = { description: 'Add Keycloak OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +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. + +## Overview + +To get started with Keycloak, you can run it in a docker container with: `docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -p 8080:8080 jboss/keycloak:latest` + +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: + +- Create a new client in your specified keycloak realm. +- Obtain the `issuer` from the "OpenID Endpoint Configuration". This will be used as the `Keycloak URL`. +- Ensure that the new client has the "Client Protocol" set to "openid-connect" and the "Access Type" is set to "confidential". +- The `Client ID` of the client created will be used as the `client id`. +- Obtain the `Secret` from the credentials tab which will be used as the `client secret`. +- Add the callback url of your application to your allowlist. + +## Access your Keycloak Admin console + +- Login by visiting [`http://localhost:8080`](http://localhost:8080) and clicking on "Administration Console". + +## Create a Keycloak Realm + +- Once you've logged in to the Keycloak console, you can add a realm from the side panel. The default realm should be named "Master". +- After you've added a new realm, you can retrieve the `issuer` from the "OpenID Endpoint Configuration" endpoint. The `issuer` will be used as the `Keycloak URL`. +- You can find this endpoint from the realm settings under the "General Tab" or visit [`http://localhost:8080/realms/my_realm_name/.well-known/openid-configuration`](http://localhost:8080/realms/my_realm_name/.well-known/openid-configuration) + +![Add a Keycloak Realm.](/docs/img/guides/auth-keycloak/keycloak-create-realm.png) + +## Create a Keycloak Client + +The "Client ID" of the created client will serve as the `client_id` when you make API calls to authenticate the user. + +![Add a Keycloak client](/docs/img/guides/auth-keycloak/keycloak-add-client.png) + +## Client Settings + +After you've created the client successfully, ensure that you set the following settings: + +1. The "Client Protocol" should be set to "openid-connect". +2. The "Access Type" should be set to "confidential". +3. The "Valid Redirect URIs" should be set to: `https://.supabase.co/auth/v1/callback`. + +![Obtain the client id, set the client protocol and access type](/docs/img/guides/auth-keycloak/keycloak-client-id.png) +![Set redirect uri](/docs/img/guides/auth-keycloak/keycloak-redirect-uri.png) + +## Obtain the Client Secret + +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`. + +![Obtain the client secret](/docs/img/guides/auth-keycloak/keycloak-client-secret.png) + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `keycloak` as the `provider`: + +```js +async function signInWithKeycloak() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'keycloak', + options: { + scopes: 'openid', + }, + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- You can find the keycloak openid endpoint configuration under the realm settings. + ![Keycloak OpenID Endpoint Configuration](/docs/img/guides/auth-keycloak/keycloak-openid-endpoint-config.png) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx b/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx index a027c482afc..22fb6f1f05e 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-linkedin.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-linkedin.mdx' export const meta = { id: 'auth-linkedin', @@ -7,11 +6,86 @@ export const meta = { description: 'Add LinkedIn OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable LinkedIn Auth for your project, you need to set up a LinkedIn OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up LinkedIn logins for your application consists of 3 parts: + +- Create and configure a LinkedIn Project and App on the [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). +- Add your LinkedIn `client_id` and `client_secret` to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your LinkedIn Developer account + +- Go to [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). +- Log in (if necessary.) + +![LinkedIn Developer Portal](/docs/img/guides/auth-linkedin/linkedin_developers_page.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a LinkedIn OAuth app + +- Go to [LinkedIn Developer Dashboard](https://www.linkedin.com/developers/apps). +- Click on `Create App` at the top right +- Enter your `LinkedIn Page` and `App Logo` +- Save your app +- Click `Auth` from the top menu +- Add your `Redirect URL` to the `Authorized Redirect URLs for your app` section +- Copy and save your newly-generated `Client ID` +- Copy and save your newly-generated `Client Secret` + +## Enter your LinkedIn credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `LinkedIn Enabled` to ON. +- Enter your `client_id` and `client_secret` saved in the previous step. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `linkedin` as the `provider`: + +```js +async function signInWithLinkedIn() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'linkedin', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [LinkedIn Developer Dashboard](https://api.LinkedIn.com/apps) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-notion.mdx b/apps/docs/pages/guides/auth/social-login/auth-notion.mdx index 50dc672d080..1f1d74e465a 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-notion.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-notion.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-notion.mdx' export const meta = { id: 'auth-notion', @@ -7,11 +6,90 @@ export const meta = { description: 'Add Notion OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Notion Auth for your project, you need to set up a Notion Application and add the Application OAuth credentials to your Supabase Dashboard. + +## Overview + +Setting up Notion logins for your application consists of 3 parts: + +- Create and configure a Notion Application [Notion Developer Portal](https://www.notion.so/my-integrations) +- Retrieve your OAuth client ID and OAuth client secret and add them to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Create your notion integration + +- Go to [developers.notion.com](https://developers.notion.com/). +- Click "View my integrations" and login. + +![notion.so](/docs/img/guides/auth-notion/notion.png) + +- Once logged in, go to [notion.so/my-integrations](https://notion.so/my-integrations) and create a new integration. +- When creating your integration, ensure that you select "Public integration" under "Integration type" and "Read user information including email addresses" under "Capabilities". +- You will need to add a redirect uri, see [Add the redirect uri](#add-the-redirect-uri) +- Once you've filled in the necessary fields, click "Submit" to finish creating the integration. + +![notion.so](/docs/img/guides/auth-notion/notion-developer.png) + +## Add the redirect URI + +- After selecting "Public integration", you should see an option to add "Redirect URIs". + +![notion.so](/docs/img/guides/auth-notion/notion-redirect-uri.png) + +You can retrieve the redirect uri with the following steps: + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + +Your redirect uri should look like the following: `https://.supabase.co/auth/v1/callback` + + + +## Add your Notion credentials into your Supabase Project + +- Once you've created your notion integration, you should be able to retrieve the "OAuth client ID" and "OAuth client secret" from the "OAuth Domain and URIs" tab. + +![notion.so](/docs/img/guides/auth-notion/notion-creds.png) + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Under `External OAuth Providers` turn `Notion Enabled` to ON +- Enter the "OAuth client ID" and "OAuth client secret" obtained in the `client id` and `client secret` fields. +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `notion` as the `provider`: + +```js +async function signInWithNotion() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'notion', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Notion Account](https://notion.so) +- [Notion Developer Portal](https://www.notion.so/my-integrations) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-slack.mdx b/apps/docs/pages/guides/auth/social-login/auth-slack.mdx index b724a321068..6d700e6f961 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-slack.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-slack.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-slack.mdx' export const meta = { id: 'auth-slack', @@ -7,11 +6,99 @@ export const meta = { description: 'Add Slack OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Slack Auth for your project, you need to set up a Slack OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Slack logins for your application consists of 3 parts: + +- Create and configure a Slack Project and App on the [Slack Developer Dashboard](https://api.slack.com/apps). +- Add your Slack `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your Slack Developer account + +- Go to [api.slack.com](https://api.slack.com/apps). +- Click on `Your Apps` at the top right to log in. + +![Slack Developer Portal.](/docs/img/guides/auth-slack/slack-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Slack OAuth app + +- Go to [api.slack.com](https://api.slack.com/apps). +- Click on `Create an App` + +Under `Create an app...`: + +- Click `From scratch` +- Type the name of your app +- Select your `Slack Workspace` +- Click `Create App` + +Under `App Credentials`: + +- Copy and save your newly-generated `Client ID` +- Copy and save your newly-generated `Client Secret` +- Click `Permissions` + +Under `Redirect URLs`: + +- Click `Add New Redirect URL` +- Paste your `Callback URL` then click `Add` +- Click `Save URLs` + +## Enter your Slack credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `Slack Enabled` to ON. +- Enter your `Client ID` (`client_id`) and `Client Secret` (`client_secret`) saved in the previous step. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `slack` as the `provider`: + +```js +async function signInWithSlack() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'slack', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Slack Developer Dashboard](https://api.slack.com/apps) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx b/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx index 69c931f6f7d..c5f3a0872f2 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-spotify.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-spotify.mdx' export const meta = { id: 'auth-spotify', @@ -7,11 +6,94 @@ export const meta = { description: 'Add Spotify OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Spotify Auth for your project, you need to set up a Spotify OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Spotify logins for your application consists of 3 parts: + +- Create and configure a Spotify Project and App on the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/). +- Add your Spotify `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your Spotify Developer account + +- Log into [Spotify](https://spotify.com) +- Access the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) + +![Spotify Developer Portal.](/docs/img/guides/auth-spotify/spotify-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Spotify OAuth app + +- Log into [Spotify](https://spotify.com). +- Go to the [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) +- Click `Create an App` +- Type your `App name` +- Type your `App description` +- Check the box to agree with the `Developer TOS and Branding Guidelines` +- Click `Create` +- Save your `Client ID` +- Save your `Client Secret` +- Click `Edit Settings` + +Under `Redirect URIs`: + +- Paste your Supabase Callback URL in the box +- Click `Add` +- Click `Save` at the bottom + +## Enter your Spotify credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `Spotify Enabled` to ON. +- Enter your `Client ID` (`client_id`) and `Client Secret` (`client_secret`) saved in the previous step. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `spotify` as the `provider`: + +```js +async function signInWithSpotify() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'spotify', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-twilio.mdx b/apps/docs/pages/guides/auth/social-login/auth-twilio.mdx deleted file mode 100644 index 922d4a33db1..00000000000 --- a/apps/docs/pages/guides/auth/social-login/auth-twilio.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-twilio.mdx' - -export const meta = { - id: 'auth-twilio', - title: 'Phone Auth with Twilio', - description: 'How to set up and use Mobile OTP with Twilio and Supabase.', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx b/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx index ae5a108d34f..fab1f8e42e3 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-twitch.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-twitch.mdx' export const meta = { id: 'auth-twitch', @@ -7,11 +6,106 @@ export const meta = { description: 'Add Twitch OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Twitch Auth for your project, you need to set up a Twitch Application and add the Application OAuth credentials to your Supabase Dashboard. + +## Overview + +Setting up Twitch logins for your application consists of 3 parts: + +- Create and configure a Twitch Application [Twitch Developer Console](https://dev.twitch.tv/console) +- Add your Twitch OAuth Consumer keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Twitch Developer account + +- Go to [dev.twitch.tv](https://dev.twitch.tv). +- Click on `Log in with Twitch` at the top right to log in. +- If you have not already enabled 2-Factor Authentication for your Twitch Account, you will need to do that at [Twitch Security Settings](https://www.twitch.tv/settings/security) before you can continue. + +![Twitch Developer Page](/docs/img/guides/auth-twitch/twitch-developer-page.png) + +- Once logged in, go to the [Twitch Developer Console](https://dev.twitch.tv/console). + +![Twitch Developer Console](/docs/img/guides/auth-twitch/twitch-console.png) + +## Find your callback URL + +In the next step you require a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Twitch Application + +![Twitch Developer Console](/docs/img/guides/auth-twitch/twitch-console.png) + +- Click on `+ Register Your Application` at the top right. + +![Register Application](/docs/img/guides/auth-twitch/twitch-register-your-application.png) + +- Enter the name of your application. +- Type or paste your `OAuth Redirect URL` (the callback URL from the previous step.) +- Select a category for your app. +- Check the Captcha box and click `Create`. + +## Retrieve your Twitch OAuth Client ID and Client Secret + +- Click `Manage` at the right of your application entry in the list. + +![Twitch Applications List](/docs/img/guides/auth-twitch/twitch-applications-list.png) + +- Copy your Client ID. +- Click `New Secret` to create a new Client Secret. +- Copy your Client Secret. + +![Get Client ID and Secret](/docs/img/guides/auth-twitch/twitch-get-keys.png) + +## Add your Twitch credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Twitch Enabled` to ON +- Enter your `client_id` and `client_secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `twitch` as the `provider`: + +```js +async function signInWithTwitch() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'twitch', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Twitch Account](https://twitch.tv) +- [Twitch Developer Console](https://dev.twitch.tv/console) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx b/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx index c29dbe75b23..40cf31af0da 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-twitter.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-twitter.mdx' export const meta = { id: 'auth-twitter', @@ -7,11 +6,95 @@ export const meta = { description: 'Add Twitter OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Twitter Auth for your project, you need to set up a Twitter OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Twitter logins for your application consists of 3 parts: + +- Create and configure a Twitter Project and App on the [Twitter Developer Dashboard](https://developer.twitter.com/en/portal/dashboard). +- Add your Twitter `API Key` and `API Secret Key` to your [Supabase Project](https://app.supabase.com). +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js). + +## Access your Twitter Developer account + +- Go to [developer.twitter.com](https://developer.twitter.com). +- Click on `Sign in` at the top right to log in. + +![Twitter Developer Portal.](/docs/img/guides/auth-twitter/twitter-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Twitter OAuth app + +- Click `+ Create Project`. + - Enter your project name, click `Next`. + - Select your use case, click `Next`. + - Enter a description for your project, click `Next`. + - Enter a name for your app, click `Complete`. + - Copy and save your `API Key` (this is your `client_id`). + - Copy and save your `API Secret Key` (this is your `client_secret`). +- At the bottom, under `Next, setup your App` click the link `enable 3rd party authentication`. +- Under `App Settings`, click on the gear icon next to your app name to go to `App Settings`. +- At the bottom, next to `Authentication settings`, click `Edit`. +- Turn `Enable 3-legged OAuth` ON. +- Turn `Request email address from users` ON. +- Enter your `Callback URL`. +- Enter your `Website URL`. +- Enter your `Terms of service URL`. +- Enter your `Privacy policy URL`. +- Click `Save`. + +## Enter your Twitter credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- In the left sidebar, click the `Authentication` icon (near the top). +- Click `Settings` from the list to go to the `Authentication Settings` page. +- Enter the final (hosted) URL of your app under `Site URL` (this is important). +- Under `External OAuth Providers` turn `Twitter Enabled` to ON. +- Enter your `API Key` (`client_id`) and `API Secret Key` (`client_secret`) saved in the previous step. +- Click `Save`. + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `twitter` as the `provider`: + +```js +async function signInWithTwitter() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'twitter', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Twitter Developer Dashboard](https://developer.twitter.com/en/portal/dashboard) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-workos.mdx b/apps/docs/pages/guides/auth/social-login/auth-workos.mdx index 54ab92808ce..806a838207a 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-workos.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-workos.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-workos.mdx' export const meta = { id: 'auth-workos', @@ -7,11 +6,88 @@ export const meta = { description: 'Add WorkOS OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable WorkOS Auth for your project, you need to set up WorkOS OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +In this guide, we will cover how to use Supabase OAuth with WorkOS to implement Single-Sign-On(SSO). + +The procedure consists of five broad steps: + +- Create a new organization from your WorkOS Dashboard. +- Obtain the `Client ID` from the Configuration tab and configure redirect URI. +- Obtain the `WorkOS Secret` from the credentials tab. +- Connect a WorkOS Supported Identity Provider +- Add your WorkOS credentials into your Supabase project + +## Create a WorkOS Organization + +Log in to the dashboard and hop over to the Organizations tab to create and organization +![Create an Organization](/docs/img/guides/auth-workos/workos-create-organization.png) + +## Obtain the Client ID and configure Redirect URI + +Head over to the Configuration tab and configure the redirect URI.The redirect URI should look like `https://.supabase.co/auth/v1/callback` +Note that this is distinct from the redirect URI referred to in the Supabase dashboard + +![Fetch Client ID and configure Redirect URI](/docs/img/guides/auth-workos/workos-clientid-redirect-uri.png) + +## Obtain the WorkOS Secret + +Head over to the API Keys page and obtain the secret key. + +![WorkOS Secret Key](/docs/img/guides/auth-workos/workos-secret-key.png) + +## Connect a WorkOS Supported Identity Provider + +Set up the identity provider by visiting the setup link. + +![Visiting the setup link](/docs/img/guides/auth-workos/workos-setup-identity-provider.png) + +You can pick between any one of the many identity providers that WorkOS supports. + +## Add your WorkOS credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Under `External OAuth Providers` turn `WorkOS Enabled` to ON +- Enter the `Client ID`, `Secret`, and `WorkOS URL` saved in the previous steps. The ``WorkOS URL` setting should be set to https://api.workos.com/ +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `workos` as the `provider`: + +```js +async function signInWithWorkOS() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'workos', + options: { + queryParams: { + connection: '', + organization: '', + }, + }, + }) } +``` + +Refer to the [WorkOS Documentation](https://workos.com/docs/reference/sso/authorize/) to learn more about the different methods. + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [WorkOS Documentation](https://workos.com/docs/sso/guide) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx b/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx index 148b9772219..13d9de860c5 100644 --- a/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx +++ b/apps/docs/pages/guides/auth/social-login/auth-zoom.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/auth/auth-zoom.mdx' export const meta = { id: 'auth-zoom', @@ -7,11 +6,95 @@ export const meta = { description: 'Add Zoom OAuth to your Supabase project', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +To enable Zoom Auth for your project, you need to set up a Zoom OAuth application and add the application credentials to your Supabase Dashboard. + +## Overview + +Setting up Zoom logins for your application consists of 3 parts: + +- Create and configure a Zoom OAuth App on [Zoom App Marketplace](https://marketplace.zoom.us/) +- Add your Zoom OAuth keys to your [Supabase Project](https://app.supabase.com) +- Add the login code to your [Supabase JS Client App](https://github.com/supabase/supabase-js) + +## Access your Zoom Developer account + +- Go to [marketplace.zoom.us](https://marketplace.zoom.us/). +- Click on `Sign In` at the top right to log in. + +![Zoom Developer Portal.](/docs/img/guides/auth-zoom/zoom-portal.png) + +## Find your callback URL + +The next step requires a callback URL, which looks like this: + +`https://.supabase.co/auth/v1/callback` + +- Go to your [Supabase Project Dashboard](https://app.supabase.com). +- Click on the `Settings` icon at the bottom of the left sidebar. +- Click on `API` in the list. +- Under Config / URL you'll find your API URL, you can click `Copy` to copy it to the clipboard. +- Now just add `/auth/v1/callback` to the end of that to get your full `OAuth Redirect URI`. + + + +## Create a Zoom Oauth App + +- Go to [marketplace.zoom.us](https://marketplace.zoom.us/). +- Click on `Sign In` at the top right to log in. +- Click `Build App` (from the dropdown Develop) +- In the OAuth card, click `Create` +- Type the name of your app +- Choose app type +- Click `Create` + +Under `App credentials` + +- Copy and save your `Client ID`. +- Copy and save your `Client secret`. + +Under `Redirect URL for OAuth` + +- Paste your `Callback URL` +- Click `Continue` + +## Enter your Zoom credentials into your Supabase Project + +- Go to your [Supabase Project Dashboard](https://app.supabase.com) +- In the left sidebar, click the `Authentication` icon (near the top) +- Click `Settings` from the list to go to the `Authentication Settings` page +- Enter the final (hosted) URL of your app under `Site URL` (this is important) +- Under `External OAuth Providers` turn `Zoom Enabled` to ON +- Enter your `Zoom Client ID` and `Zoom Client Secret` saved in the previous step +- Click `Save` + +## Add login code to your client app + +When your user signs in, call [signInWithOAuth()](/docs/reference/javascript/auth-signinwithoauth) with `zoom` as the `provider`: + +```js +async function signInWithZoom() { + const { data, error } = await supabase.auth.signInWithOAuth({ + provider: 'zoom', + }) } +``` + +When your user signs out, call [signOut()](/docs/reference/javascript/auth-signout) to remove them from the browser session and any objects from localStorage: + +```js +async function signout() { + const { error } = await supabase.auth.signOut() +} +``` + +## Resources + +- [Supabase Account - Free Tier OK](https://supabase.com) +- [Supabase JS Client](https://github.com/supabase/supabase-js) +- [Zoom App Marketplace](https://marketplace.zoom.us/) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/cli.mdx b/apps/docs/pages/guides/cli.mdx deleted file mode 100644 index ef861654950..00000000000 --- a/apps/docs/pages/guides/cli.mdx +++ /dev/null @@ -1,122 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'cli', - title: 'Supabase CLI', - description: - 'The Supabase CLI provides tools to develop your project locally and deploy to the Supabase Platform.', - sidebar_label: 'Overview', - toc_max_heading_level: 2, -} - -The Supabase CLI provides tools to develop your project locally and deploy to the Supabase Platform. -You can also use the CLI to manage your Supabase projects, handle database migrations and CI/CD workflows, and generate types directly from your database schema. - -## Installation - - - - -Install the CLI as dev dependency via [npm](https://www.npmjs.com/package/supabase): - -```sh -npm install supabase --save-dev -``` - - - - -Install the CLI with [Homebrew](https://brew.sh): - -```sh -brew install supabase/tap/supabase -``` - - - - -Install the CLI with [Scoop](https://scoop.sh): - -```powershell -scoop bucket add supabase https://github.com/supabase/scoop-bucket.git -scoop install supabase -``` - - - - -The CLI is available through [Homebrew](https://brew.sh) and Linux packages. - -#### Homebrew - -```sh -brew install supabase/tap/supabase -``` - -#### Linux packages - -Linux packages are provided in [Releases](https://github.com/supabase/cli/releases). -To install, download the `.apk`/`.deb`/`.rpm` file depending on your package manager -and run one of the following: - -- `sudo apk add --allow-untrusted <...>.apk` -- `sudo dpkg -i <...>.deb` -- `sudo rpm -i <...>.rpm` - - - - -## Updates - -When a new [version](https://github.com/supabase/cli/releases) is released, you can update the CLI using the same methods. - - - - -```sh -npm update supabase --save-dev -``` - - - - -```sh -brew upgrade supabase -``` - - - - -```powershell -scoop update supabase -``` - - - - -```sh -brew upgrade supabase -``` - - - - -## See also - -- [Supabase CLI Reference](/docs/reference/cli/usage) -- [Local Development](/docs/guides/cli/local-development) -- [Managing Environments](/docs/guides/cli/managing-environments) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/cli/local-development.mdx b/apps/docs/pages/guides/cli/local-development.mdx deleted file mode 100644 index 4586927a3f4..00000000000 --- a/apps/docs/pages/guides/cli/local-development.mdx +++ /dev/null @@ -1,261 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'local-development', - title: 'Local Development', - description: 'How to use Supabase on your local development machine.', -} - -Learn how to use the Supabase CLI to develop your project locally and deploy to the Supabase Platform. - -
- -
- -## Prerequisites - -Make sure you have these installed on your local machine: - -- [Docker](https://docs.docker.com/engine/install/) -- [Git](https://github.com/git-guides/install-git) -- [Supabase CLI](/docs/guides/cli) - -## Log in to the Supabase CLI - -```bash -supabase login -``` - -## Initialize your project - -Create a new folder for your project and start a new git repository: - -```bash -# create your project folder -mkdir your-project - -# move into the new folder -cd your-project - -# start a new git repository -git init -``` - -## Start Supabase services - -[Initialize](/docs/reference/cli/usage#supabase-init) Supabase to set up the configuration for developing your project locally: - -```bash -supabase init -``` - -Make sure Docker is running. The [start](/docs/reference/cli/usage#supabase-start) command uses Docker to start the Supabase [services](/docs/architecture). -This command may take a while to run if this is the first time using the CLI. - -```bash -supabase start -``` - -Once all of the Supabase services are running, you'll see output containing your local Supabase credentials. -You can use the [stop](/docs/reference/cli/usage#supabase-stop) command at any time to stop all services. - -## Access services - -You can access services directly with any Postgres client or through the API Gateway ([Kong](https://github.com/Kong/kong)). - - - - -```sh -# Default URL: -postgresql://postgres:postgres@localhost:54322/postgres -``` - -The local Postgres instance can be accessed through [`psql`](https://www.postgresql.org/docs/current/app-psql.html) -or any other Postgres client, such as [pgadmin](https://www.pgadmin.org/). - -For example: - -```bash -psql 'postgresql://postgres:postgres@localhost:54322/postgres' -``` - - - -To access the database from an edge function in your local Supabase setup, replace `localhost` with `host.docker.internal`. - - - - - - -```sh -# Default URL: -http://localhost:54321 -``` - -If you are accessing these services without the client libraries, you may need to pass the client keys as an `Authorization` header. -Learn more about [JWT headers](/docs/learn/auth-deep-dive/auth-deep-dive-jwts). - -```sh -curl 'http://localhost:54321/rest/v1/' \ - -H "apikey: " \ - -H "Authorization: Bearer " - -http://localhost:54321/rest/v1/ # REST (PostgREST) -http://localhost:54321/realtime/v1/ # Realtime -http://localhost:54321/storage/v1/ # Storage -http://localhost:54321/auth/v1/ # Auth (GoTrue) -``` - - - -`` is provided when you run the command `supabase start`. - - - - - - -## Database migrations - -Database changes are managed through "migrations." Database migrations are a common way of tracking changes to your database over time. - -
- -
- -### Make database changes - -For this guide, create a table called `employees`. In Supabase Studio, navigate to the **SQL Editor** page and run the following SQL command: - -```sql -create table employees ( - id integer primary key generated always as identity, - name text -); -``` - - - -You can execute any SQL using the `DB URL` shown by [`supabase status`](/docs/reference/cli/usage#supabase-status). - - - -Run the [`db diff`](/docs/reference/cli/usage#supabase-db-diff) command to detect changes in the local database: - -```sh -supabase db diff create_employees -f create_employees -``` - -This creates a new migration named `supabase/migrations/_create_employees.sql`, representing any changes made to the local database since [`supabase start`](/docs/reference/cli/usage#supabase-start). - -### Add sample data - -Use the seed script in `supabase/seed.sql` (created with [`supabase init`](/docs/reference/cli/usage#supabase-init)) to add sample data to the table. - -```sql --- in supabase/seed.sql -insert into public.employees (name) -values - ('Erlich Backman'), - ('Richard Hendricks'), - ('Monica Hall'); -``` - -Rerun the migration and seed scripts: - -```bash -supabase db reset -``` - -You should now see the contents of `employees` in Studio. - -### Reset database changes - -Use the [`reset`](/docs/reference/cli/usage#supabase-db-reset) command to revert any changes to the local database. - -```sql --- run on local database to make a change -alter table employees - add department text default 'Hooli'; -``` - -Run the following command to reset the local database: - -```sh -supabase db reset -``` - -## Deploy your project - -Go to the [Supabase Dashboard](https://app.supabase.com) and create a project to deploy the changes. - -### Link your project - - - -There are a few commands required to link your project. We are in the process of consolidating these commands into a single command. Bear with us! - - - -Associate your project with your remote project using [`supabase link`](/docs/reference/cli/usage#supabase-link). - -```bash -supabase link --project-ref -# You can get from your project’s dashboard URL: https://app.supabase.com/project/ - -supabase db remote commit -# Capture any changes that you have made to your database before setting up the CLI -``` - -`supabase/migrations` is now populated with a migration in `..._remote_commit.sql`. -This migration captures any changes required for your local database to match the schema of your remote Supabase project. - -### Deploy database changes - -Deploy any local database migrations using [`db push`](/docs/reference/cli/usage#supabase-db-push): - -```sh -supabase db push -``` - -### Deploy Edge Functions - -Deploy any Edge Functions using [`functions deploy`](/docs/reference/cli/usage#supabase-functions-deploy): - -```sh -supabase functions deploy -``` - -## Limitations - -The local development environment is not as feature-complete as the Supabase Platform. Here are some of the differences: - -- The Storage interface is coming soon. -- The Functions interface is coming soon. -- Logs are not supported through the interface (however you can access them through the Docker containers). -- You cannot update your project settings in the Dashboard—this must be done using the CLI. - -``` - -``` - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/database/overview.mdx b/apps/docs/pages/guides/database/overview.mdx index 1cfbc2357db..7efa2ad7513 100644 --- a/apps/docs/pages/guides/database/overview.mdx +++ b/apps/docs/pages/guides/database/overview.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/database.mdx' export const meta = { id: 'database', @@ -8,11 +7,87 @@ export const meta = { sidebar_label: 'Overview', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +Every Supabase project comes with a full [Postgres](https://www.postgresql.org/) database, a free and open source +database which is considered one of the world's most stable and advanced databases. + +## Postgres or PostgreSQL? + +PostgreSQL the database was derived from the POSTGRES Project, a package written at the University of California at Berkeley in 1986. +This package included a query language called "PostQUEL". + +In 1994, Postgres95 was built on top of POSTGRES code, adding an SQL language interpreter as a replacement for PostQUEL. +Eventually, Postgres95 was renamed to PostgreSQL to reflect the SQL query capability. + +After this, many people referred to it as Postgres since it's less prone to confusion. Supabase is all about +simplicity, so we also refer to it as Postgres. + +## Features + +### Table View + +You don't have to be a database expert to start using Supabase. Our table view makes Postgres as easy to use as a spreadsheet. + +![Table View.](/docs/img/table-view.png) + +### Relationships + +Dig into the relationships within your data. + + + +### Clone tables + +You can duplicate your tables, just like you would inside a spreadsheet. + + + +### The SQL Editor + +Supabase comes with a SQL Editor. You can also save your favorite queries to run later! + + + +### Additional features + +- Supabase extends Postgres with realtime functionality using our [Realtime Server](https://github.com/supabase/realtime). +- Every project is a full Postgres database, with `postgres` level access. +- Supabase manages your database backups. +- Import data directly from a CSV or excel spreadsheet. + + + +Database backups **do not** include objects stored via the Storage API, as the database only +includes metadata about these objects. Restoring an old backup does not restore objects that have +been deleted since then. + + + +### Extensions + +To expand the functionality of your Postgres database, you can use extensions. +You can enable Postgres extensions with the click of a button within the Supabase dashboard. + + + +[Learn more](/docs/guides/database/extensions) about all the extensions provided on Supabase. + +## Tips + +Read about resetting your database password [here](/docs/guides/database/managing-passwords) and changing the timezone of your server [here](/docs/guides/database/managing-timezones). + +## Next steps + +- Read more about [Postgres](https://www.postgresql.org/about/) +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/getting-started.mdx b/apps/docs/pages/guides/getting-started.mdx index f751794966c..aa58bb10dd9 100644 --- a/apps/docs/pages/guides/getting-started.mdx +++ b/apps/docs/pages/guides/getting-started.mdx @@ -157,8 +157,7 @@ export const resources = [ title: 'Architecture', hasLightIcon: true, href: '/architecture', - description: - 'An overview of Supabase\'s architecture and product principles.', + description: "An overview of Supabase's architecture and product principles.", }, ] diff --git a/apps/docs/pages/guides/getting-started/architecture.mdx b/apps/docs/pages/guides/getting-started/architecture.mdx deleted file mode 100644 index 2552c09bcf1..00000000000 --- a/apps/docs/pages/guides/getting-started/architecture.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/architecture.mdx' - -export const meta = { - id: 'architecture', - title: 'Architecture', - description: 'Supabase design and architecture', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/getting-started/features.mdx b/apps/docs/pages/guides/getting-started/features.mdx deleted file mode 100644 index b81ad1d6a29..00000000000 --- a/apps/docs/pages/guides/getting-started/features.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/features.mdx' - -export const meta = { - id: 'features', - title: 'Features', - description: 'Supabase features', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx index a0770366dff..b0d5fc21c93 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-angular.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-angular.mdx' export const meta = { id: 'with-angular', @@ -8,11 +7,536 @@ export const meta = { sidebar_label: 'Angular', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/angular-user-management). + + + +## Building the App + +Let's start building the Angular app from scratch. + +### Initialize an Angular app + +We can use the [Angular CLI](https://angular.io/cli) to initialize +an app called `supabase-angular`: + +```bash +npx ng new supabase-angular --routing false --style css +cd supabase-angular +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in the `environment.ts` file. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). +These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```ts title=environment.ts +export const environment = { + production: false, + supabaseUrl: 'YOUR_SUPABASE_URL', + supabaseKey: 'YOUR_SUPABASE_KEY', +} +``` + +Now that we have the API credentials in place, let's create a **SupabaseService** with `ng g s supabase` to initialize the Supabase client and implement functions to communicate with the Supabase API. + +```ts title=src/app/supabase.service.ts +import { Injectable } from '@angular/core' +import { + AuthChangeEvent, + AuthSession, + createClient, + Session, + SupabaseClient, + User, +} from '@supabase/supabase-js' +import { environment } from 'src/environments/environment' +import { Database } from 'src/schema' + +export interface Profile { + id?: string + username: string + website: string + avatar_url: string } +@Injectable({ + providedIn: 'root', +}) +export class SupabaseService { + private supabase: SupabaseClient + _session: AuthSession | null = null + + constructor() { + this.supabase = createClient(environment.supabaseUrl, environment.supabaseKey) + } + + get session() { + this.supabase.auth.getSession().then(({ data }) => { + this._session = data.session + }) + return this._session + } + + profile(user: User) { + return this.supabase + .from('profiles') + .select(`username, website, avatar_url`) + .eq('id', user.id) + .single() + } + + authChanges(callback: (event: AuthChangeEvent, session: Session | null) => void) { + return this.supabase.auth.onAuthStateChange(callback) + } + + signIn(email: string) { + return this.supabase.auth.signInWithOtp({ email }) + } + + signOut() { + return this.supabase.auth.signOut() + } + + updateProfile(profile: Profile) { + const update = { + ...profile, + updated_at: new Date(), + } + + return this.supabase.from('profiles').upsert(update) + } + + downLoadImage(path: string) { + return this.supabase.storage.from('avatars').download(path) + } + + uploadAvatar(filePath: string, file: File) { + return this.supabase.storage.from('avatars').upload(filePath, file) + } +} +``` + +Optionally, update [src/styles.css](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/angular-user-management/src/styles.css) to style the app. + +### Set up a Login component + +Let's set up an Angular component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. +Create an **AuthComponent** with `ng g c auth` Angular CLI command. + +```ts title=src/app/auth/auth.component.ts +import { Component, OnInit } from '@angular/core' +import { FormBuilder } from '@angular/forms' +import { SupabaseService } from '../supabase.service' + +@Component({ + selector: 'app-auth', + templateUrl: './auth.component.html', + styleUrls: ['./auth.component.css'], +}) +export class AuthComponent implements OnInit { + loading = false + + signInForm = this.formBuilder.group({ + email: '', + }) + + constructor( + private readonly supabase: SupabaseService, + private readonly formBuilder: FormBuilder + ) {} + + ngOnInit(): void {} + + async onSubmit(): Promise { + try { + this.loading = true + const email = this.signInForm.value.email as string + const { error } = await this.supabase.signIn(email) + if (error) throw error + alert('Check your email for the login link!') + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + this.signInForm.reset() + this.loading = false + } + } +} +``` + +```html title=src/app/auth/auth.component.html +
+
+

Supabase + Angular

+

Sign in via magic link with your email below

+
+
+ + +
+
+ +
+
+
+
{ + await this.getProfile() + + const { username, website, avatar_url } = this.profile + this.updateProfileForm.patchValue({ + username, + website, + avatar_url, + }) + } + + async getProfile() { + try { + this.loading = true + const { user } = this.session + let { data: profile, error, status } = await this.supabase.profile(user) + + if (error && status !== 406) { + throw error + } + + if (profile) { + this.profile = profile + } + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + this.loading = false + } + } + + async updateProfile(): Promise { + try { + this.loading = true + const { user } = this.session + + const username = this.updateProfileForm.value.username as string + const website = this.updateProfileForm.value.website as string + const avatar_url = this.updateProfileForm.value.avatar_url as string + + const { error } = await this.supabase.updateProfile({ + id: user.id, + username, + website, + avatar_url, + }) + if (error) throw error + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + this.loading = false + } + } + + async signOut() { + await this.supabase.signOut() + } +} +``` + +```html title=src/app/account/account.component.html +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +
+ +
+
+``` + +### Launch! + +Now that we have all the components in place, let's update **AppComponent**: + +```ts title=src/app/app.component.ts +import { Component, OnInit } from '@angular/core' +import { SupabaseService } from './supabase.service' + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'], +}) +export class AppComponent implements OnInit { + title = 'angular-user-management' + + session = this.supabase.session + + constructor(private readonly supabase: SupabaseService) {} + + ngOnInit() { + this.supabase.authChanges((_, session) => (this.session = session)) + } +} +``` + +```html title=src/app/app.component.html +
+ + + + +
+``` + +`app.module.ts` also needs to be modified to include the `ReactiveFormsModule` from the `@angular/forms` package. + +```ts title=src/app/app.module.ts +import { NgModule } from '@angular/core' +import { BrowserModule } from '@angular/platform-browser' + +import { AppComponent } from './app.component' +import { AuthComponent } from './auth/auth.component' +import { AccountComponent } from './account/account.component' +import { ReactiveFormsModule } from '@angular/forms' +import { AvatarComponent } from './avatar/avatar.component' + +@NgModule({ + declarations: [AppComponent, AuthComponent, AccountComponent, AvatarComponent], + imports: [BrowserModule, ReactiveFormsModule], + providers: [], + bootstrap: [AppComponent], +}) +export class AppModule {} +``` + +Once that's done, run this in a terminal window: + +```bash +npm run start +``` + +And then open the browser to [localhost:4200](http://localhost:4200) and you should see the completed app. + +![Supabase Angular](/docs/img/supabase-angular-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. +Create an **AvatarComponent** with `ng g c avatar` Angular CLI command. + +```ts title=src/app/avatar/avatar.component.ts +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core' +import { SafeResourceUrl, DomSanitizer } from '@angular/platform-browser' +import { SupabaseService } from '../supabase.service' + +@Component({ + selector: 'app-avatar', + templateUrl: './avatar.component.html', + styleUrls: ['./avatar.component.css'], +}) +export class AvatarComponent implements OnInit { + _avatarUrl: SafeResourceUrl | undefined + uploading = false + + @Input() + set avatarUrl(url: string | null) { + if (url) { + this.downloadImage(url) + } + } + + @Output() upload = new EventEmitter() + + constructor(private readonly supabase: SupabaseService, private readonly dom: DomSanitizer) {} + + ngOnInit(): void {} + + async downloadImage(path: string) { + try { + const { data } = await this.supabase.downLoadImage(path) + if (data instanceof Blob) { + this._avatarUrl = this.dom.bypassSecurityTrustResourceUrl(URL.createObjectURL(data)) + } + } catch (error) { + if (error instanceof Error) { + console.error('Error downloading image: ', error.message) + } + } + } + + async uploadAvatar(event: any) { + try { + this.uploading = true + if (!event.target.files || event.target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = event.target.files[0] + const fileExt = file.name.split('.').pop() + const filePath = `${Math.random()}.${fileExt}` + + await this.supabase.uploadAvatar(filePath, file) + this.upload.emit(filePath) + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + this.uploading = false + } + } +} +``` + +```html title=src/app/avatar/avatar.component.html +
+ Avatar +
+
+
+ + +
+``` + +### Add the new widget + +And then we can add the widget on top of the **AccountComponent** html template: + +```html title=src/app/account.component.html +
+ + +
+``` + +And add an `updateAvatar` function along with an `avatarUrl` getter to the **AccountComponent** typescript file: + +```ts title=src/app/account.component.ts +@Component({ + selector: 'app-account', + templateUrl: './account.component.html', + styleUrls: ['./account.component.css'], +}) +export class AccountComponent implements OnInit { + // ... + get avatarUrl() { + return this.updateProfileForm.value.avatar_url as string + } + + async updateAvatar(event: string): Promise { + this.updateProfileForm.patchValue({ + avatar_url: event, + }) + await this.updateProfile() + } + // ... +} +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => + export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-expo.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-expo.mdx index 77544c71214..b60db313a51 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-expo.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-expo.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-expo.mdx' export const meta = { id: 'with-expo', @@ -9,11 +8,505 @@ export const meta = { hide_table_of_contents: false, } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/supabase-flutter-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/expo-user-management). + + + +## Building the App + +Let's start building the React Native app from scratch. + +### Initialize a React Native app + +We can use [`expo`](https://docs.expo.dev/get-started/create-a-new-app/) to initialize +an app called `expo-user-management`: + +```bash +npx create-expo-app -t expo-template-blank-typescript expo-user-management + +cd expo-user-management +``` + +Then let's install the additional dependencies: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +npm install react-native-elements @react-native-async-storage/async-storage react-native-url-polyfill +``` + +Now let's create a helper file to initialize the Supabase client. +We need the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). +These variables will be exposed on the browser, and that's completely fine since we have +[Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```ts title=lib/supabase.ts +import AsyncStorage from '@react-native-async-storage/async-storage' +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = YOUR_REACT_NATIVE_SUPABASE_URL +const supabaseAnonKey = YOUR_REACT_NATIVE_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey, { + auth: { + storage: AsyncStorage as any, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: false, + }, +}) +``` + +### Set up a Login component + +Let's set up a React Native component to manage logins and sign ups. +Users would be able to sign in with their email and password. + +```tsx title=components/Auth.tsx +import React, { useState } from 'react' +import { Alert, StyleSheet, View } from 'react-native' +import { supabase } from '../lib/supabase' +import { Button, Input } from 'react-native-elements' + +export default function Auth() { + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [loading, setLoading] = useState(false) + + async function signInWithEmail() { + setLoading(true) + const { error } = await supabase.auth.signInWithPassword({ + email: email, + password: password, + }) + + if (error) Alert.alert(error.message) + setLoading(false) } - return + + async function signUpWithEmail() { + setLoading(true) + const { error } = await supabase.auth.signUp({ + email: email, + password: password, + }) + + if (error) Alert.alert(error.message) + setLoading(false) + } + + return ( + + + setEmail(text)} + value={email} + placeholder="email@address.com" + autoCapitalize={'none'} + /> + + + setPassword(text)} + value={password} + secureTextEntry={true} + placeholder="Password" + autoCapitalize={'none'} + /> + + + +
+ +
+ +
+
+ ) +} +``` + + + + +Let's create a new component for that called `Account.tsx` within a `components` folder. + +```tsx title=components/Account.tsx +import { useState, useEffect } from 'react' +import { useUser, useSupabaseClient, Session } from '@supabase/auth-helpers-react' +import { Database } from '../utils/database.types' +type Profiles = Database['public']['Tables']['profiles']['Row'] + +export default function Account({ session }: { session: Session }) { + const supabase = useSupabaseClient() + const user = useUser() + const [loading, setLoading] = useState(true) + const [username, setUsername] = useState(null) + const [website, setWebsite] = useState(null) + const [avatar_url, setAvatarUrl] = useState(null) + + useEffect(() => { + getProfile() + }, [session]) + + async function getProfile() { + try { + setLoading(true) + if (!user) throw new Error('No user') + + let { data, error, status } = await supabase + .from('profiles') + .select(`username, website, avatar_url`) + .eq('id', user.id) + .single() + + if (error && status !== 406) { + throw error + } + + if (data) { + setUsername(data.username) + setWebsite(data.website) + setAvatarUrl(data.avatar_url) + } + } catch (error) { + alert('Error loading user data!') + console.log(error) + } finally { + setLoading(false) + } + } + + async function updateProfile({ + username, + website, + avatar_url, + }: { + username: Profiles['username'] + website: Profiles['website'] + avatar_url: Profiles['avatar_url'] + }) { + try { + setLoading(true) + if (!user) throw new Error('No user') + + const updates = { + id: user.id, + username, + website, + avatar_url, + updated_at: new Date().toISOString(), + } + + let { error } = await supabase.from('profiles').upsert(updates) + if (error) throw error + alert('Profile updated!') + } catch (error) { + alert('Error updating the data!') + console.log(error) + } finally { + setLoading(false) + } + } + + return ( +
+
+ + +
+
+ + setUsername(e.target.value)} + /> +
+
+ + setWebsite(e.target.value)} + /> +
+ +
+ +
+ +
+ +
+
+ ) +} +``` + +
+ + +### Launch! + +Now that we have all the components in place, let's update `pages/index.js`: + +```jsx lines=3,14 title=pages/index.js +import { Auth, ThemeSupa } from '@supabase/auth-ui-react' +import { useSession, useSupabaseClient } from '@supabase/auth-helpers-react' +import Account from '../components/Account' + +const Home = () => { + const session = useSession() + const supabase = useSupabaseClient() + + return ( +
+ {!session ? ( + + ) : ( + + )} +
+ ) +} + +export default Home +``` + +Once that's done, run this in a terminal window: + +```bash +npm run dev +``` + +And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like +photos and videos. + +### Create an upload widget + +Let's create an avatar widget for the user so that they can upload a profile photo. We can start by creating a new component: + + + + +```jsx title=components/Avatar.js +import React, { useEffect, useState } from 'react' +import { useSupabaseClient } from '@supabase/auth-helpers-react' + +export default function Avatar({ uid, url, size, onUpload }) { + const supabase = useSupabaseClient() + const [avatarUrl, setAvatarUrl] = useState(null) + const [uploading, setUploading] = useState(false) + + useEffect(() => { + if (url) downloadImage(url) + }, [url]) + + async function downloadImage(path) { + try { + const { data, error } = await supabase.storage.from('avatars').download(path) + if (error) { + throw error + } + const url = URL.createObjectURL(data) + setAvatarUrl(url) + } catch (error) { + console.log('Error downloading image: ', error) + } + } + + const uploadAvatar = async (event) => { + try { + setUploading(true) + + if (!event.target.files || event.target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = event.target.files[0] + const fileExt = file.name.split('.').pop() + const fileName = `${uid}.${fileExt}` + const filePath = `${fileName}` + + let { error: uploadError } = await supabase.storage + .from('avatars') + .upload(filePath, file, { upsert: true }) + + if (uploadError) { + throw uploadError + } + + onUpload(filePath) + } catch (error) { + alert('Error uploading avatar!') + console.log(error) + } finally { + setUploading(false) + } + } + + return ( +
+ {avatarUrl ? ( + Avatar + ) : ( +
+ )} +
+ + +
+
+ ) +} +``` + + + + +```tsx title=components/Avatar.tsx +import React, { useEffect, useState } from 'react' +import { useSupabaseClient } from '@supabase/auth-helpers-react' +import { Database } from '../utils/database.types' +type Profiles = Database['public']['Tables']['profiles']['Row'] + +export default function Avatar({ + uid, + url, + size, + onUpload, +}: { + uid: string + url: Profiles['avatar_url'] + size: number + onUpload: (url: string) => void +}) { + const supabase = useSupabaseClient() + const [avatarUrl, setAvatarUrl] = useState(null) + const [uploading, setUploading] = useState(false) + + useEffect(() => { + if (url) downloadImage(url) + }, [url]) + + async function downloadImage(path: string) { + try { + const { data, error } = await supabase.storage.from('avatars').download(path) + if (error) { + throw error + } + const url = URL.createObjectURL(data) + setAvatarUrl(url) + } catch (error) { + console.log('Error downloading image: ', error) + } + } + + const uploadAvatar: React.ChangeEventHandler = async (event) => { + try { + setUploading(true) + + if (!event.target.files || event.target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = event.target.files[0] + const fileExt = file.name.split('.').pop() + const fileName = `${uid}.${fileExt}` + const filePath = `${fileName}` + + let { error: uploadError } = await supabase.storage + .from('avatars') + .upload(filePath, file, { upsert: true }) + + if (uploadError) { + throw uploadError + } + + onUpload(filePath) + } catch (error) { + alert('Error uploading avatar!') + console.log(error) + } finally { + setUploading(false) + } + } + + return ( +
+ {avatarUrl ? ( + Avatar + ) : ( +
+ )} +
+ + +
+
+ ) +} +``` + + + + +### Add the new widget + +And then we can add the widget to the Account page: + +```jsx title=components/Account.js +// Import the new component +import Avatar from './Avatar' + +// ... + +return ( +
+ {/* Add to the body */} + { + setAvatarUrl(url) + updateProfile({ username, website, avatar_url: url }) + }} + /> + {/* ... */} +
+) +``` + +## Next steps + +At this stage you have a fully functional application! + +- See the complete [example on GitHub](https://github.com/supabase/supabase/tree/master/examples/user-management/nextjs-ts-user-management) and deploy it to Vercel. +- Explore the [pre-built Auth UI for React](/docs/guides/auth/auth-helpers/auth-ui). +- Explore the [Auth Helpers for Next.js](/docs/guides/auth/auth-helpers/nextjs). +- Explore the [Supabase Cache Helpers](https://github.com/psteinroe/supabase-cache-helpers). +- See the [Next.js Subscription Payments Starter](https://github.com/vercel/nextjs-subscription-payments) template on GitHub. +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => + export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-nuxt-3.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-nuxt-3.mdx index f5f452b09e7..b4f5af0a1a3 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-nuxt-3.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-nuxt-3.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-nuxt-3.mdx' export const meta = { id: 'with-nuxt-3', @@ -8,11 +7,426 @@ export const meta = { sidebar_label: 'Nuxt 3', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### Github + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/nuxt3-user-management). + + + +## Building the App + +Let's start building the Vue 3 app from scratch. + +### Initialize a Nuxt 3 app + +We can use [`nuxi init`](https://v3.nuxtjs.org/getting-started/quick-start/) to create an app called `nuxt-user-management`: + +```bash +npx nuxi init nuxt-user-management + +cd nuxt-user-management +``` + +Then let's install the only additional dependency: [NuxtSupabase](https://supabase.nuxtjs.org/). We only need to import NuxtSupabase as a dev dependency. + +```bash +npm install @nuxtjs/supabase --save-dev +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +SUPABASE_URL="YOUR_SUPABASE_URL" +SUPABASE_KEY="YOUR_SUPABASE_ANON_KEY" +``` + +These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. +Amazing thing about [NuxtSupabase](https://supabase.nuxtjs.org/) is that setting environment variables is all we need to do in order to start using Supabase. +No need to initialize Supabase. The library will take care of it automatically. + +And one optional step is to update the CSS file `assets/main.css` to make the app look nice. +You can find the full contents of this file [here](https://github.com/supabase-community/nuxt3-quickstarter/blob/main/assets/main.css). + +```typescript title=nuxt.config.ts +import { defineNuxtConfig } from 'nuxt' + +// https://v3.nuxtjs.org/api/configuration/nuxt.config +export default defineNuxtConfig({ + modules: ['@nuxtjs/supabase'], + css: ['@/assets/main.css'], +}) +``` + +### Set up Auth component + +Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```html title=/components/Auth.vue + + + +``` + +### User state + +To access the user information, use the composable [useSupabaseUser](https://supabase.nuxtjs.org/usage/composables/use-supabase-user) provided by the Supabase Nuxt module. + +### Account component + +After a user is signed in we can allow them to edit their profile details and manage their account. +Let's create a new component for that called `Account.vue`. + +```html title=components/Account.vue + + + +``` + +### Launch! + +Now that we have all the components in place, let's update `app.vue`: + +```html title=app.vue + + + +``` + +Once that's done, run this in a terminal window: + +```bash +npm run dev +``` + +And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. + +![Supabase Nuxt 3](/docs/img/supabase-vue-3-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```html title=components/Avatar.vue + + + +``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```html title=components/Account.vue + + + +``` + +That is it! You should now be able to upload a profile photo to Supabase Storage. + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx index 58e435bab29..1f7804f15ab 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-react.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-react.mdx' export const meta = { id: 'with-react', @@ -8,11 +7,397 @@ export const meta = { sidebar_label: 'React', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/react-user-management). + + + +## Building the App + +Let's start building the React app from scratch. + +### Initialize a React app + +We can use [Create React App](https://create-react-app.dev/docs/getting-started/) to initialize +an app called `supabase-react`: + +```bash +npx create-react-app supabase-react +cd supabase-react +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js). + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +REACT_APP_SUPABASE_URL=YOUR_SUPABASE_URL +REACT_APP_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY +``` + +Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed +on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```js title=src/supabaseClient.js +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = process.env.REACT_APP_SUPABASE_URL +const supabaseAnonKey = process.env.REACT_APP_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey) +``` + +And one optional step is to update the CSS file `src/index.css` to make the app look nice. +You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/react-user-management/src/index.css). + +### Set up a Login component + +Let's set up a React component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```jsx title=src/Auth.js +import { useState } from 'react' +import { supabase } from './supabaseClient' + +export default function Auth() { + const [loading, setLoading] = useState(false) + const [email, setEmail] = useState('') + + const handleLogin = async (e) => { + e.preventDefault() + + try { + setLoading(true) + const { error } = await supabase.auth.signInWithOtp({ email }) + if (error) throw error + alert('Check your email for the login link!') + } catch (error) { + alert(error.error_description || error.message) + } finally { + setLoading(false) + } } - return + + return ( +
+
+

Supabase + React

+

Sign in via magic link with your email below

+ {loading ? ( + 'Sending magic link...' + ) : ( +
+ + setEmail(e.target.value)} + /> + +
+ )} +
+
+ ) +} +``` + +### Account page + +After a user is signed in we can allow them to edit their profile details and manage their account. + +Let's create a new component for that called `Account.js`. + +```jsx title=src/Account.js +import { useState, useEffect } from 'react' +import { supabase } from './supabaseClient' + +const Account = ({ session }) => { + const [loading, setLoading] = useState(true) + const [username, setUsername] = useState(null) + const [website, setWebsite] = useState(null) + const [avatar_url, setAvatarUrl] = useState(null) + + useEffect(() => { + getProfile() + }, [session]) + + const getProfile = async () => { + try { + setLoading(true) + const { user } = session + + let { data, error, status } = await supabase + .from('profiles') + .select(`username, website, avatar_url`) + .eq('id', user.id) + .single() + + if (error && status !== 406) { + throw error + } + + if (data) { + setUsername(data.username) + setWebsite(data.website) + setAvatarUrl(data.avatar_url) + } + } catch (error) { + alert(error.message) + } finally { + setLoading(false) + } + } + + const updateProfile = async (e) => { + e.preventDefault() + + try { + setLoading(true) + const { user } = session + + const updates = { + id: user.id, + username, + website, + avatar_url, + updated_at: new Date(), + } + + let { error } = await supabase.from('profiles').upsert(updates) + + if (error) { + throw error + } + } catch (error) { + alert(error.message) + } finally { + setLoading(false) + } + } + + return ( +
+ {loading ? ( + 'Saving ...' + ) : ( +
+
Email: {session.user.email}
+
+ + setUsername(e.target.value)} + /> +
+
+ + setWebsite(e.target.value)} + /> +
+
+ +
+
+ )} + +
+ ) } +export default Account +``` + +### Launch! + +Now that we have all the components in place, let's update `App.js`: + +```jsx title=src/App.js +import './index.css' +import { useState, useEffect } from 'react' +import { supabase } from './supabaseClient' +import Auth from './Auth' +import Account from './Account' + +export default function App() { + const [session, setSession] = useState(null) + + useEffect(() => { + supabase.auth.getSession().then(({ data: { session } }) => { + setSession(session) + }) + + supabase.auth.onAuthStateChange((_event, session) => { + setSession(session) + }) + }, []) + + return ( +
+ {!session ? : } +
+ ) +} +``` + +Once that's done, run this in a terminal window: + +```bash +npm start +``` + +And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. + +![Supabase React](/docs/img/supabase-react-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```jsx title=src/Avatar.js +import { useEffect, useState } from 'react' +import { supabase } from './supabaseClient' + +export default function Avatar({ url, size, onUpload }) { + const [avatarUrl, setAvatarUrl] = useState(null) + const [uploading, setUploading] = useState(false) + + useEffect(() => { + if (url) downloadImage(url) + }, [url]) + + const downloadImage = async (path) => { + try { + const { data, error } = await supabase.storage.from('avatars').download(path) + if (error) { + throw error + } + const url = URL.createObjectURL(data) + setAvatarUrl(url) + } catch (error) { + console.log('Error downloading image: ', error.message) + } + } + + const uploadAvatar = async (event) => { + try { + setUploading(true) + + if (!event.target.files || event.target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = event.target.files[0] + const fileExt = file.name.split('.').pop() + const fileName = `${Math.random()}.${fileExt}` + const filePath = `${fileName}` + + let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) + + if (uploadError) { + throw uploadError + } + + onUpload(filePath) + } catch (error) { + alert(error.message) + } finally { + setUploading(false) + } + } + + return ( +
+ {avatarUrl + {uploading ? ( + 'Uploading...' + ) : ( + <> + +
+ +
+ + )} +
+ ) +} +``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```jsx title=src/Account.js +// Import the new component +import Avatar from './Avatar' + +// ... + +return ( +
+ {/* Add to the body */} + { + setAvatarUrl(url) + updateProfile({ username, website, avatar_url: url }) + }} + /> + {/* ... */} +
+) +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => + export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-redwoodjs.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-redwoodjs.mdx index 1d044ed13f5..cae8504a010 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-redwoodjs.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-redwoodjs.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-redwoodjs.mdx' export const meta = { id: 'with-redwoodjs', @@ -8,11 +7,779 @@ export const meta = { sidebar_label: 'RedwoodJS', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +## Intro + +For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. + +We **_won't use_** Prisma to connect to the Supabase Postgres database or [Prisma migrations](https://redwoodjs.com/docs/cli-commands#prisma-migrate) as one typically might in a Redwood app. +Instead, we'll rely on the Supabase client to do some of the work on the **web** side and use the client again on the **API** side to do data fetching as well. + +That means you will want to refrain from running any `yarn rw prisma migrate` commands and also double check your build commands on deployment to ensure Prisma won't reset your database. + + + +TLDR; Prisma currently doesn't support cross-schema foreign keys, so introspecting the schema fails due to how your Supabase `public` schema references the `auth.users`. + + + +This example provides the steps to build a simple user management app (from scratch!) using Supabase and [RedwoodJS](https://redwoodjs.com/docs/introduction). It includes: + +- Supabase [Database](/docs/guides/database): a Postgres database for storing your user data. +- Supabase [Auth](/docs/guides/auth): users can sign in with magic links (no passwords, only email). +- Supabase [Storage](/docs/guides/storage): users can upload a photo. +- Instant [APIs](/docs/guides/api): APIs will be automatically generated when you create your database tables. +- [Row Level Security](/docs/guides/auth#row-level-security): data is protected so that individuals can only access their own data. + +By the end of this guide you'll have an app which allows users to login and update some basic profile details: + +![Supabase User Management example](/docs/img/user-management-demo.png) + + + +Note: For RedwoodJS apps, port will be 8910 + + + +### GitHub + +If you get stuck at any point, take a look at [this repo](https://github.com/redwoodjs/redwoodjs-supabase-quickstart). + +{/* ## Video demo */} + +{/* Coming soon. */} + +{/* Use the annotated timeline to step through this tutorial. */} + +{/* ## Instant deploy */} + +{/* Want to deploy a completed version of this example without following the guide? */} + +{/* [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Freact-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-react-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management) */} + +{/* Clicking this button the application will: */} + +{/* - Launch and prepare the Postgres database in Supabase. */} +{/* - Launch the app in Vercel. */} +{/* - Fork the example into your own GitHub account. */} +{/* - Prepare the deployed application with all the necessary environment variables. */} + +{/* If you want to do it yourself, let's get started:` */} + +## About RedwoodJS + +A Redwood application is split into two parts: a frontend and a backend. This is represented as two node projects within a single monorepo. + +The frontend project is called **`web`** and the backend project is called **`api`**. For clarity, we will refer to these in prose as **"sides"**, i.e. the "web side" and the "api side". +They are separate projects because code on the `web side` will end up running in the user's browser while code on the `api side` will run on a server somewhere. + + + +Important: When this guide refers to "API", that means the Supabase API and when it refers to "api side", that means the RedwoodJS `api side`. + + + +The **`api side`** is an implementation of a GraphQL API. The business logic is organized into "services" that represent their own internal API and can be called both from external GraphQL requests and other internal services. + +The **`web side`** is built with React. Redwood's router makes it simple to map URL paths to React "Page" components (and automatically code-split your app on each route). +Pages may contain a "Layout" component to wrap content. They also contain "Cells" and regular React components. +Cells allow you to declaratively manage the lifecycle of a component that fetches and displays data. + + + +For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. +We **_won't use_** Prisma to connect to the Supabase Postgres database or [Prisma migrations](https://redwoodjs.com/docs/cli-commands#prisma-migrate) as one typically might in a Redwood app. +Instead, we'll rely on the Supabase client to do some of the work on the **`web`** side and use the client again on the **`api`** side to do data fetching as well. + + + +## Project set up + +Before we start building we're going to set up our Database and API. This is as simple as starting a new Project in Supabase +and then creating a "schema" inside the database. + + + +When setting up Supabase, you'll interact with your project dashboard. However, most of the RedwoodJS setup steps will interact with the [Redwood CLI](https://redwoodjs.com/docs/cli-commands) to generate routes, pages, components, and more. +So be sure to have a terminal at the ready and in your project directory. + + + +### Create a project + +1. Go to [app.supabase.com](https://app.supabase.com). +1. Click on "New Project". +1. Enter your project details. +1. Wait for the new database to launch. + +### Set up the database schema + +Now we are going to set up the database schema. We can use the "User Management Starter" quickstart in the SQL Editor, +or you can just copy/paste the SQL from below and run it yourself. + + + + +1. Go to the [SQL Editor](https://app.supabase.com/project/_/sql) page in the Dashboard. +2. Click **User Management Starter**. +3. Click **Run**. + + + + + + +```sql +-- Create a table for public "profiles" +create table profiles ( + id uuid references auth.users not null, + updated_at timestamp with time zone, + username text unique, + avatar_url text, + website text, + + primary key (id), + unique(username), + constraint username_length check (char_length(username) >= 3) +); + +alter table profiles enable row level security; + +create policy "Public profiles are viewable by everyone." + on profiles for select + using ( true ); + +create policy "Users can insert their own profile." + on profiles for insert + with check ( auth.uid() = id ); + +create policy "Users can update own profile." + on profiles for update + using ( auth.uid() = id ); + +-- Set up Realtime! +begin; + drop publication if exists supabase_realtime; + create publication supabase_realtime; +commit; +alter publication supabase_realtime add table profiles; + +-- Set up Storage! +insert into storage.buckets (id, name) +values ('avatars', 'avatars'); + +create policy "Avatar images are publicly accessible." + on storage.objects for select + using ( bucket_id = 'avatars' ); + +create policy "Anyone can upload an avatar." + on storage.objects for insert + with check ( bucket_id = 'avatars' ); + +``` + + + + +#### Important Note about Prisma and Migrations + + + +Because this Quick Start does not use Prisma to manage the database schema, seed it, or run migrations, you **need** to take extra care when running some of the typical Redwood CLI commands. + + + +### Get the API Keys + +Now that you've created some database tables, you are ready to insert data using the auto-generated API. +We just need to get the URL as well as the `anon`, `service_role` and `JWT_SECRET` keys from the API settings. + +1. Go to the [API Settings](https://app.supabase.com/project/_/settings/api) page in the Dashboard. +2. Find your API `URL`, `anon`, and `service_role` keys on this page. + + + +## Building the App + +Let's start building the RedwoodJS app from scratch. + + + +RedwoodJS requires Node.js `>= 14.x <= 16.x` and Yarn `>= 1.15`. + + + +Make sure you have installed yarn since RedwoodJS relies on it to [manage its packages in workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) for its `web` and `api` "sides". + +### Initialize a RedwoodJS app + +We can use [Create Redwood App](https://redwoodjs.com/docs/quick-start) command to initialize +an app called `supabase-redwoodjs`: + +```bash +yarn create redwood-app supabase-redwoodjs +cd supabase-redwoodjs +``` + +While the app is installing, you should see: + +```bash +✔ Creating Redwood app + ✔ Checking node and yarn compatibility + ✔ Creating directory 'supabase-redwoodjs' +✔ Installing packages + ✔ Running 'yarn install'... (This could take a while) +✔ Convert TypeScript files to JavaScript +✔ Generating types + +Thanks for trying out Redwood! +``` + +Then let's install the only additional dependency [supabase-js](https://github.com/supabase/supabase-js) by running the `setup auth` command: + +```bash +yarn redwood setup auth supabase +``` + +When prompted: + +> Overwrite existing /api/src/lib/auth.[jt]s? + +Say, **yes** and it will setup the Supabase client in your app and also provide hooks used with Supabase authentication. + +```bash +✔ Generating auth lib... + ✔ Successfully wrote file `./api/src/lib/auth.js` + ✔ Adding auth config to web... + ✔ Adding auth config to GraphQL API... + ✔ Adding required web packages... + ✔ Installing packages... + ✔ One more thing... + + You will need to add your Supabase URL (SUPABASE_URL), public API KEY, + and JWT SECRET (SUPABASE_KEY, and SUPABASE_JWT_SECRET) to your .env file. +``` + +Next, we want to save the environment variables in a `.env`. +We need the `API URL` as well as the `anon` and `jwt_secret` keys that you copied [earlier](#get-the-api-keys). + +```bash title=.env +SUPABASE_URL=YOUR_SUPABASE_URL +SUPABASE_KEY=YOUR_SUPABASE_ANON_KEY +SUPABASE_JWT_SECRET=YOUR_SUPABASE_JWT_SECRET +``` + +And finally, you will also need to save **just** the `web side` environment variables to the `redwood.toml`. + +```bash title=redwood.toml +[web] + title = "Supabase Redwood Quickstart" + port = 8910 + apiProxyPath = "/.redwood/functions" + includeEnvironmentVariables = ["SUPABASE_URL", "SUPABASE_KEY"] +[api] + port = 8911 +[browser] + open = true +``` + +These variables will be exposed on the browser, and that's completely fine. +They allow your web app to initialize the Supabase client with your public anon key +since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +You'll see these being used to configure your Supabase client in `web/src/App.js`: + +```js title=web/src/App.js +// ... Redwood imports +import { AuthProvider } from '@redwoodjs/auth' +import { createClient } from '@supabase/supabase-js' + +// ... + +const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY) + +const App = () => ( + + + + + + + + + +) + +export default App +``` + +And one optional step is to update the CSS file `web/src/index.css` to make the app look nice. +You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/react-user-management/src/index.css). + +### Start RedwoodJS and your first Page + +Let's test our setup at the moment by starting up the app: + +```bash +yarn rw dev +``` + + + +Note: You can also use the alias `rw` for `redwood`, as in `yarn rw` to run Redwood CLI commands + + + +You should see a "Welcome to RedwoodJS" page and a message about not having any pages yet. + +So, let's create a "home" page: + +```bash +yarn rw generate page home / + +✔ Generating page files... + ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.stories.js` + ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.test.js` + ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.js` +✔ Updating routes file... +✔ Generating types ... +``` + + + +Note: the slash `/` is important here as it creates a root level route. + + + +You can stop the `dev` server if you want; to see your changes, just be sure to run `yarn rw dev` again. + +You should see the `Home` page route in `web/src/Routes.js`: + +```bash title=web/src/Routes.js +import { Router, Route } from '@redwoodjs/router' + +const Routes = () => { + return ( + + + + + ) } +export default Routes +``` + +### Set up a Login component + +Let's set up a Redwood component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```bash +yarn rw g component auth + + ✔ Generating component files... + ✔ Successfully wrote file `./web/src/components/Auth/Auth.test.js` + ✔ Successfully wrote file `./web/src/components/Auth/Auth.stories.js` + ✔ Successfully wrote file `./web/src/components/Auth/Auth.js` + +``` + +Now, update the `Auth.js` component to contain: + +```jsx title=/web/src/components/Auth/Auth.js +import { useState } from 'react' +import { useAuth } from '@redwoodjs/auth' + +const Auth = () => { + const { logIn } = useAuth() + const [loading, setLoading] = useState(false) + const [email, setEmail] = useState('') + + const handleLogin = async (email) => { + try { + setLoading(true) + const { error } = await logIn({ email }) + if (error) throw error + alert('Check your email for the login link!') + } catch (error) { + alert(error.error_description || error.message) + } finally { + setLoading(false) + } + } + + return ( +
+
+

Supabase + RedwoodJS

+

Sign in via magic link with your email below

+
+ setEmail(e.target.value)} + /> +
+
+ +
+
+
+ ) +} + +export default Auth +``` + +### Set up an Account component + +After a user is signed in we can allow them to edit their profile details and manage their account. + +Let's create a new component for that called `Account.js`. + +```bash +yarn rw g component account + + ✔ Generating component files... + ✔ Successfully wrote file `./web/src/components/Account/Account.test.js` + ✔ Successfully wrote file `./web/src/components/Account/Account.stories.js` + ✔ Successfully wrote file `./web/src/components/Account/Account.js` +``` + +And then update the file to contain: + +```jsx title=web/src/components/Account/Account.js +import { useState, useEffect } from 'react' +import { useAuth } from '@redwoodjs/auth' + +const Account = () => { + const { client: supabase, currentUser, logOut } = useAuth() + const [loading, setLoading] = useState(true) + const [username, setUsername] = useState(null) + const [website, setWebsite] = useState(null) + const [avatar_url, setAvatarUrl] = useState(null) + + useEffect(() => { + getProfile() + }, [supabase.auth.session]) + + async function getProfile() { + try { + setLoading(true) + const user = supabase.auth.user() + + let { data, error, status } = await supabase + .from('profiles') + .select(`username, website, avatar_url`) + .eq('id', user.id) + .single() + + if (error && status !== 406) { + throw error + } + + if (data) { + setUsername(data.username) + setWebsite(data.website) + setAvatarUrl(data.avatar_url) + } + } catch (error) { + alert(error.message) + } finally { + setLoading(false) + } + } + + async function updateProfile({ username, website, avatar_url }) { + try { + setLoading(true) + const user = supabase.auth.user() + + const updates = { + id: user.id, + username, + website, + avatar_url, + updated_at: new Date(), + } + + let { error } = await supabase.from('profiles').upsert(updates, { + returning: 'minimal', // Don't return the value after inserting + }) + + if (error) { + throw error + } + + alert('Updated profile!') + } catch (error) { + alert(error.message) + } finally { + setLoading(false) + } + } + + return ( +
+
+

Supabase + RedwoodJS

+

Your profile

+
+
+ + +
+
+ + setUsername(e.target.value)} + /> +
+
+ + setWebsite(e.target.value)} + /> +
+ +
+ +
+ +
+ +
+
+
+
+ ) +} + +export default Account +``` + + + +Note: You'll see the use of `useAuth()` several times in the quickstart. Redwood's `useAuth` hook provides convenient ways to access +logIn, logOut, currentUser, and access the `supabase` authenticate client. We'll use it to get an instance +of the supabase client to interact with your API. + + + +### Update Home Page + +Now that we have all the components in place, let's update your `HomePage` page to use them: + +```jsx title=web/src/pages/HomePage/HomePage.js +import { useAuth } from '@redwoodjs/auth' +import { MetaTags } from '@redwoodjs/web' + +import Account from 'src/components/Account' +import Auth from 'src/components/Auth' + +const HomePage = () => { + const { isAuthenticated } = useAuth() + + return ( + <> + + {!isAuthenticated ? : } + + ) +} + +export default HomePage +``` + +> What we're doing here is showing the sign in form if you aren't logged in and your account profile if you are. + +### Launch! + +Once that's done, run this in a terminal window to launch the `dev` server: + +```bash +yarn rw dev +``` + +And then open the browser to [localhost:8910](http://localhost:8910) and you should see the completed app. + +![Supabase RedwoodJS](/docs/img/supabase-redwoodjs-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```bash +yarn rw g component avatar + ✔ Generating component files... + ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.test.js` + ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.stories.js` + ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.js` +``` + +Now, update your Avatar component to contain the following widget: + +```jsx title=web/src/components/Avatar/Avatar.js +import { useEffect, useState } from 'react' +import { useAuth } from '@redwoodjs/auth' + +const Avatar = ({ url, size, onUpload }) => { + const { client: supabase } = useAuth() + + const [avatarUrl, setAvatarUrl] = useState(null) + const [uploading, setUploading] = useState(false) + + useEffect(() => { + if (url) downloadImage(url) + }, [url]) + + async function downloadImage(path) { + try { + const { data, error } = await supabase.storage.from('avatars').download(path) + if (error) { + throw error + } + const url = URL.createObjectURL(data) + setAvatarUrl(url) + } catch (error) { + console.log('Error downloading image: ', error.message) + } + } + + async function uploadAvatar(event) { + try { + setUploading(true) + + if (!event.target.files || event.target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = event.target.files[0] + const fileExt = file.name.split('.').pop() + const fileName = `${Math.random()}.${fileExt}` + const filePath = `${fileName}` + + let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) + + if (uploadError) { + throw uploadError + } + + onUpload(filePath) + } catch (error) { + alert(error.message) + } finally { + setUploading(false) + } + } + + return ( +
+ {avatarUrl ? ( + Avatar + ) : ( +
+ )} +
+ + +
+
+ ) +} + +export default Avatar +``` + +### Add the new widget + +And then we can add the widget to the Account component: + +```jsx title=web/src/components/Account/Account.js +// Import the new component +import Avatar from 'src/components/Avatar' + +// ... + +return ( +
+ {/* Add to the body */} + { + setAvatarUrl(url) + updateProfile({ username, website, avatar_url: url }) + }} + /> + {/* ... */} +
+) +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) +- Learn more about [RedwoodJS](https://redwoodjs.com) +- Visit the [RedwoodJS Discourse Community](https://community.redwoodjs.com) + +export const Page = ({ children }) => + export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-solidjs.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-solidjs.mdx index f03f73a8e93..f5a65665f3f 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-solidjs.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-solidjs.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-solidjs.mdx' export const meta = { id: 'with-solidjs', @@ -8,11 +7,421 @@ export const meta = { sidebar_label: 'SolidJS', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/solid-user-management). + + + +## Building the App + +Let's start building the SolidJS app from scratch. + +### Initialize a SolidJS app + +We can use [Degit](https://github.com/Rich-Harris/degit) to initialize an app called `supabase-solid`: + +```bash +npx degit solidjs/templates/ts supabase-solid +cd supabase-solid +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +VITE_SUPABASE_URL=YOUR_SUPABASE_URL +VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY +``` + +Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed +on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```js title=src/supabaseClient.jsx +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey) +``` + +And one optional step is to update the CSS file `src/index.css` to make the app look nice. +You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/solid-user-management/src/index.css). + +### Set up a Login component + +Let's set up a SolidJS component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```jsx title=src/Auth.tsx +import { createSignal } from 'solid-js' +import { supabase } from './supabaseClient' + +export default function Auth() { + const [loading, setLoading] = createSignal(false) + const [email, setEmail] = createSignal('') + + const handleLogin = async (e: SubmitEvent) => { + e.preventDefault() + + try { + setLoading(true) + const { error } = await supabase.auth.signInWithOtp({ email: email() }) + if (error) throw error + alert('Check your email for the login link!') + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + setLoading(false) + } } - return + + return ( +
+
+

Supabase + SolidJS

+

Sign in via magic link with your email below

+
+
+ + setEmail(e.currentTarget.value)} + /> +
+
+ +
+
+
+
+ ) +} +``` + +### Account page + +After a user is signed in we can allow them to edit their profile details and manage their account. + +Let's create a new component for that called `Account.tsx`. + +```jsx title=src/Account.tsx +import { AuthSession } from '@supabase/supabase-js' +import { Component, createEffect, createSignal } from 'solid-js' +import { supabase } from './supabaseClient' + +interface Props { + session: AuthSession; } +const Account: Component = ({ session }) => { + const [loading, setLoading] = createSignal(true) + const [username, setUsername] = (createSignal < string) | (null > null) + const [website, setWebsite] = (createSignal < string) | (null > null) + const [avatarUrl, setAvatarUrl] = (createSignal < string) | (null > null) + + createEffect(() => { + getProfile() + }) + + const getProfile = async () => { + try { + setLoading(true) + const { user } = session + + let { data, error, status } = await supabase + .from('profiles') + .select(`username, website, avatar_url`) + .eq('id', user.id) + .single() + + if (error && status !== 406) { + throw error + } + + if (data) { + setUsername(data.username) + setWebsite(data.website) + setAvatarUrl(data.avatar_url) + } + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + setLoading(false) + } + } + + const updateProfile = async (e: Event) => { + e.preventDefault() + + try { + setLoading(true) + const { user } = session + + const updates = { + id: user.id, + username: username(), + website: website(), + avatar_url: avatarUrl(), + updated_at: new Date().toISOString(), + } + + let { error } = await supabase.from('profiles').upsert(updates) + + if (error) { + throw error + } + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + setLoading(false) + } + } + + return ( +
+
+
Email: {session.user.email}
+
+ + setUsername(e.currentTarget.value)} + /> +
+
+ + setWebsite(e.currentTarget.value)} + /> +
+
+ +
+ +
+
+ ) +} + +export default Account +``` + +### Launch! + +Now that we have all the components in place, let's update `App.tsx`: + +```jsx title=src/App.tsx +import { Component, createEffect, createSignal } from 'solid-js' +import { supabase } from './supabaseClient' +import { AuthSession } from '@supabase/supabase-js' +import Account from './Account' +import Auth from './Auth' + +const App: Component = () => { + const [session, setSession] = createSignal(null) + + createEffect(() => { + supabase.auth.getSession().then(({ data: { session } }) => { + setSession(session) + }) + + supabase.auth.onAuthStateChange((_event, session) => { + setSession(session) + }) + }) + + return ( +
+ {!session() ? : } +
+ ) +} + +export default App +``` + +Once that's done, run this in a terminal window: + +```bash +npm start +``` + +And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. + +![Supabase SolidJS](/docs/img/supabase-solidjs-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```jsx title=src/Avatar.tsx +import { Component, createEffect, createSignal, JSX } from 'solid-js' +import { supabase } from './supabaseClient' + +interface Props { + size: number + url: string | null + onUpload: (event: Event, filePath: string) => void +} + +const Avatar: Component = (props) => { + const [avatarUrl, setAvatarUrl] = createSignal(null) + const [uploading, setUploading] = createSignal(false) + + createEffect(() => { + if (props.url) downloadImage(props.url) + }) + + const downloadImage = async (path: string) => { + try { + const { data, error } = await supabase.storage.from('avatars').download(path) + if (error) { + throw error + } + const url = URL.createObjectURL(data) + setAvatarUrl(url) + } catch (error) { + if (error instanceof Error) { + console.log('Error downloading image: ', error.message) + } + } + } + + const uploadAvatar: JSX.EventHandler = async (event) => { + try { + setUploading(true) + + const target = event.currentTarget + if (!target?.files || target.files.length === 0) { + throw new Error('You must select an image to upload.') + } + + const file = target.files[0] + const fileExt = file.name.split('.').pop() + const fileName = `${Math.random()}.${fileExt}` + const filePath = `${fileName}` + + let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) + + if (uploadError) { + throw uploadError + } + + props.onUpload(event, filePath) + } catch (error) { + if (error instanceof Error) { + alert(error.message) + } + } finally { + setUploading(false) + } + } + + return ( +
+ {avatarUrl() ? ( + {avatarUrl() + ) : ( +
+ )} +
+ + + + +
+
+ ) +} + +export default Avatar +``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```jsx title=src/Account.tsx +// Import the new component +import Avatar from './Avatar' + +// ... + +return ( +
+ {/* Add to the body */} + { + setAvatarUrl(url) + updateProfile(e) + }} + /> + {/* ... */} +
+) +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => + export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-svelte.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-svelte.mdx index 349e7af543a..69cdea17b87 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-svelte.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-svelte.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-svelte.mdx' export const meta = { id: 'with-svelte', @@ -8,11 +7,374 @@ export const meta = { sidebar_label: 'Svelte', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/svelte-user-management). + + + +## Building the App + +Let's start building the Svelte app from scratch. + +### Initialize a Svelte app + +We can use the Vite Svelte TypeScript Template to initialize an app called `supabase-svelte`: + +```bash +npm create vite@latest supabase-svelte -- --template svelte-ts +cd supabase-svelte +npm install +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +VITE_SUPABASE_URL=YOUR_SUPABASE_URL +VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY +``` + +Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed +on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```js title=src/supabaseClient.ts +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey) +``` + +And one optional step is to update the CSS file `src/app.css` to make the app look nice. +You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). + +### Set up a Login component + +Let's set up a Svelte component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```html title=src/lib/Auth.svelte + + +
+
+

Supabase + Svelte

+

Sign in via magic link with your email below

+ +
+ + +
+
+ +
+ +
+
+``` + +### Account page + +After a user is signed in we can allow them to edit their profile details and manage their account. +Let's create a new component for that called `Account.svelte`. + +```html title=src/lib/Account.svelte + + +
+
Email: {session.user.email}
+
+ + +
+
+ + +
+
+ +
+ +
+``` + +### Launch! + +Now that we have all the components in place, let's update `App.svelte`: + +```html title=src/App.svelte + + +
+ {#if !session} + + {:else} + + {/if} +
+``` + +Once that's done, run this in a terminal window: + +```bash +npm run dev +``` + +And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. + +> ⚠️ WARNING: Svelte uses Vite and the default port is `5173`, Supabase uses `port 3000`. To change the redirection port for supabase go to: `Authentication > Settings` and change the `Site Url` to `localhost:5173` + +![Supabase Svelte](/docs/img/supabase-svelte-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```html title=src/lib/Avatar.svelte + + +
+ {#if avatarUrl} {avatarUrl {:else} +
+ {/if} +
+ + + + +
+
+``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```html title=src/lib/Account.svelte + + +
+ + + + + +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx index 1ead93e6cb5..d8af92de291 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-sveltekit.mdx' export const meta = { id: 'with-sveltekit', @@ -8,11 +7,440 @@ export const meta = { sidebar_label: 'SvelteKit', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/sveltekit-user-management). + + + +## Building the App + +Let's start building the Svelte app from scratch. + +### Initialize a Svelte app + +We can use the [SvelteKit Skeleton Project](https://kit.svelte.dev/docs) to initialize +an app called `supabase-sveltekit` (for this tutorial you do not need TypeScript, ESLint, Prettier, or Playwright): + +```bash +npm init svelte@next supabase-sveltekit +cd supabase-sveltekit +npm install +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the `SUPABASE_URL` and the `SUPABASE_KEY` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +PUBLIC_SUPABASE_URL="YOUR_SUPABASE_URL" +PUBLIC_SUPABASE_ANON_KEY="YOUR_SUPABASE_KEY" +``` + +Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed +on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```js title=src/lib/supabaseClient.ts +import { createClient } from '@supabase/auth-helpers-sveltekit' +import { env } from '$env/dynamic/public' + +export const supabase = createClient(env.PUBLIC_SUPABASE_URL, env.PUBLIC_SUPABASE_ANON_KEY) +``` + +And one optional step is to update the CSS file `public/global.css` to make the app look nice. +You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). + +### Supabase Auth Helpers + +SvelteKit is a highly versatile framework offering pre-rendering at build time (SSG), server-side rendering at request time (SSR), API routes, and more. + +It can be challenging to authenticate your users in all these different environments, that's why we've created the Supabase Auth Helpers to make user management and data fetching within SvelteKit as easy as possible. + +Install the auth helpers for SvelteKit: + +```bash +npm install @supabase/auth-helpers-sveltekit +``` + +Update your `src/routes/+layout.svelte`: + +```html title=src/routes/+layout.svelte + + +
+ +
+``` + +Create a new `src/routes/+layout.ts` file to handle the session on the client-side. + +```ts title=src/routes/+layout.ts +import type { LayoutLoad } from './$types' +import { getSupabase } from '@supabase/auth-helpers-sveltekit' + +export const load: LayoutLoad = async (event) => { + const { session } = await getSupabase(event) + return { session } } +``` + +Create a new `src/routes/+layout.server.ts` file to handle the session on the server-side. + +```ts title=src/routes/+layout.server.ts +import type { LayoutServerLoad } from './$types' +import { getServerSession } from '@supabase/auth-helpers-sveltekit' + +export const load: LayoutServerLoad = async (event) => { + return { + session: await getServerSession(event), + } +} +``` + +Be sure to create `src/hooks.client.ts` and `src/hooks.server.ts` in order to get the auth helper started on the client and server-side. + +```ts title=src/hooks.client.ts +import '$lib/supabaseClient' +``` + +```ts title=src/hooks.server.ts +import '$lib/supabaseClient' +``` + +### Set up a Login component + +Let's set up a Svelte component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```html title=src/routes/Auth.svelte + + +
+
+

Supabase + SvelteKit

+

Sign in via magic link with your email below

+
+ +
+
+ +
+
+
+``` + +### Account component + +After a user is signed in, they need to be able to edit their profile details and manage their account. +Create a new `Account.svelte` component to handle this functionality. + +```html title=src/routes/Account.svelte + + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +
+ +
+
+``` + +### Launch! + +Now that we have all the components in place, let's update `src/routes/+page.svelte`: + +```html title=src/routes/+page.svelte + + + + Supabase + SvelteKit + + + +{#if !$page.data.session} + +{:else} + +{/if} +``` + +Once that's done, run this in a terminal window: + +```bash +npm run dev +``` + +And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. + +![Supabase Svelte](/docs/img/supabase-svelte-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```html title=src/routes/Avatar.svelte + + +
+ {#if avatarUrl} {avatarUrl {:else} +
+ {/if} + +
+ + +
+
+``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```html title=src/routes/Account.svelte + + +
+ + + + + +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-vue-3.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-vue-3.mdx index 781137f6ed3..a1ec84a8c92 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-vue-3.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-vue-3.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/with-vue-3.mdx' export const meta = { id: 'with-vue-3', @@ -8,11 +7,385 @@ export const meta = { sidebar_label: 'Vue 3', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() + + +![Supabase User Management example](/docs/img/user-management-demo.png) + +### GitHub + +Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/vue3-user-management). + + + +## Building the App + +Let's start building the Vue 3 app from scratch. + +### Initialize a Vue 3 app + +We can quickly use [Vite with Vue 3 Template](https://vitejs.dev/guide/#scaffolding-your-first-vite-project) to initialize +an app called `supabase-vue-3`: + +```bash +# npm 6.x +npm create vite@latest supabase-vue-3 --template vue + +# npm 7+, extra double-dash is needed: +npm create vite@latest supabase-vue-3 -- --template vue + +cd supabase-vue-3 +``` + +Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) + +```bash +npm install @supabase/supabase-js +``` + +And finally we want to save the environment variables in a `.env`. +All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). + +```bash title=.env +VITE_SUPABASE_URL=YOUR_SUPABASE_URL +VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY +``` + +Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed +on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. + +```js title=src/supabase.js +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey) +``` + +Optionally, update [src/style.css](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/vue3-user-management/src/style.css) to style the app. + +### Set up a Login component + +Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. + +```html title=/src/components/Auth.vue + + + +``` + +### Account page + +After a user is signed in we can allow them to edit their profile details and manage their account. +Let's create a new component for that called `Account.vue`. + +```html title=src/components/Account.vue + + + +``` + +### Launch! + +Now that we have all the components in place, let's update `App.vue`: + +```html title=src/App.vue + + + +``` + +Once that's done, run this in a terminal window: + +```bash +npm run dev +``` + +And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. + +![Supabase Vue 3](/docs/img/supabase-vue-3-demo.png) + +## Bonus: Profile photos + +Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. + +### Create an upload widget + +Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: + +```html title=src/components/Avatar.vue + + + +``` + +### Add the new widget + +And then we can add the widget to the Account page: + +```html title=src/components/Account.vue + + + +``` + +## Next steps + +At this stage you have a fully functional application! + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/hosting/docker.mdx b/apps/docs/pages/guides/hosting/docker.mdx deleted file mode 100644 index db9bcdf0563..00000000000 --- a/apps/docs/pages/guides/hosting/docker.mdx +++ /dev/null @@ -1,120 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'docker', - title: 'Self-hosting with Docker', - description: 'How to configure and deploy Supabase.', - sidebar_label: 'Docker', -} - -Docker is the easiest way to get started with self-hosted Supabase. - -## Before you begin - -You need the following installed in your system: - -- [Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/) -- [Git](https://git-scm.com/downloads) - -## Quick Start - -### Get the code - -Checkout the docker directory in the Supabase repo: - -```sh -# Get the code -git clone --depth 1 https://github.com/supabase/supabase - -# Go to the docker folder -cd supabase/docker - -# Copy the fake env vars -cp .env.example .env - -# Start -docker-compose up -``` - -Now visit [http://localhost:3000](http://localhost:3000) to start using Supabase Studio. - -## Securing your setup - -While we provided you with some example secrets for getting started, you should NEVER deploy your Supabase setup using the defaults we have provided. - -Please follow these steps to secure your Docker setup. We [strongly recommend](../../guides/hosting/overview#managing-your-secrets) using a secrets manager when deploying to production. - -### Generate API Keys - -Use your `JWT_SECRET` to generate a `anon` and `service` API keys using the [JWT generator](../../guides/hosting/overview#api-keys). - -Replace the values in these files: - -- `.env`: - - `ANON_KEY` - replace with an `anon` key - - `SERVICE_ROLE_KEY` - replace with a `service` key -- `volumes/api/kong.yml` - - `anon` - replace with an `anon` key - - `service_role` - replace with a `service` key - -### Update Secrets - -Update the `.env` file with your own secrets. In particular, these are required: - -- `POSTGRES_PASSWORD`: the password for the `postgres` role. -- `JWT_SECRET`: used by PostgREST and GoTrue, among others. -- `SITE_URL`: the base URL of your site. -- `SMTP_*`: mail server credentials. You can use any SMTP server. - -### Securing the Dashboard - -The Docker setup doesn't include a management database for managing users and logins. If you plan to deploy the Studio to the web we suggest you put it behind a web proxy with Basic Auth or hide it behind a VPN. - -## Configuration - -Each system can be [configured](../../guides/hosting/overview#configuration) to suit your particular use-case. - -To keep the setup simple, we made some choices that may not be optimal for production: - -- the database is in the same machine as the servers -- Storage uses the filesystem backend instead of S3 -- Auth should be configured with a production-ready SMTP server - -### Using an external database - -We strongly [recommend](../../guides/hosting/overview#managing-your-database) that you decouple your database from `docker-compose` before deploying. -The middleware will run with any PostgreSQL database that has logical replication enabled. The following environment variables should be updated -in the `.env` file to point to your external database: - -```env title=.env -POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password - -POSTGRES_HOST=db -POSTGRES_DB=postgres -POSTGRES_USER=postgres -POSTGRES_PORT=5432 -``` - -Once you have done this, you can safely comment out the `db` section of the `docker-compose` file, and remove any instances where the services `depends_on` the `db` image. - -### Setting database's `log_min_messages` - -By default, `docker-compose` sets the database's `log_min_messages` configuration to `fatal` to prevent redundant logs generated by Realtime. -However, you might miss important log messages such as database errors. Configure `log_min_messages` based on your needs. - -## Deploying - -See the following guides to deploy Docker Compose setup using your preferred tool and platform: - -- [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/) -- [AWS Fargate](https://aws.amazon.com/blogs/containers/deploy-applications-on-amazon-ecs-using-docker-compose/) -- [Using Kompose for Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/) - -## Next steps - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/hosting/overview.mdx b/apps/docs/pages/guides/hosting/overview.mdx deleted file mode 100644 index 51e618c4d31..00000000000 --- a/apps/docs/pages/guides/hosting/overview.mdx +++ /dev/null @@ -1,161 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'overview', - title: 'Self Hosting', - sidebar_label: 'Overview', - description: 'Getting started with Self Hosting.', -} - -There are several ways to use Supabase: - -- [Supabase Cloud](https://app.supabase.com): you don't need to deploy anything. We will manage and scale your infrastructure. -- [Docker](../../guides/hosting/docker): deploy to your own infrastructure. -- Kubernetes: coming soon. - -## Architecture - -Supabase is a combination of open source tools, each specifically chosen for Enterprise-readiness. - -If the tools and communities already exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool. -If the tool doesn't exist, we build and open source it ourselves. - -![Supabase Architecture](/docs/img/supabase-architecture.png) - -- [Kong](https://github.com/Kong/kong) is a cloud-native API gateway. -- [GoTrue](https://github.com/netlify/gotrue) is an SWT based API for managing users and issuing SWT tokens. -- [PostgREST](http://postgrest.org/) is a web server that turns your PostgreSQL database directly into a RESTful API -- [Realtime](https://github.com/supabase/realtime) is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients. -- [Storage](https://github.com/supabase/storage-api) provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions. -- [postgres-meta](https://github.com/supabase/postgres-meta) is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries, etc. -- [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. - -## Configuration - -Each system has a number of configuration options which can be found in the relevant product documentation. - -- [Postgres](https://hub.docker.com/_/postgres/) -- [PostgREST](https://postgrest.org/en/stable/configuration.html) -- [Realtime](https://github.com/supabase/realtime#server) -- [GoTrue](https://github.com/supabase/gotrue) -- [Storage](https://github.com/supabase/storage-api) -- [Kong](https://docs.konghq.com/gateway/latest/install/docker/) - -## Managing your database - -It is recommended that you decouple your database from the middleware so that you can upgrade the middleware without any downtime. -The "middleware" is everything except Postgres, and it should work with any Postgres provider (such as AWS RDS), or your own Postgres cluster. - -### Extensions - -Supabase requires some Postgres extensions to be enabled by default for the API and Auth system to work. You can find the extensions inside the -[schema migration scripts](https://github.com/supabase/postgres/tree/develop/migrations). These are mounted at `/docker-entrypoint-initdb.d` -to run automatically when starting the database container. - -We recommend installing all extensions into an `extensions` schema. This will keep your API clean, -since all tables in the `public` schema are exposed via the API. - -```sql -create schema if not exists extensions; -create extension if not exists "uuid-ossp" with schema extensions; -create extension if not exists pgcrypto with schema extensions; -create extension if not exists pgjwt with schema extensions; -``` - -##### `uuid-ossp` - -For UUID functions, required for PostgreSQL `<13`. - -##### `pgcrypto` and `pgjwt` - -For working with JWT and Auth functions. - -### Roles - -Supabase creates several default roles in your Postgres database. To restore defaults at any time you can run the commands inside the -[schema initialization scripts](https://github.com/supabase/postgres/tree/develop/migrations/db/init-scripts). Remember to change your -[role passwords](./docker#securing-your-setup) before deploying to production environments. - -##### `postgres` - -The default PostgreSQL role. This has admin privileges. - -##### `anon` - -For "anonymous access". This is the role which the API (PostgREST) will use when a user _is not_ logged in. - -##### `authenticator` - -A special role for the API (PostgREST). It has very limited access, and is used to validate a JWT and then -"change into" another role determined by the JWT verification. - -##### `authenticated` - -For "authenticated access". This is the role which the API (PostgREST) will use when a user _is_ logged in. - -##### `service_role` - -For elevated access. This role is used by the API (PostgREST) to bypass Row Level Security. - -##### `supabase_auth_admin` - -Used by the Auth middleware to connect to the database and run migration. Access is scoped to the `auth` schema. - -##### `supabase_storage_admin` - -Used by the Auth middleware to connect to the database and run migration. Access is scoped to the `storage` schema. - -##### `dashboard_user` - -For running commands via the Supabase UI. - -##### `supabase_admin` - -Supabase Administrative role for maintaining your database. - -### Realtime Logs - -Set your database's `log_min_messages` configuration to `fatal` to prevent redundant database logs generated by Realtime. However, you might miss important log messages such as database errors. Configure `log_min_messages` based on your needs. - -## API Keys - -The API Gateway (Kong) uses JWT to authenticate access through to the database. The JWT should correspond to a relevant Postgres Role, -and Supabase is designed to work with 2 roles: an `ANON_KEY` for unauthenticated access and a `SERVICE_KEY` for elevated access. - -Use this tool to generate keys: - - - -## Managing your secrets - -Many components inside Supabase use secure secrets and passwords. These are listed in the self-hosting -[env file](https://github.com/supabase/supabase/blob/master/docker/.env.example), but we strongly recommend using a -secrets manager when deploying to production. Plain text files like dotenv lead to accidental costly leaks. - -Some suggested systems include: - -- [Doppler](https://www.doppler.com/) -- [Key Vault](https://docs.microsoft.com/en-us/azure/key-vault/general/overview) by Azure -- [Secrets Manager](https://aws.amazon.com/secrets-manager/) by AWS -- [Secrets Manager](https://cloud.google.com/secret-manager) by GCP -- [Vault](https://www.hashicorp.com/products/vault) by Hashicorp - -## Migrating and Upgrading - -If you have decoupled your database from the middleware, then you should be able to redeploy the latest middleware at any time as long as it has no breaking changes. -Supabase is evolving fast, and we'll continue to improve the migration strategy as part of our core offering. - -We realize that database migrations are difficult, and this is one of the problems we plan to make easy for developers. - -## Deployment options - -While Supabase officially supports Docker, we have several other deployment strategies managed by the community: - -- [supabase-docker](../../guides/hosting/docker) (Official) -- [supabase-kubernetes](https://github.com/supabase-community/supabase-kubernetes) (Unofficial) -- [supabase-terraform](https://github.com/supabase-community/supabase-terraform) (Unofficial) -- [supabase-traefik](https://github.com/supabase-community/supabase-traefik) (Unofficial) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/migrations/firebase-auth.mdx b/apps/docs/pages/guides/migrations/firebase-auth.mdx deleted file mode 100644 index 6377ac83f13..00000000000 --- a/apps/docs/pages/guides/migrations/firebase-auth.mdx +++ /dev/null @@ -1,93 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'firebase-auth', - title: 'Firebase Auth Migration', - description: 'Migrate Firebase auth users to a Supabase project.', - sidebar_label: 'Firebase Auth', -} - -Supabase provides several [tools](https://github.com/supabase-community/firebase-to-supabase/tree/main/auth) to help migrate auth users from a Firebase project to a Supabase project. There are two parts to the migration process: - -- `firestoreusers2json` ([TypeScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/firestoreusers2json.ts), [JavaScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/firestoreusers2json.js)) exports users from an existing Firebase project to a `.json` file on your local system. -- `import_users` ([TypeScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/import_users.ts), [JavaScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/import_users.js)) imports users from a saved `.json` file into your Supabase project (inserting those users into the `auth.users` table of your `PostgreSQL` database instance). - -## Set up the migration tool [#set-up-migration-tool] - -1. Clone the [firebase-to-supabase](https://github.com/supabase-community/firebase-to-supabase) repository: - -```bash -git clone https://github.com/supabase-community/firebase-to-supabase.git -``` - -1. In the `/auth` directory, create a file named `supabase-service.json` with the following contents: - -```json -{ - "host": "database.server.com", - "password": "secretpassword", - "user": "postgres", - "database": "postgres", - "port": 5432 -} -``` - -1. Go to the [Database settings](https://app.supabase.com/project/_/settings/database) for your project in the Supabase Dashboard. -1. Under **Connection Info**, copy the Host string and replace the entry in your `supabase-service.json` file. -1. Enter the password you used when you created your Supabase project in the `password` entry in the `supabase-service.json` file. - -## Generate a Firebase private key [#generate-firebase-private-key] - -1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. -1. Click the gear icon next to **Project Overview** in the sidebar and select **Project Settings**. -1. Click **Service Accounts** and select **Firebase Admin SDK**. -1. Click **Generate new private key**. -1. Rename the downloaded file to `firebase-service.json`. - -## Save your Firebase password hash parameters [#save-firebase-hash-parameters] - -1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. -1. Select **Authentication** (Build section) in the sidebar. -1. Select **Users** in the top menu. -1. At the top right of the users list, open the menu (3 dots) and click **Password hash parameters**. -1. Copy and save the parameters for `base64_signer_key`, `base64_salt_separator`, `rounds`, and `mem_cost`. - -```bash title=Sample%20password%20hash%20parameters -hash_config { - algorithm: SCRYPT, - base64_signer_key: XXXX/XXX+XXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==, - base64_salt_separator: Aa==, - rounds: 8, - mem_cost: 14, -} -``` - -## Command line options - -### Dump Firestore users to a JSON file [#dump-firestore-users] - -`node firestoreusers2json.js [] []` - -- `filename.json`: (optional) output filename (defaults to `./users.json`) -- `batchSize`: (optional) number of users to fetch in each batch (defaults to 100) - -### Import JSON users file to Supabase Auth (PostgreSQL: auth.users) [#import-json-users-file] - -`node import_users.js []` - -- `path_to_json_file`: full local path and filename of .json input file (of users) -- `batch_size`: (optional) number of users to process in a batch (defaults to 100) - -## Notes - -For more advanced migrations, including the use of a middleware server component for verifying a user's existing Firebase password and updating that password in your Supabase project the first time a user logs in, see the [firebase-to-supabase repo](https://github.com/supabase-community/firebase-to-supabase/tree/main/auth). - -## Resources - -- [Supabase vs Firebase](https://supabase.com/alternatives/supabase-vs-firebase) -- [Firestore Data Migration](/docs/guides/migrations/firestore-data) -- [Firestore Storage Migration](/docs/guides/migrations/firebase-storage) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/migrations/firebase-storage.mdx b/apps/docs/pages/guides/migrations/firebase-storage.mdx deleted file mode 100644 index 1516dd2537b..00000000000 --- a/apps/docs/pages/guides/migrations/firebase-storage.mdx +++ /dev/null @@ -1,72 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'firebase-storage', - title: 'Firebase Storage Migration', - description: 'Migrate Firebase Storage files to Supabase Storage.', - sidebar_label: 'Firebase Storage', -} - -Supabase provides several [tools](https://github.com/supabase-community/firebase-to-supabase/tree/main/storage) to convert storage files from Firebase Storage to Supabase Storage. Conversion is a two-step process: - -1. Files are downloaded from a Firebase storage bucket to a local filesystem. -2. Files are uploaded from the local filesystem to a Supabase storage bucket. - -## Set up the migration tool [#set-up-migration-tool] - -1. Clone the [firebase-to-supabase](https://github.com/supabase-community/firebase-to-supabase) repository: - -```bash -git clone https://github.com/supabase-community/firebase-to-supabase.git -``` - -1. In the `/storage` directory, rename [supabase-keys-sample.js](https://github.com/supabase-community/firebase-to-supabase/blob/main/storage/supabase-keys-sample.js) to `supabase-keys.js`. -1. Go to your Supabase project's [API settings](https://app.supabase.com/project/_/settings/api) in the Dashboard. -1. Copy the **Project URL** and update the `SUPABASE_URL` value in `supabase-keys.js`. -1. Under **Project API keys**, copy the **service_role** key and update the `SUPABASE_KEY` value in `supabase-keys.js`. - -## Generate a Firebase private key [#generate-firebase-private-key] - -1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. -1. Click the gear icon next to **Project Overview** in the sidebar and select **Project Settings**. -1. Click **Service Accounts** and select **Firebase Admin SDK**. -1. Click **Generate new private key**. -1. Rename the downloaded file to `firebase-service.json`. - -## Command line options - -### Download Firestore Storage bucket to a local filesystem folder [#download-firestore-storage-bucket] - -`node download.js [] [] [] []` - -- ``: The prefix of the files to download. To process the root bucket, use an empty prefix: "". -- ``: (optional) Name of subfolder for downloaded files. The selected folder is created as a subfolder of the current folder (e.g., `./downloads/`). The default is `downloads`. -- ``: (optional) The default is 100. -- ``: (optional) Stop after processing this many files. For no limit, use `0`. -- ``: (optional) Begin processing at this pageToken. - -To process in batches using multiple command-line executions, you must use the same parameters with a new `` on subsequent calls. Use the token displayed on the last call to continue the process at a given point. - -### Upload files to Supabase Storage bucket [#upload-to-supabase-storage-bucket] - -`node upload.js ` - -- ``: The prefix of the files to download. To process all files, use an empty prefix: "". -- ``: Name of subfolder of files to upload. The selected folder is read as a subfolder of the current folder (e.g., `./downloads/`). The default is `downloads`. -- ``: Name of the bucket to upload to. - - - -If the bucket doesn't exist, it's created as a `non-public` bucket. You must set permissions on this new bucket in the [Supabase Dashboard](https://app.supabase.com/project/_/storage/buckets) before users can download any files. - - - -## Resources - -- [Supabase vs Firebase](https://supabase.com/alternatives/supabase-vs-firebase) -- [Firestore Data Migration](/docs/guides/migrations/firestore-data) -- [Firebase Auth Migration](/docs/guides/migrations/firebase-auth) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/migrations/heroku.mdx b/apps/docs/pages/guides/migrations/heroku.mdx deleted file mode 100644 index 51ab83dfb49..00000000000 --- a/apps/docs/pages/guides/migrations/heroku.mdx +++ /dev/null @@ -1,71 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'heroku', - title: 'Migrate from Heroku to Supabase', - description: 'Migrate your Heroku Postgres database to Supabase.', - sidebar_label: 'Heroku', -} - -Supabase is one of the best [free alternatives to Heroku Postgres](https://supabase.com/alternatives/supabase-vs-heroku-postgres). This guide shows how to migrate your Heroku Postgres database to Supabase. This migration requires the [pg_dump](https://www.postgresql.org/docs/current/app-pgdump.html) and [psql](https://www.postgresql.org/docs/current/app-psql.html) CLI tools, which are installed automatically as part of the complete PostgreSQL installation package. - -Alternatively, use the [Heroku to Supabase migration tool](https://migrate.supabase.com/) to migrate in just a few clicks. - -## Quick demo - -
- -
- -## Retrieve your Heroku database credentials [#retrieve-heroku-credentials] - -1. Log in to your [Heroku account](https://heroku.com) and select the project you want to migrate. -1. Click **Resources** in the menu and select your **Heroku Postgres** database. -1. Click **Settings** in the menu. -1. Click **View Credentials** and save the following information: - - Host (`$HEROKU_HOST`) - - Database (`$HEROKU_DATABASE`) - - User (`$HEROKU_USER`) - - Password (`$HEROKU_PASSWORD`) - -## Retrieve your Supabase Host [#retrieve-supabase-host] - -1. If you're new to Supabase, [create a project](https://app.supabase.com). -1. Go to the [Database settings](https://app.supabase.com/project/_/settings/database) for your project in the Supabase Dashboard. -1. Under **Connection Info**, note your Host (`$SUPABASE_HOST`). - -## Export your Heroku database to a file [#export-heroku-database] - -Use `pg_dump` with your Heroku credentials to export your Heroku database to a file (e.g., `heroku_dump.sql`). - -```bash -pg_dump --clean --if-exists --quote-all-identifiers \ - -h $HEROKU_HOST -U $HEROKU_USER -d $HEROKU_DATABASE \ - --no-owner --no-privileges > heroku_dump.sql -``` - -## Import the database to your Supabase project [#import-database-to-supabase] - -Use `psql` to import the Heroku database file to your Supabase project. - -```bash -psql -h $SUPABASE_HOST -U postgres -f heroku_dump.sql -``` - -## Additional options - -- To only migrate a single database schema, add the `--schema=PATTERN` parameter to your `pg_dump` command. -- To exclude a schema: `--exclude-schema=PATTERN`. -- To only migrate a single table: `--table=PATTERN`. -- To exclude a table: `--exclude-table=PATTERN`. - -Run `pg_dump --help` for a full list of options. - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/resources.mdx b/apps/docs/pages/guides/resources.mdx index 7f4d00e107e..10d63ca5b5b 100644 --- a/apps/docs/pages/guides/resources.mdx +++ b/apps/docs/pages/guides/resources.mdx @@ -115,7 +115,7 @@ export const migrationGuides = [ description: 'Move your auth users from a Firebase project to a Supabase project.', }, { - title: 'Firebase Data', + title: 'Firestore Data', icon: '/docs/img/icons/firebase-icon', href: '/guides/migrations/firestore-data', description: 'Migrate the contents of a Firestore collection to a single PostgreSQL table.', diff --git a/apps/docs/pages/guides/resources/examples.mdx b/apps/docs/pages/guides/resources/examples.mdx deleted file mode 100644 index 7faddafc507..00000000000 --- a/apps/docs/pages/guides/resources/examples.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/examples.mdx' - -export const meta = { - id: 'examples', - title: 'Examples and Resources', - description: 'Examples you can use to get started with Supabase', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/resources/migrating-to-supabase.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase.mdx deleted file mode 100644 index 8f96cc42434..00000000000 --- a/apps/docs/pages/guides/resources/migrating-to-supabase.mdx +++ /dev/null @@ -1,13 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/hosting/overview.mdx' - -export const meta = { - title: 'Migrating to Supabase', - description: 'Learn all about migrating to Supabase from other backend providers', -} - -Hello world - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-auth.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-auth.mdx index 2e2cd1181ec..6377ac83f13 100644 --- a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-auth.mdx +++ b/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-auth.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/migrations/firebase-auth.mdx' export const meta = { id: 'firebase-auth', @@ -8,11 +7,87 @@ export const meta = { sidebar_label: 'Firebase Auth', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return +Supabase provides several [tools](https://github.com/supabase-community/firebase-to-supabase/tree/main/auth) to help migrate auth users from a Firebase project to a Supabase project. There are two parts to the migration process: + +- `firestoreusers2json` ([TypeScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/firestoreusers2json.ts), [JavaScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/firestoreusers2json.js)) exports users from an existing Firebase project to a `.json` file on your local system. +- `import_users` ([TypeScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/import_users.ts), [JavaScript](https://github.com/supabase-community/firebase-to-supabase/blob/main/auth/import_users.js)) imports users from a saved `.json` file into your Supabase project (inserting those users into the `auth.users` table of your `PostgreSQL` database instance). + +## Set up the migration tool [#set-up-migration-tool] + +1. Clone the [firebase-to-supabase](https://github.com/supabase-community/firebase-to-supabase) repository: + +```bash +git clone https://github.com/supabase-community/firebase-to-supabase.git +``` + +1. In the `/auth` directory, create a file named `supabase-service.json` with the following contents: + +```json +{ + "host": "database.server.com", + "password": "secretpassword", + "user": "postgres", + "database": "postgres", + "port": 5432 } +``` + +1. Go to the [Database settings](https://app.supabase.com/project/_/settings/database) for your project in the Supabase Dashboard. +1. Under **Connection Info**, copy the Host string and replace the entry in your `supabase-service.json` file. +1. Enter the password you used when you created your Supabase project in the `password` entry in the `supabase-service.json` file. + +## Generate a Firebase private key [#generate-firebase-private-key] + +1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. +1. Click the gear icon next to **Project Overview** in the sidebar and select **Project Settings**. +1. Click **Service Accounts** and select **Firebase Admin SDK**. +1. Click **Generate new private key**. +1. Rename the downloaded file to `firebase-service.json`. + +## Save your Firebase password hash parameters [#save-firebase-hash-parameters] + +1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. +1. Select **Authentication** (Build section) in the sidebar. +1. Select **Users** in the top menu. +1. At the top right of the users list, open the menu (3 dots) and click **Password hash parameters**. +1. Copy and save the parameters for `base64_signer_key`, `base64_salt_separator`, `rounds`, and `mem_cost`. + +```bash title=Sample%20password%20hash%20parameters +hash_config { + algorithm: SCRYPT, + base64_signer_key: XXXX/XXX+XXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==, + base64_salt_separator: Aa==, + rounds: 8, + mem_cost: 14, +} +``` + +## Command line options + +### Dump Firestore users to a JSON file [#dump-firestore-users] + +`node firestoreusers2json.js [] []` + +- `filename.json`: (optional) output filename (defaults to `./users.json`) +- `batchSize`: (optional) number of users to fetch in each batch (defaults to 100) + +### Import JSON users file to Supabase Auth (PostgreSQL: auth.users) [#import-json-users-file] + +`node import_users.js []` + +- `path_to_json_file`: full local path and filename of .json input file (of users) +- `batch_size`: (optional) number of users to process in a batch (defaults to 100) + +## Notes + +For more advanced migrations, including the use of a middleware server component for verifying a user's existing Firebase password and updating that password in your Supabase project the first time a user logs in, see the [firebase-to-supabase repo](https://github.com/supabase-community/firebase-to-supabase/tree/main/auth). + +## Resources + +- [Supabase vs Firebase](https://supabase.com/alternatives/supabase-vs-firebase) +- [Firestore Data Migration](/docs/guides/migrations/firestore-data) +- [Firestore Storage Migration](/docs/guides/migrations/firebase-storage) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-data.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-data.mdx deleted file mode 100644 index 15f6b257b0a..00000000000 --- a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-data.mdx +++ /dev/null @@ -1,18 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/migrations/firestore-data.mdx' - -export const meta = { - id: 'firestore-data', - title: 'Firestore Data Migration', - description: 'Migrate your Firebase Firestore database to a Supabase Postgres database.', - sidebar_label: 'Firestore Data', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-storage.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-storage.mdx index b093df61ab9..1516dd2537b 100644 --- a/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-storage.mdx +++ b/apps/docs/pages/guides/resources/migrating-to-supabase/firebase-storage.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/migrations/firebase-storage.mdx' export const meta = { id: 'firebase-storage', @@ -8,11 +7,66 @@ export const meta = { sidebar_label: 'Firebase Storage', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +Supabase provides several [tools](https://github.com/supabase-community/firebase-to-supabase/tree/main/storage) to convert storage files from Firebase Storage to Supabase Storage. Conversion is a two-step process: + +1. Files are downloaded from a Firebase storage bucket to a local filesystem. +2. Files are uploaded from the local filesystem to a Supabase storage bucket. + +## Set up the migration tool [#set-up-migration-tool] + +1. Clone the [firebase-to-supabase](https://github.com/supabase-community/firebase-to-supabase) repository: + +```bash +git clone https://github.com/supabase-community/firebase-to-supabase.git +``` + +1. In the `/storage` directory, rename [supabase-keys-sample.js](https://github.com/supabase-community/firebase-to-supabase/blob/main/storage/supabase-keys-sample.js) to `supabase-keys.js`. +1. Go to your Supabase project's [API settings](https://app.supabase.com/project/_/settings/api) in the Dashboard. +1. Copy the **Project URL** and update the `SUPABASE_URL` value in `supabase-keys.js`. +1. Under **Project API keys**, copy the **service_role** key and update the `SUPABASE_KEY` value in `supabase-keys.js`. + +## Generate a Firebase private key [#generate-firebase-private-key] + +1. Log in to your [Firebase Console](https://console.firebase.google.com/project) and open your project. +1. Click the gear icon next to **Project Overview** in the sidebar and select **Project Settings**. +1. Click **Service Accounts** and select **Firebase Admin SDK**. +1. Click **Generate new private key**. +1. Rename the downloaded file to `firebase-service.json`. + +## Command line options + +### Download Firestore Storage bucket to a local filesystem folder [#download-firestore-storage-bucket] + +`node download.js [] [] [] []` + +- ``: The prefix of the files to download. To process the root bucket, use an empty prefix: "". +- ``: (optional) Name of subfolder for downloaded files. The selected folder is created as a subfolder of the current folder (e.g., `./downloads/`). The default is `downloads`. +- ``: (optional) The default is 100. +- ``: (optional) Stop after processing this many files. For no limit, use `0`. +- ``: (optional) Begin processing at this pageToken. + +To process in batches using multiple command-line executions, you must use the same parameters with a new `` on subsequent calls. Use the token displayed on the last call to continue the process at a given point. + +### Upload files to Supabase Storage bucket [#upload-to-supabase-storage-bucket] + +`node upload.js ` + +- ``: The prefix of the files to download. To process all files, use an empty prefix: "". +- ``: Name of subfolder of files to upload. The selected folder is read as a subfolder of the current folder (e.g., `./downloads/`). The default is `downloads`. +- ``: Name of the bucket to upload to. + + + +If the bucket doesn't exist, it's created as a `non-public` bucket. You must set permissions on this new bucket in the [Supabase Dashboard](https://app.supabase.com/project/_/storage/buckets) before users can download any files. + + + +## Resources + +- [Supabase vs Firebase](https://supabase.com/alternatives/supabase-vs-firebase) +- [Firestore Data Migration](/docs/guides/migrations/firestore-data) +- [Firebase Auth Migration](/docs/guides/migrations/firebase-auth) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/migrations/firestore-data.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase/firestore-data.mdx similarity index 100% rename from apps/docs/pages/guides/migrations/firestore-data.mdx rename to apps/docs/pages/guides/resources/migrating-to-supabase/firestore-data.mdx diff --git a/apps/docs/pages/guides/resources/migrating-to-supabase/heroku.mdx b/apps/docs/pages/guides/resources/migrating-to-supabase/heroku.mdx index 2bf4004f95a..51ab83dfb49 100644 --- a/apps/docs/pages/guides/resources/migrating-to-supabase/heroku.mdx +++ b/apps/docs/pages/guides/resources/migrating-to-supabase/heroku.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/migrations/heroku.mdx' export const meta = { id: 'heroku', @@ -8,11 +7,65 @@ export const meta = { sidebar_label: 'Heroku', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +Supabase is one of the best [free alternatives to Heroku Postgres](https://supabase.com/alternatives/supabase-vs-heroku-postgres). This guide shows how to migrate your Heroku Postgres database to Supabase. This migration requires the [pg_dump](https://www.postgresql.org/docs/current/app-pgdump.html) and [psql](https://www.postgresql.org/docs/current/app-psql.html) CLI tools, which are installed automatically as part of the complete PostgreSQL installation package. + +Alternatively, use the [Heroku to Supabase migration tool](https://migrate.supabase.com/) to migrate in just a few clicks. + +## Quick demo + +
+ +
+ +## Retrieve your Heroku database credentials [#retrieve-heroku-credentials] + +1. Log in to your [Heroku account](https://heroku.com) and select the project you want to migrate. +1. Click **Resources** in the menu and select your **Heroku Postgres** database. +1. Click **Settings** in the menu. +1. Click **View Credentials** and save the following information: + - Host (`$HEROKU_HOST`) + - Database (`$HEROKU_DATABASE`) + - User (`$HEROKU_USER`) + - Password (`$HEROKU_PASSWORD`) + +## Retrieve your Supabase Host [#retrieve-supabase-host] + +1. If you're new to Supabase, [create a project](https://app.supabase.com). +1. Go to the [Database settings](https://app.supabase.com/project/_/settings/database) for your project in the Supabase Dashboard. +1. Under **Connection Info**, note your Host (`$SUPABASE_HOST`). + +## Export your Heroku database to a file [#export-heroku-database] + +Use `pg_dump` with your Heroku credentials to export your Heroku database to a file (e.g., `heroku_dump.sql`). + +```bash +pg_dump --clean --if-exists --quote-all-identifiers \ + -h $HEROKU_HOST -U $HEROKU_USER -d $HEROKU_DATABASE \ + --no-owner --no-privileges > heroku_dump.sql +``` + +## Import the database to your Supabase project [#import-database-to-supabase] + +Use `psql` to import the Heroku database file to your Supabase project. + +```bash +psql -h $SUPABASE_HOST -U postgres -f heroku_dump.sql +``` + +## Additional options + +- To only migrate a single database schema, add the `--schema=PATTERN` parameter to your `pg_dump` command. +- To exclude a schema: `--exclude-schema=PATTERN`. +- To only migrate a single table: `--table=PATTERN`. +- To exclude a table: `--exclude-table=PATTERN`. + +Run `pg_dump --help` for a full list of options. + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/self-hosting.mdx b/apps/docs/pages/guides/resources/self-hosting.mdx index 37e118985ee..51e618c4d31 100644 --- a/apps/docs/pages/guides/resources/self-hosting.mdx +++ b/apps/docs/pages/guides/resources/self-hosting.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/hosting/overview.mdx' export const meta = { id: 'overview', @@ -8,11 +7,155 @@ export const meta = { description: 'Getting started with Self Hosting.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +There are several ways to use Supabase: + +- [Supabase Cloud](https://app.supabase.com): you don't need to deploy anything. We will manage and scale your infrastructure. +- [Docker](../../guides/hosting/docker): deploy to your own infrastructure. +- Kubernetes: coming soon. + +## Architecture + +Supabase is a combination of open source tools, each specifically chosen for Enterprise-readiness. + +If the tools and communities already exist, with an MIT, Apache 2, or equivalent open license, we will use and support that tool. +If the tool doesn't exist, we build and open source it ourselves. + +![Supabase Architecture](/docs/img/supabase-architecture.png) + +- [Kong](https://github.com/Kong/kong) is a cloud-native API gateway. +- [GoTrue](https://github.com/netlify/gotrue) is an SWT based API for managing users and issuing SWT tokens. +- [PostgREST](http://postgrest.org/) is a web server that turns your PostgreSQL database directly into a RESTful API +- [Realtime](https://github.com/supabase/realtime) is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients. +- [Storage](https://github.com/supabase/storage-api) provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions. +- [postgres-meta](https://github.com/supabase/postgres-meta) is a RESTful API for managing your Postgres, allowing you to fetch tables, add roles, and run queries, etc. +- [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. + +## Configuration + +Each system has a number of configuration options which can be found in the relevant product documentation. + +- [Postgres](https://hub.docker.com/_/postgres/) +- [PostgREST](https://postgrest.org/en/stable/configuration.html) +- [Realtime](https://github.com/supabase/realtime#server) +- [GoTrue](https://github.com/supabase/gotrue) +- [Storage](https://github.com/supabase/storage-api) +- [Kong](https://docs.konghq.com/gateway/latest/install/docker/) + +## Managing your database + +It is recommended that you decouple your database from the middleware so that you can upgrade the middleware without any downtime. +The "middleware" is everything except Postgres, and it should work with any Postgres provider (such as AWS RDS), or your own Postgres cluster. + +### Extensions + +Supabase requires some Postgres extensions to be enabled by default for the API and Auth system to work. You can find the extensions inside the +[schema migration scripts](https://github.com/supabase/postgres/tree/develop/migrations). These are mounted at `/docker-entrypoint-initdb.d` +to run automatically when starting the database container. + +We recommend installing all extensions into an `extensions` schema. This will keep your API clean, +since all tables in the `public` schema are exposed via the API. + +```sql +create schema if not exists extensions; +create extension if not exists "uuid-ossp" with schema extensions; +create extension if not exists pgcrypto with schema extensions; +create extension if not exists pgjwt with schema extensions; +``` + +##### `uuid-ossp` + +For UUID functions, required for PostgreSQL `<13`. + +##### `pgcrypto` and `pgjwt` + +For working with JWT and Auth functions. + +### Roles + +Supabase creates several default roles in your Postgres database. To restore defaults at any time you can run the commands inside the +[schema initialization scripts](https://github.com/supabase/postgres/tree/develop/migrations/db/init-scripts). Remember to change your +[role passwords](./docker#securing-your-setup) before deploying to production environments. + +##### `postgres` + +The default PostgreSQL role. This has admin privileges. + +##### `anon` + +For "anonymous access". This is the role which the API (PostgREST) will use when a user _is not_ logged in. + +##### `authenticator` + +A special role for the API (PostgREST). It has very limited access, and is used to validate a JWT and then +"change into" another role determined by the JWT verification. + +##### `authenticated` + +For "authenticated access". This is the role which the API (PostgREST) will use when a user _is_ logged in. + +##### `service_role` + +For elevated access. This role is used by the API (PostgREST) to bypass Row Level Security. + +##### `supabase_auth_admin` + +Used by the Auth middleware to connect to the database and run migration. Access is scoped to the `auth` schema. + +##### `supabase_storage_admin` + +Used by the Auth middleware to connect to the database and run migration. Access is scoped to the `storage` schema. + +##### `dashboard_user` + +For running commands via the Supabase UI. + +##### `supabase_admin` + +Supabase Administrative role for maintaining your database. + +### Realtime Logs + +Set your database's `log_min_messages` configuration to `fatal` to prevent redundant database logs generated by Realtime. However, you might miss important log messages such as database errors. Configure `log_min_messages` based on your needs. + +## API Keys + +The API Gateway (Kong) uses JWT to authenticate access through to the database. The JWT should correspond to a relevant Postgres Role, +and Supabase is designed to work with 2 roles: an `ANON_KEY` for unauthenticated access and a `SERVICE_KEY` for elevated access. + +Use this tool to generate keys: + + + +## Managing your secrets + +Many components inside Supabase use secure secrets and passwords. These are listed in the self-hosting +[env file](https://github.com/supabase/supabase/blob/master/docker/.env.example), but we strongly recommend using a +secrets manager when deploying to production. Plain text files like dotenv lead to accidental costly leaks. + +Some suggested systems include: + +- [Doppler](https://www.doppler.com/) +- [Key Vault](https://docs.microsoft.com/en-us/azure/key-vault/general/overview) by Azure +- [Secrets Manager](https://aws.amazon.com/secrets-manager/) by AWS +- [Secrets Manager](https://cloud.google.com/secret-manager) by GCP +- [Vault](https://www.hashicorp.com/products/vault) by Hashicorp + +## Migrating and Upgrading + +If you have decoupled your database from the middleware, then you should be able to redeploy the latest middleware at any time as long as it has no breaking changes. +Supabase is evolving fast, and we'll continue to improve the migration strategy as part of our core offering. + +We realize that database migrations are difficult, and this is one of the problems we plan to make easy for developers. + +## Deployment options + +While Supabase officially supports Docker, we have several other deployment strategies managed by the community: + +- [supabase-docker](../../guides/hosting/docker) (Official) +- [supabase-kubernetes](https://github.com/supabase-community/supabase-kubernetes) (Unofficial) +- [supabase-terraform](https://github.com/supabase-community/supabase-terraform) (Unofficial) +- [supabase-traefik](https://github.com/supabase-community/supabase-traefik) (Unofficial) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/self-hosting/docker.mdx b/apps/docs/pages/guides/resources/self-hosting/docker.mdx index b310833c98b..db9bcdf0563 100644 --- a/apps/docs/pages/guides/resources/self-hosting/docker.mdx +++ b/apps/docs/pages/guides/resources/self-hosting/docker.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/hosting/docker.mdx' export const meta = { id: 'docker', @@ -8,11 +7,114 @@ export const meta = { sidebar_label: 'Docker', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +Docker is the easiest way to get started with self-hosted Supabase. + +## Before you begin + +You need the following installed in your system: + +- [Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/) +- [Git](https://git-scm.com/downloads) + +## Quick Start + +### Get the code + +Checkout the docker directory in the Supabase repo: + +```sh +# Get the code +git clone --depth 1 https://github.com/supabase/supabase + +# Go to the docker folder +cd supabase/docker + +# Copy the fake env vars +cp .env.example .env + +# Start +docker-compose up +``` + +Now visit [http://localhost:3000](http://localhost:3000) to start using Supabase Studio. + +## Securing your setup + +While we provided you with some example secrets for getting started, you should NEVER deploy your Supabase setup using the defaults we have provided. + +Please follow these steps to secure your Docker setup. We [strongly recommend](../../guides/hosting/overview#managing-your-secrets) using a secrets manager when deploying to production. + +### Generate API Keys + +Use your `JWT_SECRET` to generate a `anon` and `service` API keys using the [JWT generator](../../guides/hosting/overview#api-keys). + +Replace the values in these files: + +- `.env`: + - `ANON_KEY` - replace with an `anon` key + - `SERVICE_ROLE_KEY` - replace with a `service` key +- `volumes/api/kong.yml` + - `anon` - replace with an `anon` key + - `service_role` - replace with a `service` key + +### Update Secrets + +Update the `.env` file with your own secrets. In particular, these are required: + +- `POSTGRES_PASSWORD`: the password for the `postgres` role. +- `JWT_SECRET`: used by PostgREST and GoTrue, among others. +- `SITE_URL`: the base URL of your site. +- `SMTP_*`: mail server credentials. You can use any SMTP server. + +### Securing the Dashboard + +The Docker setup doesn't include a management database for managing users and logins. If you plan to deploy the Studio to the web we suggest you put it behind a web proxy with Basic Auth or hide it behind a VPN. + +## Configuration + +Each system can be [configured](../../guides/hosting/overview#configuration) to suit your particular use-case. + +To keep the setup simple, we made some choices that may not be optimal for production: + +- the database is in the same machine as the servers +- Storage uses the filesystem backend instead of S3 +- Auth should be configured with a production-ready SMTP server + +### Using an external database + +We strongly [recommend](../../guides/hosting/overview#managing-your-database) that you decouple your database from `docker-compose` before deploying. +The middleware will run with any PostgreSQL database that has logical replication enabled. The following environment variables should be updated +in the `.env` file to point to your external database: + +```env title=.env +POSTGRES_PASSWORD=your-super-secret-and-long-postgres-password + +POSTGRES_HOST=db +POSTGRES_DB=postgres +POSTGRES_USER=postgres +POSTGRES_PORT=5432 +``` + +Once you have done this, you can safely comment out the `db` section of the `docker-compose` file, and remove any instances where the services `depends_on` the `db` image. + +### Setting database's `log_min_messages` + +By default, `docker-compose` sets the database's `log_min_messages` configuration to `fatal` to prevent redundant logs generated by Realtime. +However, you might miss important log messages such as database errors. Configure `log_min_messages` based on your needs. + +## Deploying + +See the following guides to deploy Docker Compose setup using your preferred tool and platform: + +- [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/) +- [AWS Fargate](https://aws.amazon.com/blogs/containers/deploy-applications-on-amazon-ecs-using-docker-compose/) +- [Using Kompose for Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/translate-compose-kubernetes/) + +## Next steps + +- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). +- Sign in: [app.supabase.com](https://app.supabase.com) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/supabase-cli.mdx b/apps/docs/pages/guides/resources/supabase-cli.mdx index 86feaed2fb1..ef861654950 100644 --- a/apps/docs/pages/guides/resources/supabase-cli.mdx +++ b/apps/docs/pages/guides/resources/supabase-cli.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/cli.mdx' export const meta = { id: 'cli', @@ -10,11 +9,114 @@ export const meta = { toc_max_heading_level: 2, } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +The Supabase CLI provides tools to develop your project locally and deploy to the Supabase Platform. +You can also use the CLI to manage your Supabase projects, handle database migrations and CI/CD workflows, and generate types directly from your database schema. + +## Installation + + + + +Install the CLI as dev dependency via [npm](https://www.npmjs.com/package/supabase): + +```sh +npm install supabase --save-dev +``` + + + + +Install the CLI with [Homebrew](https://brew.sh): + +```sh +brew install supabase/tap/supabase +``` + + + + +Install the CLI with [Scoop](https://scoop.sh): + +```powershell +scoop bucket add supabase https://github.com/supabase/scoop-bucket.git +scoop install supabase +``` + + + + +The CLI is available through [Homebrew](https://brew.sh) and Linux packages. + +#### Homebrew + +```sh +brew install supabase/tap/supabase +``` + +#### Linux packages + +Linux packages are provided in [Releases](https://github.com/supabase/cli/releases). +To install, download the `.apk`/`.deb`/`.rpm` file depending on your package manager +and run one of the following: + +- `sudo apk add --allow-untrusted <...>.apk` +- `sudo dpkg -i <...>.deb` +- `sudo rpm -i <...>.rpm` + + + + +## Updates + +When a new [version](https://github.com/supabase/cli/releases) is released, you can update the CLI using the same methods. + + + + +```sh +npm update supabase --save-dev +``` + + + + +```sh +brew upgrade supabase +``` + + + + +```powershell +scoop update supabase +``` + + + + +```sh +brew upgrade supabase +``` + + + + +## See also + +- [Supabase CLI Reference](/docs/reference/cli/usage) +- [Local Development](/docs/guides/cli/local-development) +- [Managing Environments](/docs/guides/cli/managing-environments) + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx b/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx index 9e7243950f1..4586927a3f4 100644 --- a/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx +++ b/apps/docs/pages/guides/resources/supabase-cli/local-development.mdx @@ -1,5 +1,4 @@ import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/cli/local-development.mdx' export const meta = { id: 'local-development', @@ -7,11 +6,256 @@ export const meta = { description: 'How to use Supabase on your local development machine.', } -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} +Learn how to use the Supabase CLI to develop your project locally and deploy to the Supabase Platform. + +
+ +
+ +## Prerequisites + +Make sure you have these installed on your local machine: + +- [Docker](https://docs.docker.com/engine/install/) +- [Git](https://github.com/git-guides/install-git) +- [Supabase CLI](/docs/guides/cli) + +## Log in to the Supabase CLI + +```bash +supabase login +``` + +## Initialize your project + +Create a new folder for your project and start a new git repository: + +```bash +# create your project folder +mkdir your-project + +# move into the new folder +cd your-project + +# start a new git repository +git init +``` + +## Start Supabase services + +[Initialize](/docs/reference/cli/usage#supabase-init) Supabase to set up the configuration for developing your project locally: + +```bash +supabase init +``` + +Make sure Docker is running. The [start](/docs/reference/cli/usage#supabase-start) command uses Docker to start the Supabase [services](/docs/architecture). +This command may take a while to run if this is the first time using the CLI. + +```bash +supabase start +``` + +Once all of the Supabase services are running, you'll see output containing your local Supabase credentials. +You can use the [stop](/docs/reference/cli/usage#supabase-stop) command at any time to stop all services. + +## Access services + +You can access services directly with any Postgres client or through the API Gateway ([Kong](https://github.com/Kong/kong)). + + + + +```sh +# Default URL: +postgresql://postgres:postgres@localhost:54322/postgres +``` + +The local Postgres instance can be accessed through [`psql`](https://www.postgresql.org/docs/current/app-psql.html) +or any other Postgres client, such as [pgadmin](https://www.pgadmin.org/). + +For example: + +```bash +psql 'postgresql://postgres:postgres@localhost:54322/postgres' +``` + + + +To access the database from an edge function in your local Supabase setup, replace `localhost` with `host.docker.internal`. + + + + + + +```sh +# Default URL: +http://localhost:54321 +``` + +If you are accessing these services without the client libraries, you may need to pass the client keys as an `Authorization` header. +Learn more about [JWT headers](/docs/learn/auth-deep-dive/auth-deep-dive-jwts). + +```sh +curl 'http://localhost:54321/rest/v1/' \ + -H "apikey: " \ + -H "Authorization: Bearer " + +http://localhost:54321/rest/v1/ # REST (PostgREST) +http://localhost:54321/realtime/v1/ # Realtime +http://localhost:54321/storage/v1/ # Storage +http://localhost:54321/auth/v1/ # Auth (GoTrue) +``` + + + +`` is provided when you run the command `supabase start`. + + + + + + +## Database migrations + +Database changes are managed through "migrations." Database migrations are a common way of tracking changes to your database over time. + +
+ +
+ +### Make database changes + +For this guide, create a table called `employees`. In Supabase Studio, navigate to the **SQL Editor** page and run the following SQL command: + +```sql +create table employees ( + id integer primary key generated always as identity, + name text +); +``` + + + +You can execute any SQL using the `DB URL` shown by [`supabase status`](/docs/reference/cli/usage#supabase-status). + + + +Run the [`db diff`](/docs/reference/cli/usage#supabase-db-diff) command to detect changes in the local database: + +```sh +supabase db diff create_employees -f create_employees +``` + +This creates a new migration named `supabase/migrations/_create_employees.sql`, representing any changes made to the local database since [`supabase start`](/docs/reference/cli/usage#supabase-start). + +### Add sample data + +Use the seed script in `supabase/seed.sql` (created with [`supabase init`](/docs/reference/cli/usage#supabase-init)) to add sample data to the table. + +```sql +-- in supabase/seed.sql +insert into public.employees (name) +values + ('Erlich Backman'), + ('Richard Hendricks'), + ('Monica Hall'); +``` + +Rerun the migration and seed scripts: + +```bash +supabase db reset +``` + +You should now see the contents of `employees` in Studio. + +### Reset database changes + +Use the [`reset`](/docs/reference/cli/usage#supabase-db-reset) command to revert any changes to the local database. + +```sql +-- run on local database to make a change +alter table employees + add department text default 'Hooli'; +``` + +Run the following command to reset the local database: + +```sh +supabase db reset +``` + +## Deploy your project + +Go to the [Supabase Dashboard](https://app.supabase.com) and create a project to deploy the changes. + +### Link your project + + + +There are a few commands required to link your project. We are in the process of consolidating these commands into a single command. Bear with us! + + + +Associate your project with your remote project using [`supabase link`](/docs/reference/cli/usage#supabase-link). + +```bash +supabase link --project-ref +# You can get from your project’s dashboard URL: https://app.supabase.com/project/ + +supabase db remote commit +# Capture any changes that you have made to your database before setting up the CLI +``` + +`supabase/migrations` is now populated with a migration in `..._remote_commit.sql`. +This migration captures any changes required for your local database to match the schema of your remote Supabase project. + +### Deploy database changes + +Deploy any local database migrations using [`db push`](/docs/reference/cli/usage#supabase-db-push): + +```sh +supabase db push +``` + +### Deploy Edge Functions + +Deploy any Edge Functions using [`functions deploy`](/docs/reference/cli/usage#supabase-functions-deploy): + +```sh +supabase functions deploy +``` + +## Limitations + +The local development environment is not as feature-complete as the Supabase Platform. Here are some of the differences: + +- The Storage interface is coming soon. +- The Functions interface is coming soon. +- Logs are not supported through the interface (however you can access them through the Docker containers). +- You cannot update your project settings in the Dashboard—this must be done using the CLI. + +``` + +``` + +export const Page = ({ children }) => export default Page diff --git a/apps/docs/pages/guides/resources/supabase-cli/managing-enviroments.mdx b/apps/docs/pages/guides/resources/supabase-cli/managing-enviroments.mdx deleted file mode 100644 index cf3c92956fa..00000000000 --- a/apps/docs/pages/guides/resources/supabase-cli/managing-enviroments.mdx +++ /dev/null @@ -1,17 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' -import oldContent from '~/pages/guides/cli/managing-environments.mdx' - -export const meta = { - id: 'managing-environments', - title: 'Managing Environments', - description: 'How to deploy Supabase schema changes with a CI / CD pipeline.', -} - -export const Page = ({ children }) => { - if (process.env.NEXT_PUBLIC_NEW_DOCS === 'true') { - return oldContent() - } - return -} - -export default Page diff --git a/apps/docs/pages/guides/cli/managing-environments.mdx b/apps/docs/pages/guides/resources/supabase-cli/managing-environments.mdx similarity index 100% rename from apps/docs/pages/guides/cli/managing-environments.mdx rename to apps/docs/pages/guides/resources/supabase-cli/managing-environments.mdx diff --git a/apps/docs/pages/guides/with-angular.mdx b/apps/docs/pages/guides/with-angular.mdx deleted file mode 100644 index b0d5fc21c93..00000000000 --- a/apps/docs/pages/guides/with-angular.mdx +++ /dev/null @@ -1,542 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-angular', - title: 'Quickstart: Angular', - description: 'Learn how to use Supabase in your Angular App.', - sidebar_label: 'Angular', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/angular-user-management). - - - -## Building the App - -Let's start building the Angular app from scratch. - -### Initialize an Angular app - -We can use the [Angular CLI](https://angular.io/cli) to initialize -an app called `supabase-angular`: - -```bash -npx ng new supabase-angular --routing false --style css -cd supabase-angular -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in the `environment.ts` file. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). -These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```ts title=environment.ts -export const environment = { - production: false, - supabaseUrl: 'YOUR_SUPABASE_URL', - supabaseKey: 'YOUR_SUPABASE_KEY', -} -``` - -Now that we have the API credentials in place, let's create a **SupabaseService** with `ng g s supabase` to initialize the Supabase client and implement functions to communicate with the Supabase API. - -```ts title=src/app/supabase.service.ts -import { Injectable } from '@angular/core' -import { - AuthChangeEvent, - AuthSession, - createClient, - Session, - SupabaseClient, - User, -} from '@supabase/supabase-js' -import { environment } from 'src/environments/environment' -import { Database } from 'src/schema' - -export interface Profile { - id?: string - username: string - website: string - avatar_url: string -} - -@Injectable({ - providedIn: 'root', -}) -export class SupabaseService { - private supabase: SupabaseClient - _session: AuthSession | null = null - - constructor() { - this.supabase = createClient(environment.supabaseUrl, environment.supabaseKey) - } - - get session() { - this.supabase.auth.getSession().then(({ data }) => { - this._session = data.session - }) - return this._session - } - - profile(user: User) { - return this.supabase - .from('profiles') - .select(`username, website, avatar_url`) - .eq('id', user.id) - .single() - } - - authChanges(callback: (event: AuthChangeEvent, session: Session | null) => void) { - return this.supabase.auth.onAuthStateChange(callback) - } - - signIn(email: string) { - return this.supabase.auth.signInWithOtp({ email }) - } - - signOut() { - return this.supabase.auth.signOut() - } - - updateProfile(profile: Profile) { - const update = { - ...profile, - updated_at: new Date(), - } - - return this.supabase.from('profiles').upsert(update) - } - - downLoadImage(path: string) { - return this.supabase.storage.from('avatars').download(path) - } - - uploadAvatar(filePath: string, file: File) { - return this.supabase.storage.from('avatars').upload(filePath, file) - } -} -``` - -Optionally, update [src/styles.css](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/angular-user-management/src/styles.css) to style the app. - -### Set up a Login component - -Let's set up an Angular component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. -Create an **AuthComponent** with `ng g c auth` Angular CLI command. - -```ts title=src/app/auth/auth.component.ts -import { Component, OnInit } from '@angular/core' -import { FormBuilder } from '@angular/forms' -import { SupabaseService } from '../supabase.service' - -@Component({ - selector: 'app-auth', - templateUrl: './auth.component.html', - styleUrls: ['./auth.component.css'], -}) -export class AuthComponent implements OnInit { - loading = false - - signInForm = this.formBuilder.group({ - email: '', - }) - - constructor( - private readonly supabase: SupabaseService, - private readonly formBuilder: FormBuilder - ) {} - - ngOnInit(): void {} - - async onSubmit(): Promise { - try { - this.loading = true - const email = this.signInForm.value.email as string - const { error } = await this.supabase.signIn(email) - if (error) throw error - alert('Check your email for the login link!') - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - this.signInForm.reset() - this.loading = false - } - } -} -``` - -```html title=src/app/auth/auth.component.html -
-
-

Supabase + Angular

-

Sign in via magic link with your email below

-
-
- - -
-
- -
-
-
-
{ - await this.getProfile() - - const { username, website, avatar_url } = this.profile - this.updateProfileForm.patchValue({ - username, - website, - avatar_url, - }) - } - - async getProfile() { - try { - this.loading = true - const { user } = this.session - let { data: profile, error, status } = await this.supabase.profile(user) - - if (error && status !== 406) { - throw error - } - - if (profile) { - this.profile = profile - } - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - this.loading = false - } - } - - async updateProfile(): Promise { - try { - this.loading = true - const { user } = this.session - - const username = this.updateProfileForm.value.username as string - const website = this.updateProfileForm.value.website as string - const avatar_url = this.updateProfileForm.value.avatar_url as string - - const { error } = await this.supabase.updateProfile({ - id: user.id, - username, - website, - avatar_url, - }) - if (error) throw error - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - this.loading = false - } - } - - async signOut() { - await this.supabase.signOut() - } -} -``` - -```html title=src/app/account/account.component.html -
-
- - -
-
- - -
-
- - -
- -
- -
- -
- -
-
-``` - -### Launch! - -Now that we have all the components in place, let's update **AppComponent**: - -```ts title=src/app/app.component.ts -import { Component, OnInit } from '@angular/core' -import { SupabaseService } from './supabase.service' - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'], -}) -export class AppComponent implements OnInit { - title = 'angular-user-management' - - session = this.supabase.session - - constructor(private readonly supabase: SupabaseService) {} - - ngOnInit() { - this.supabase.authChanges((_, session) => (this.session = session)) - } -} -``` - -```html title=src/app/app.component.html -
- - - - -
-``` - -`app.module.ts` also needs to be modified to include the `ReactiveFormsModule` from the `@angular/forms` package. - -```ts title=src/app/app.module.ts -import { NgModule } from '@angular/core' -import { BrowserModule } from '@angular/platform-browser' - -import { AppComponent } from './app.component' -import { AuthComponent } from './auth/auth.component' -import { AccountComponent } from './account/account.component' -import { ReactiveFormsModule } from '@angular/forms' -import { AvatarComponent } from './avatar/avatar.component' - -@NgModule({ - declarations: [AppComponent, AuthComponent, AccountComponent, AvatarComponent], - imports: [BrowserModule, ReactiveFormsModule], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} -``` - -Once that's done, run this in a terminal window: - -```bash -npm run start -``` - -And then open the browser to [localhost:4200](http://localhost:4200) and you should see the completed app. - -![Supabase Angular](/docs/img/supabase-angular-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. -Create an **AvatarComponent** with `ng g c avatar` Angular CLI command. - -```ts title=src/app/avatar/avatar.component.ts -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core' -import { SafeResourceUrl, DomSanitizer } from '@angular/platform-browser' -import { SupabaseService } from '../supabase.service' - -@Component({ - selector: 'app-avatar', - templateUrl: './avatar.component.html', - styleUrls: ['./avatar.component.css'], -}) -export class AvatarComponent implements OnInit { - _avatarUrl: SafeResourceUrl | undefined - uploading = false - - @Input() - set avatarUrl(url: string | null) { - if (url) { - this.downloadImage(url) - } - } - - @Output() upload = new EventEmitter() - - constructor(private readonly supabase: SupabaseService, private readonly dom: DomSanitizer) {} - - ngOnInit(): void {} - - async downloadImage(path: string) { - try { - const { data } = await this.supabase.downLoadImage(path) - if (data instanceof Blob) { - this._avatarUrl = this.dom.bypassSecurityTrustResourceUrl(URL.createObjectURL(data)) - } - } catch (error) { - if (error instanceof Error) { - console.error('Error downloading image: ', error.message) - } - } - } - - async uploadAvatar(event: any) { - try { - this.uploading = true - if (!event.target.files || event.target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = event.target.files[0] - const fileExt = file.name.split('.').pop() - const filePath = `${Math.random()}.${fileExt}` - - await this.supabase.uploadAvatar(filePath, file) - this.upload.emit(filePath) - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - this.uploading = false - } - } -} -``` - -```html title=src/app/avatar/avatar.component.html -
- Avatar -
-
-
- - -
-``` - -### Add the new widget - -And then we can add the widget on top of the **AccountComponent** html template: - -```html title=src/app/account.component.html -
- - -
-``` - -And add an `updateAvatar` function along with an `avatarUrl` getter to the **AccountComponent** typescript file: - -```ts title=src/app/account.component.ts -@Component({ - selector: 'app-account', - templateUrl: './account.component.html', - styleUrls: ['./account.component.css'], -}) -export class AccountComponent implements OnInit { - // ... - get avatarUrl() { - return this.updateProfileForm.value.avatar_url as string - } - - async updateAvatar(event: string): Promise { - this.updateProfileForm.patchValue({ - avatar_url: event, - }) - await this.updateProfile() - } - // ... -} -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-expo.mdx b/apps/docs/pages/guides/with-expo.mdx deleted file mode 100644 index b60db313a51..00000000000 --- a/apps/docs/pages/guides/with-expo.mdx +++ /dev/null @@ -1,512 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-expo', - title: 'Quickstart: Expo', - description: 'Learn how to use Supabase in your React Native App.', - sidebar_label: 'Expo', - hide_table_of_contents: false, -} - - - -![Supabase User Management example](/docs/img/supabase-flutter-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/expo-user-management). - - - -## Building the App - -Let's start building the React Native app from scratch. - -### Initialize a React Native app - -We can use [`expo`](https://docs.expo.dev/get-started/create-a-new-app/) to initialize -an app called `expo-user-management`: - -```bash -npx create-expo-app -t expo-template-blank-typescript expo-user-management - -cd expo-user-management -``` - -Then let's install the additional dependencies: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -npm install react-native-elements @react-native-async-storage/async-storage react-native-url-polyfill -``` - -Now let's create a helper file to initialize the Supabase client. -We need the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). -These variables will be exposed on the browser, and that's completely fine since we have -[Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```ts title=lib/supabase.ts -import AsyncStorage from '@react-native-async-storage/async-storage' -import { createClient } from '@supabase/supabase-js' - -const supabaseUrl = YOUR_REACT_NATIVE_SUPABASE_URL -const supabaseAnonKey = YOUR_REACT_NATIVE_SUPABASE_ANON_KEY - -export const supabase = createClient(supabaseUrl, supabaseAnonKey, { - auth: { - storage: AsyncStorage as any, - autoRefreshToken: true, - persistSession: true, - detectSessionInUrl: false, - }, -}) -``` - -### Set up a Login component - -Let's set up a React Native component to manage logins and sign ups. -Users would be able to sign in with their email and password. - -```tsx title=components/Auth.tsx -import React, { useState } from 'react' -import { Alert, StyleSheet, View } from 'react-native' -import { supabase } from '../lib/supabase' -import { Button, Input } from 'react-native-elements' - -export default function Auth() { - const [email, setEmail] = useState('') - const [password, setPassword] = useState('') - const [loading, setLoading] = useState(false) - - async function signInWithEmail() { - setLoading(true) - const { error } = await supabase.auth.signInWithPassword({ - email: email, - password: password, - }) - - if (error) Alert.alert(error.message) - setLoading(false) - } - - async function signUpWithEmail() { - setLoading(true) - const { error } = await supabase.auth.signUp({ - email: email, - password: password, - }) - - if (error) Alert.alert(error.message) - setLoading(false) - } - - return ( - - - setEmail(text)} - value={email} - placeholder="email@address.com" - autoCapitalize={'none'} - /> - - - setPassword(text)} - value={password} - secureTextEntry={true} - placeholder="Password" - autoCapitalize={'none'} - /> - - - -
- -
- -
-
- ) -} -``` - - - - -Let's create a new component for that called `Account.tsx` within a `components` folder. - -```tsx title=components/Account.tsx -import { useState, useEffect } from 'react' -import { useUser, useSupabaseClient, Session } from '@supabase/auth-helpers-react' -import { Database } from '../utils/database.types' -type Profiles = Database['public']['Tables']['profiles']['Row'] - -export default function Account({ session }: { session: Session }) { - const supabase = useSupabaseClient() - const user = useUser() - const [loading, setLoading] = useState(true) - const [username, setUsername] = useState(null) - const [website, setWebsite] = useState(null) - const [avatar_url, setAvatarUrl] = useState(null) - - useEffect(() => { - getProfile() - }, [session]) - - async function getProfile() { - try { - setLoading(true) - if (!user) throw new Error('No user') - - let { data, error, status } = await supabase - .from('profiles') - .select(`username, website, avatar_url`) - .eq('id', user.id) - .single() - - if (error && status !== 406) { - throw error - } - - if (data) { - setUsername(data.username) - setWebsite(data.website) - setAvatarUrl(data.avatar_url) - } - } catch (error) { - alert('Error loading user data!') - console.log(error) - } finally { - setLoading(false) - } - } - - async function updateProfile({ - username, - website, - avatar_url, - }: { - username: Profiles['username'] - website: Profiles['website'] - avatar_url: Profiles['avatar_url'] - }) { - try { - setLoading(true) - if (!user) throw new Error('No user') - - const updates = { - id: user.id, - username, - website, - avatar_url, - updated_at: new Date().toISOString(), - } - - let { error } = await supabase.from('profiles').upsert(updates) - if (error) throw error - alert('Profile updated!') - } catch (error) { - alert('Error updating the data!') - console.log(error) - } finally { - setLoading(false) - } - } - - return ( -
-
- - -
-
- - setUsername(e.target.value)} - /> -
-
- - setWebsite(e.target.value)} - /> -
- -
- -
- -
- -
-
- ) -} -``` - -
- - -### Launch! - -Now that we have all the components in place, let's update `pages/index.js`: - -```jsx lines=3,14 title=pages/index.js -import { Auth, ThemeSupa } from '@supabase/auth-ui-react' -import { useSession, useSupabaseClient } from '@supabase/auth-helpers-react' -import Account from '../components/Account' - -const Home = () => { - const session = useSession() - const supabase = useSupabaseClient() - - return ( -
- {!session ? ( - - ) : ( - - )} -
- ) -} - -export default Home -``` - -Once that's done, run this in a terminal window: - -```bash -npm run dev -``` - -And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like -photos and videos. - -### Create an upload widget - -Let's create an avatar widget for the user so that they can upload a profile photo. We can start by creating a new component: - - - - -```jsx title=components/Avatar.js -import React, { useEffect, useState } from 'react' -import { useSupabaseClient } from '@supabase/auth-helpers-react' - -export default function Avatar({ uid, url, size, onUpload }) { - const supabase = useSupabaseClient() - const [avatarUrl, setAvatarUrl] = useState(null) - const [uploading, setUploading] = useState(false) - - useEffect(() => { - if (url) downloadImage(url) - }, [url]) - - async function downloadImage(path) { - try { - const { data, error } = await supabase.storage.from('avatars').download(path) - if (error) { - throw error - } - const url = URL.createObjectURL(data) - setAvatarUrl(url) - } catch (error) { - console.log('Error downloading image: ', error) - } - } - - const uploadAvatar = async (event) => { - try { - setUploading(true) - - if (!event.target.files || event.target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = event.target.files[0] - const fileExt = file.name.split('.').pop() - const fileName = `${uid}.${fileExt}` - const filePath = `${fileName}` - - let { error: uploadError } = await supabase.storage - .from('avatars') - .upload(filePath, file, { upsert: true }) - - if (uploadError) { - throw uploadError - } - - onUpload(filePath) - } catch (error) { - alert('Error uploading avatar!') - console.log(error) - } finally { - setUploading(false) - } - } - - return ( -
- {avatarUrl ? ( - Avatar - ) : ( -
- )} -
- - -
-
- ) -} -``` - - - - -```tsx title=components/Avatar.tsx -import React, { useEffect, useState } from 'react' -import { useSupabaseClient } from '@supabase/auth-helpers-react' -import { Database } from '../utils/database.types' -type Profiles = Database['public']['Tables']['profiles']['Row'] - -export default function Avatar({ - uid, - url, - size, - onUpload, -}: { - uid: string - url: Profiles['avatar_url'] - size: number - onUpload: (url: string) => void -}) { - const supabase = useSupabaseClient() - const [avatarUrl, setAvatarUrl] = useState(null) - const [uploading, setUploading] = useState(false) - - useEffect(() => { - if (url) downloadImage(url) - }, [url]) - - async function downloadImage(path: string) { - try { - const { data, error } = await supabase.storage.from('avatars').download(path) - if (error) { - throw error - } - const url = URL.createObjectURL(data) - setAvatarUrl(url) - } catch (error) { - console.log('Error downloading image: ', error) - } - } - - const uploadAvatar: React.ChangeEventHandler = async (event) => { - try { - setUploading(true) - - if (!event.target.files || event.target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = event.target.files[0] - const fileExt = file.name.split('.').pop() - const fileName = `${uid}.${fileExt}` - const filePath = `${fileName}` - - let { error: uploadError } = await supabase.storage - .from('avatars') - .upload(filePath, file, { upsert: true }) - - if (uploadError) { - throw uploadError - } - - onUpload(filePath) - } catch (error) { - alert('Error uploading avatar!') - console.log(error) - } finally { - setUploading(false) - } - } - - return ( -
- {avatarUrl ? ( - Avatar - ) : ( -
- )} -
- - -
-
- ) -} -``` - - - - -### Add the new widget - -And then we can add the widget to the Account page: - -```jsx title=components/Account.js -// Import the new component -import Avatar from './Avatar' - -// ... - -return ( -
- {/* Add to the body */} - { - setAvatarUrl(url) - updateProfile({ username, website, avatar_url: url }) - }} - /> - {/* ... */} -
-) -``` - -## Next steps - -At this stage you have a fully functional application! - -- See the complete [example on GitHub](https://github.com/supabase/supabase/tree/master/examples/user-management/nextjs-ts-user-management) and deploy it to Vercel. -- Explore the [pre-built Auth UI for React](/docs/guides/auth/auth-helpers/auth-ui). -- Explore the [Auth Helpers for Next.js](/docs/guides/auth/auth-helpers/nextjs). -- Explore the [Supabase Cache Helpers](https://github.com/psteinroe/supabase-cache-helpers). -- See the [Next.js Subscription Payments Starter](https://github.com/vercel/nextjs-subscription-payments) template on GitHub. -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-nuxt-3.mdx b/apps/docs/pages/guides/with-nuxt-3.mdx deleted file mode 100644 index b4f5af0a1a3..00000000000 --- a/apps/docs/pages/guides/with-nuxt-3.mdx +++ /dev/null @@ -1,432 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-nuxt-3', - title: 'Quickstart: Nuxt 3', - description: 'Learn how to use Supabase in your Nuxt 3 App.', - sidebar_label: 'Nuxt 3', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### Github - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/nuxt3-user-management). - - - -## Building the App - -Let's start building the Vue 3 app from scratch. - -### Initialize a Nuxt 3 app - -We can use [`nuxi init`](https://v3.nuxtjs.org/getting-started/quick-start/) to create an app called `nuxt-user-management`: - -```bash -npx nuxi init nuxt-user-management - -cd nuxt-user-management -``` - -Then let's install the only additional dependency: [NuxtSupabase](https://supabase.nuxtjs.org/). We only need to import NuxtSupabase as a dev dependency. - -```bash -npm install @nuxtjs/supabase --save-dev -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -SUPABASE_URL="YOUR_SUPABASE_URL" -SUPABASE_KEY="YOUR_SUPABASE_ANON_KEY" -``` - -These variables will be exposed on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. -Amazing thing about [NuxtSupabase](https://supabase.nuxtjs.org/) is that setting environment variables is all we need to do in order to start using Supabase. -No need to initialize Supabase. The library will take care of it automatically. - -And one optional step is to update the CSS file `assets/main.css` to make the app look nice. -You can find the full contents of this file [here](https://github.com/supabase-community/nuxt3-quickstarter/blob/main/assets/main.css). - -```typescript title=nuxt.config.ts -import { defineNuxtConfig } from 'nuxt' - -// https://v3.nuxtjs.org/api/configuration/nuxt.config -export default defineNuxtConfig({ - modules: ['@nuxtjs/supabase'], - css: ['@/assets/main.css'], -}) -``` - -### Set up Auth component - -Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```html title=/components/Auth.vue - - - -``` - -### User state - -To access the user information, use the composable [useSupabaseUser](https://supabase.nuxtjs.org/usage/composables/use-supabase-user) provided by the Supabase Nuxt module. - -### Account component - -After a user is signed in we can allow them to edit their profile details and manage their account. -Let's create a new component for that called `Account.vue`. - -```html title=components/Account.vue - - - -``` - -### Launch! - -Now that we have all the components in place, let's update `app.vue`: - -```html title=app.vue - - - -``` - -Once that's done, run this in a terminal window: - -```bash -npm run dev -``` - -And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. - -![Supabase Nuxt 3](/docs/img/supabase-vue-3-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```html title=components/Avatar.vue - - - -``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```html title=components/Account.vue - - - -``` - -That is it! You should now be able to upload a profile photo to Supabase Storage. - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-react.mdx b/apps/docs/pages/guides/with-react.mdx deleted file mode 100644 index 1f7804f15ab..00000000000 --- a/apps/docs/pages/guides/with-react.mdx +++ /dev/null @@ -1,403 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-react', - title: 'Quickstart: React', - description: 'Learn how to use Supabase in your React App.', - sidebar_label: 'React', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/react-user-management). - - - -## Building the App - -Let's start building the React app from scratch. - -### Initialize a React app - -We can use [Create React App](https://create-react-app.dev/docs/getting-started/) to initialize -an app called `supabase-react`: - -```bash -npx create-react-app supabase-react -cd supabase-react -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js). - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -REACT_APP_SUPABASE_URL=YOUR_SUPABASE_URL -REACT_APP_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY -``` - -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed -on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```js title=src/supabaseClient.js -import { createClient } from '@supabase/supabase-js' - -const supabaseUrl = process.env.REACT_APP_SUPABASE_URL -const supabaseAnonKey = process.env.REACT_APP_SUPABASE_ANON_KEY - -export const supabase = createClient(supabaseUrl, supabaseAnonKey) -``` - -And one optional step is to update the CSS file `src/index.css` to make the app look nice. -You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/react-user-management/src/index.css). - -### Set up a Login component - -Let's set up a React component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```jsx title=src/Auth.js -import { useState } from 'react' -import { supabase } from './supabaseClient' - -export default function Auth() { - const [loading, setLoading] = useState(false) - const [email, setEmail] = useState('') - - const handleLogin = async (e) => { - e.preventDefault() - - try { - setLoading(true) - const { error } = await supabase.auth.signInWithOtp({ email }) - if (error) throw error - alert('Check your email for the login link!') - } catch (error) { - alert(error.error_description || error.message) - } finally { - setLoading(false) - } - } - - return ( -
-
-

Supabase + React

-

Sign in via magic link with your email below

- {loading ? ( - 'Sending magic link...' - ) : ( -
- - setEmail(e.target.value)} - /> - -
- )} -
-
- ) -} -``` - -### Account page - -After a user is signed in we can allow them to edit their profile details and manage their account. - -Let's create a new component for that called `Account.js`. - -```jsx title=src/Account.js -import { useState, useEffect } from 'react' -import { supabase } from './supabaseClient' - -const Account = ({ session }) => { - const [loading, setLoading] = useState(true) - const [username, setUsername] = useState(null) - const [website, setWebsite] = useState(null) - const [avatar_url, setAvatarUrl] = useState(null) - - useEffect(() => { - getProfile() - }, [session]) - - const getProfile = async () => { - try { - setLoading(true) - const { user } = session - - let { data, error, status } = await supabase - .from('profiles') - .select(`username, website, avatar_url`) - .eq('id', user.id) - .single() - - if (error && status !== 406) { - throw error - } - - if (data) { - setUsername(data.username) - setWebsite(data.website) - setAvatarUrl(data.avatar_url) - } - } catch (error) { - alert(error.message) - } finally { - setLoading(false) - } - } - - const updateProfile = async (e) => { - e.preventDefault() - - try { - setLoading(true) - const { user } = session - - const updates = { - id: user.id, - username, - website, - avatar_url, - updated_at: new Date(), - } - - let { error } = await supabase.from('profiles').upsert(updates) - - if (error) { - throw error - } - } catch (error) { - alert(error.message) - } finally { - setLoading(false) - } - } - - return ( -
- {loading ? ( - 'Saving ...' - ) : ( -
-
Email: {session.user.email}
-
- - setUsername(e.target.value)} - /> -
-
- - setWebsite(e.target.value)} - /> -
-
- -
-
- )} - -
- ) -} - -export default Account -``` - -### Launch! - -Now that we have all the components in place, let's update `App.js`: - -```jsx title=src/App.js -import './index.css' -import { useState, useEffect } from 'react' -import { supabase } from './supabaseClient' -import Auth from './Auth' -import Account from './Account' - -export default function App() { - const [session, setSession] = useState(null) - - useEffect(() => { - supabase.auth.getSession().then(({ data: { session } }) => { - setSession(session) - }) - - supabase.auth.onAuthStateChange((_event, session) => { - setSession(session) - }) - }, []) - - return ( -
- {!session ? : } -
- ) -} -``` - -Once that's done, run this in a terminal window: - -```bash -npm start -``` - -And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. - -![Supabase React](/docs/img/supabase-react-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```jsx title=src/Avatar.js -import { useEffect, useState } from 'react' -import { supabase } from './supabaseClient' - -export default function Avatar({ url, size, onUpload }) { - const [avatarUrl, setAvatarUrl] = useState(null) - const [uploading, setUploading] = useState(false) - - useEffect(() => { - if (url) downloadImage(url) - }, [url]) - - const downloadImage = async (path) => { - try { - const { data, error } = await supabase.storage.from('avatars').download(path) - if (error) { - throw error - } - const url = URL.createObjectURL(data) - setAvatarUrl(url) - } catch (error) { - console.log('Error downloading image: ', error.message) - } - } - - const uploadAvatar = async (event) => { - try { - setUploading(true) - - if (!event.target.files || event.target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = event.target.files[0] - const fileExt = file.name.split('.').pop() - const fileName = `${Math.random()}.${fileExt}` - const filePath = `${fileName}` - - let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) - - if (uploadError) { - throw uploadError - } - - onUpload(filePath) - } catch (error) { - alert(error.message) - } finally { - setUploading(false) - } - } - - return ( -
- {avatarUrl - {uploading ? ( - 'Uploading...' - ) : ( - <> - -
- -
- - )} -
- ) -} -``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```jsx title=src/Account.js -// Import the new component -import Avatar from './Avatar' - -// ... - -return ( -
- {/* Add to the body */} - { - setAvatarUrl(url) - updateProfile({ username, website, avatar_url: url }) - }} - /> - {/* ... */} -
-) -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-redwoodjs.mdx b/apps/docs/pages/guides/with-redwoodjs.mdx deleted file mode 100644 index cae8504a010..00000000000 --- a/apps/docs/pages/guides/with-redwoodjs.mdx +++ /dev/null @@ -1,785 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-redwoodjs', - title: 'Quickstart: RedwoodJS', - description: 'Learn how to use Supabase in your RedwoodJS App.', - sidebar_label: 'RedwoodJS', -} - -## Intro - -For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. - -We **_won't use_** Prisma to connect to the Supabase Postgres database or [Prisma migrations](https://redwoodjs.com/docs/cli-commands#prisma-migrate) as one typically might in a Redwood app. -Instead, we'll rely on the Supabase client to do some of the work on the **web** side and use the client again on the **API** side to do data fetching as well. - -That means you will want to refrain from running any `yarn rw prisma migrate` commands and also double check your build commands on deployment to ensure Prisma won't reset your database. - - - -TLDR; Prisma currently doesn't support cross-schema foreign keys, so introspecting the schema fails due to how your Supabase `public` schema references the `auth.users`. - - - -This example provides the steps to build a simple user management app (from scratch!) using Supabase and [RedwoodJS](https://redwoodjs.com/docs/introduction). It includes: - -- Supabase [Database](/docs/guides/database): a Postgres database for storing your user data. -- Supabase [Auth](/docs/guides/auth): users can sign in with magic links (no passwords, only email). -- Supabase [Storage](/docs/guides/storage): users can upload a photo. -- Instant [APIs](/docs/guides/api): APIs will be automatically generated when you create your database tables. -- [Row Level Security](/docs/guides/auth#row-level-security): data is protected so that individuals can only access their own data. - -By the end of this guide you'll have an app which allows users to login and update some basic profile details: - -![Supabase User Management example](/docs/img/user-management-demo.png) - - - -Note: For RedwoodJS apps, port will be 8910 - - - -### GitHub - -If you get stuck at any point, take a look at [this repo](https://github.com/redwoodjs/redwoodjs-supabase-quickstart). - -{/* ## Video demo */} - -{/* Coming soon. */} - -{/* Use the annotated timeline to step through this tutorial. */} - -{/* ## Instant deploy */} - -{/* Want to deploy a completed version of this example without following the guide? */} - -{/* [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Freact-user-management&project-name=supabase-user-management&repository-name=supabase-user-management&demo-title=Supabase%20User%20Management&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-react-user-management.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FZ3HkQqe.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management) */} - -{/* Clicking this button the application will: */} - -{/* - Launch and prepare the Postgres database in Supabase. */} -{/* - Launch the app in Vercel. */} -{/* - Fork the example into your own GitHub account. */} -{/* - Prepare the deployed application with all the necessary environment variables. */} - -{/* If you want to do it yourself, let's get started:` */} - -## About RedwoodJS - -A Redwood application is split into two parts: a frontend and a backend. This is represented as two node projects within a single monorepo. - -The frontend project is called **`web`** and the backend project is called **`api`**. For clarity, we will refer to these in prose as **"sides"**, i.e. the "web side" and the "api side". -They are separate projects because code on the `web side` will end up running in the user's browser while code on the `api side` will run on a server somewhere. - - - -Important: When this guide refers to "API", that means the Supabase API and when it refers to "api side", that means the RedwoodJS `api side`. - - - -The **`api side`** is an implementation of a GraphQL API. The business logic is organized into "services" that represent their own internal API and can be called both from external GraphQL requests and other internal services. - -The **`web side`** is built with React. Redwood's router makes it simple to map URL paths to React "Page" components (and automatically code-split your app on each route). -Pages may contain a "Layout" component to wrap content. They also contain "Cells" and regular React components. -Cells allow you to declaratively manage the lifecycle of a component that fetches and displays data. - - - -For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. -We **_won't use_** Prisma to connect to the Supabase Postgres database or [Prisma migrations](https://redwoodjs.com/docs/cli-commands#prisma-migrate) as one typically might in a Redwood app. -Instead, we'll rely on the Supabase client to do some of the work on the **`web`** side and use the client again on the **`api`** side to do data fetching as well. - - - -## Project set up - -Before we start building we're going to set up our Database and API. This is as simple as starting a new Project in Supabase -and then creating a "schema" inside the database. - - - -When setting up Supabase, you'll interact with your project dashboard. However, most of the RedwoodJS setup steps will interact with the [Redwood CLI](https://redwoodjs.com/docs/cli-commands) to generate routes, pages, components, and more. -So be sure to have a terminal at the ready and in your project directory. - - - -### Create a project - -1. Go to [app.supabase.com](https://app.supabase.com). -1. Click on "New Project". -1. Enter your project details. -1. Wait for the new database to launch. - -### Set up the database schema - -Now we are going to set up the database schema. We can use the "User Management Starter" quickstart in the SQL Editor, -or you can just copy/paste the SQL from below and run it yourself. - - - - -1. Go to the [SQL Editor](https://app.supabase.com/project/_/sql) page in the Dashboard. -2. Click **User Management Starter**. -3. Click **Run**. - - - - - - -```sql --- Create a table for public "profiles" -create table profiles ( - id uuid references auth.users not null, - updated_at timestamp with time zone, - username text unique, - avatar_url text, - website text, - - primary key (id), - unique(username), - constraint username_length check (char_length(username) >= 3) -); - -alter table profiles enable row level security; - -create policy "Public profiles are viewable by everyone." - on profiles for select - using ( true ); - -create policy "Users can insert their own profile." - on profiles for insert - with check ( auth.uid() = id ); - -create policy "Users can update own profile." - on profiles for update - using ( auth.uid() = id ); - --- Set up Realtime! -begin; - drop publication if exists supabase_realtime; - create publication supabase_realtime; -commit; -alter publication supabase_realtime add table profiles; - --- Set up Storage! -insert into storage.buckets (id, name) -values ('avatars', 'avatars'); - -create policy "Avatar images are publicly accessible." - on storage.objects for select - using ( bucket_id = 'avatars' ); - -create policy "Anyone can upload an avatar." - on storage.objects for insert - with check ( bucket_id = 'avatars' ); - -``` - - - - -#### Important Note about Prisma and Migrations - - - -Because this Quick Start does not use Prisma to manage the database schema, seed it, or run migrations, you **need** to take extra care when running some of the typical Redwood CLI commands. - - - -### Get the API Keys - -Now that you've created some database tables, you are ready to insert data using the auto-generated API. -We just need to get the URL as well as the `anon`, `service_role` and `JWT_SECRET` keys from the API settings. - -1. Go to the [API Settings](https://app.supabase.com/project/_/settings/api) page in the Dashboard. -2. Find your API `URL`, `anon`, and `service_role` keys on this page. - - - -## Building the App - -Let's start building the RedwoodJS app from scratch. - - - -RedwoodJS requires Node.js `>= 14.x <= 16.x` and Yarn `>= 1.15`. - - - -Make sure you have installed yarn since RedwoodJS relies on it to [manage its packages in workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) for its `web` and `api` "sides". - -### Initialize a RedwoodJS app - -We can use [Create Redwood App](https://redwoodjs.com/docs/quick-start) command to initialize -an app called `supabase-redwoodjs`: - -```bash -yarn create redwood-app supabase-redwoodjs -cd supabase-redwoodjs -``` - -While the app is installing, you should see: - -```bash -✔ Creating Redwood app - ✔ Checking node and yarn compatibility - ✔ Creating directory 'supabase-redwoodjs' -✔ Installing packages - ✔ Running 'yarn install'... (This could take a while) -✔ Convert TypeScript files to JavaScript -✔ Generating types - -Thanks for trying out Redwood! -``` - -Then let's install the only additional dependency [supabase-js](https://github.com/supabase/supabase-js) by running the `setup auth` command: - -```bash -yarn redwood setup auth supabase -``` - -When prompted: - -> Overwrite existing /api/src/lib/auth.[jt]s? - -Say, **yes** and it will setup the Supabase client in your app and also provide hooks used with Supabase authentication. - -```bash -✔ Generating auth lib... - ✔ Successfully wrote file `./api/src/lib/auth.js` - ✔ Adding auth config to web... - ✔ Adding auth config to GraphQL API... - ✔ Adding required web packages... - ✔ Installing packages... - ✔ One more thing... - - You will need to add your Supabase URL (SUPABASE_URL), public API KEY, - and JWT SECRET (SUPABASE_KEY, and SUPABASE_JWT_SECRET) to your .env file. -``` - -Next, we want to save the environment variables in a `.env`. -We need the `API URL` as well as the `anon` and `jwt_secret` keys that you copied [earlier](#get-the-api-keys). - -```bash title=.env -SUPABASE_URL=YOUR_SUPABASE_URL -SUPABASE_KEY=YOUR_SUPABASE_ANON_KEY -SUPABASE_JWT_SECRET=YOUR_SUPABASE_JWT_SECRET -``` - -And finally, you will also need to save **just** the `web side` environment variables to the `redwood.toml`. - -```bash title=redwood.toml -[web] - title = "Supabase Redwood Quickstart" - port = 8910 - apiProxyPath = "/.redwood/functions" - includeEnvironmentVariables = ["SUPABASE_URL", "SUPABASE_KEY"] -[api] - port = 8911 -[browser] - open = true -``` - -These variables will be exposed on the browser, and that's completely fine. -They allow your web app to initialize the Supabase client with your public anon key -since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -You'll see these being used to configure your Supabase client in `web/src/App.js`: - -```js title=web/src/App.js -// ... Redwood imports -import { AuthProvider } from '@redwoodjs/auth' -import { createClient } from '@supabase/supabase-js' - -// ... - -const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY) - -const App = () => ( - - - - - - - - - -) - -export default App -``` - -And one optional step is to update the CSS file `web/src/index.css` to make the app look nice. -You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/react-user-management/src/index.css). - -### Start RedwoodJS and your first Page - -Let's test our setup at the moment by starting up the app: - -```bash -yarn rw dev -``` - - - -Note: You can also use the alias `rw` for `redwood`, as in `yarn rw` to run Redwood CLI commands - - - -You should see a "Welcome to RedwoodJS" page and a message about not having any pages yet. - -So, let's create a "home" page: - -```bash -yarn rw generate page home / - -✔ Generating page files... - ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.stories.js` - ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.test.js` - ✔ Successfully wrote file `./web/src/pages/HomePage/HomePage.js` -✔ Updating routes file... -✔ Generating types ... -``` - - - -Note: the slash `/` is important here as it creates a root level route. - - - -You can stop the `dev` server if you want; to see your changes, just be sure to run `yarn rw dev` again. - -You should see the `Home` page route in `web/src/Routes.js`: - -```bash title=web/src/Routes.js -import { Router, Route } from '@redwoodjs/router' - -const Routes = () => { - return ( - - - - - ) -} - -export default Routes -``` - -### Set up a Login component - -Let's set up a Redwood component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```bash -yarn rw g component auth - - ✔ Generating component files... - ✔ Successfully wrote file `./web/src/components/Auth/Auth.test.js` - ✔ Successfully wrote file `./web/src/components/Auth/Auth.stories.js` - ✔ Successfully wrote file `./web/src/components/Auth/Auth.js` - -``` - -Now, update the `Auth.js` component to contain: - -```jsx title=/web/src/components/Auth/Auth.js -import { useState } from 'react' -import { useAuth } from '@redwoodjs/auth' - -const Auth = () => { - const { logIn } = useAuth() - const [loading, setLoading] = useState(false) - const [email, setEmail] = useState('') - - const handleLogin = async (email) => { - try { - setLoading(true) - const { error } = await logIn({ email }) - if (error) throw error - alert('Check your email for the login link!') - } catch (error) { - alert(error.error_description || error.message) - } finally { - setLoading(false) - } - } - - return ( -
-
-

Supabase + RedwoodJS

-

Sign in via magic link with your email below

-
- setEmail(e.target.value)} - /> -
-
- -
-
-
- ) -} - -export default Auth -``` - -### Set up an Account component - -After a user is signed in we can allow them to edit their profile details and manage their account. - -Let's create a new component for that called `Account.js`. - -```bash -yarn rw g component account - - ✔ Generating component files... - ✔ Successfully wrote file `./web/src/components/Account/Account.test.js` - ✔ Successfully wrote file `./web/src/components/Account/Account.stories.js` - ✔ Successfully wrote file `./web/src/components/Account/Account.js` -``` - -And then update the file to contain: - -```jsx title=web/src/components/Account/Account.js -import { useState, useEffect } from 'react' -import { useAuth } from '@redwoodjs/auth' - -const Account = () => { - const { client: supabase, currentUser, logOut } = useAuth() - const [loading, setLoading] = useState(true) - const [username, setUsername] = useState(null) - const [website, setWebsite] = useState(null) - const [avatar_url, setAvatarUrl] = useState(null) - - useEffect(() => { - getProfile() - }, [supabase.auth.session]) - - async function getProfile() { - try { - setLoading(true) - const user = supabase.auth.user() - - let { data, error, status } = await supabase - .from('profiles') - .select(`username, website, avatar_url`) - .eq('id', user.id) - .single() - - if (error && status !== 406) { - throw error - } - - if (data) { - setUsername(data.username) - setWebsite(data.website) - setAvatarUrl(data.avatar_url) - } - } catch (error) { - alert(error.message) - } finally { - setLoading(false) - } - } - - async function updateProfile({ username, website, avatar_url }) { - try { - setLoading(true) - const user = supabase.auth.user() - - const updates = { - id: user.id, - username, - website, - avatar_url, - updated_at: new Date(), - } - - let { error } = await supabase.from('profiles').upsert(updates, { - returning: 'minimal', // Don't return the value after inserting - }) - - if (error) { - throw error - } - - alert('Updated profile!') - } catch (error) { - alert(error.message) - } finally { - setLoading(false) - } - } - - return ( -
-
-

Supabase + RedwoodJS

-

Your profile

-
-
- - -
-
- - setUsername(e.target.value)} - /> -
-
- - setWebsite(e.target.value)} - /> -
- -
- -
- -
- -
-
-
-
- ) -} - -export default Account -``` - - - -Note: You'll see the use of `useAuth()` several times in the quickstart. Redwood's `useAuth` hook provides convenient ways to access -logIn, logOut, currentUser, and access the `supabase` authenticate client. We'll use it to get an instance -of the supabase client to interact with your API. - - - -### Update Home Page - -Now that we have all the components in place, let's update your `HomePage` page to use them: - -```jsx title=web/src/pages/HomePage/HomePage.js -import { useAuth } from '@redwoodjs/auth' -import { MetaTags } from '@redwoodjs/web' - -import Account from 'src/components/Account' -import Auth from 'src/components/Auth' - -const HomePage = () => { - const { isAuthenticated } = useAuth() - - return ( - <> - - {!isAuthenticated ? : } - - ) -} - -export default HomePage -``` - -> What we're doing here is showing the sign in form if you aren't logged in and your account profile if you are. - -### Launch! - -Once that's done, run this in a terminal window to launch the `dev` server: - -```bash -yarn rw dev -``` - -And then open the browser to [localhost:8910](http://localhost:8910) and you should see the completed app. - -![Supabase RedwoodJS](/docs/img/supabase-redwoodjs-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```bash -yarn rw g component avatar - ✔ Generating component files... - ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.test.js` - ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.stories.js` - ✔ Successfully wrote file `./web/src/components/Avatar/Avatar.js` -``` - -Now, update your Avatar component to contain the following widget: - -```jsx title=web/src/components/Avatar/Avatar.js -import { useEffect, useState } from 'react' -import { useAuth } from '@redwoodjs/auth' - -const Avatar = ({ url, size, onUpload }) => { - const { client: supabase } = useAuth() - - const [avatarUrl, setAvatarUrl] = useState(null) - const [uploading, setUploading] = useState(false) - - useEffect(() => { - if (url) downloadImage(url) - }, [url]) - - async function downloadImage(path) { - try { - const { data, error } = await supabase.storage.from('avatars').download(path) - if (error) { - throw error - } - const url = URL.createObjectURL(data) - setAvatarUrl(url) - } catch (error) { - console.log('Error downloading image: ', error.message) - } - } - - async function uploadAvatar(event) { - try { - setUploading(true) - - if (!event.target.files || event.target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = event.target.files[0] - const fileExt = file.name.split('.').pop() - const fileName = `${Math.random()}.${fileExt}` - const filePath = `${fileName}` - - let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) - - if (uploadError) { - throw uploadError - } - - onUpload(filePath) - } catch (error) { - alert(error.message) - } finally { - setUploading(false) - } - } - - return ( -
- {avatarUrl ? ( - Avatar - ) : ( -
- )} -
- - -
-
- ) -} - -export default Avatar -``` - -### Add the new widget - -And then we can add the widget to the Account component: - -```jsx title=web/src/components/Account/Account.js -// Import the new component -import Avatar from 'src/components/Avatar' - -// ... - -return ( -
- {/* Add to the body */} - { - setAvatarUrl(url) - updateProfile({ username, website, avatar_url: url }) - }} - /> - {/* ... */} -
-) -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) -- Learn more about [RedwoodJS](https://redwoodjs.com) -- Visit the [RedwoodJS Discourse Community](https://community.redwoodjs.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-solidjs.mdx b/apps/docs/pages/guides/with-solidjs.mdx deleted file mode 100644 index f5a65665f3f..00000000000 --- a/apps/docs/pages/guides/with-solidjs.mdx +++ /dev/null @@ -1,427 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-solidjs', - title: 'Quickstart: SolidJS', - description: 'Learn how to use Supabase in your SolidJS App.', - sidebar_label: 'SolidJS', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/solid-user-management). - - - -## Building the App - -Let's start building the SolidJS app from scratch. - -### Initialize a SolidJS app - -We can use [Degit](https://github.com/Rich-Harris/degit) to initialize an app called `supabase-solid`: - -```bash -npx degit solidjs/templates/ts supabase-solid -cd supabase-solid -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -VITE_SUPABASE_URL=YOUR_SUPABASE_URL -VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY -``` - -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed -on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```js title=src/supabaseClient.jsx -import { createClient } from '@supabase/supabase-js' - -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY - -export const supabase = createClient(supabaseUrl, supabaseAnonKey) -``` - -And one optional step is to update the CSS file `src/index.css` to make the app look nice. -You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/solid-user-management/src/index.css). - -### Set up a Login component - -Let's set up a SolidJS component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```jsx title=src/Auth.tsx -import { createSignal } from 'solid-js' -import { supabase } from './supabaseClient' - -export default function Auth() { - const [loading, setLoading] = createSignal(false) - const [email, setEmail] = createSignal('') - - const handleLogin = async (e: SubmitEvent) => { - e.preventDefault() - - try { - setLoading(true) - const { error } = await supabase.auth.signInWithOtp({ email: email() }) - if (error) throw error - alert('Check your email for the login link!') - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - setLoading(false) - } - } - - return ( -
-
-

Supabase + SolidJS

-

Sign in via magic link with your email below

-
-
- - setEmail(e.currentTarget.value)} - /> -
-
- -
-
-
-
- ) -} -``` - -### Account page - -After a user is signed in we can allow them to edit their profile details and manage their account. - -Let's create a new component for that called `Account.tsx`. - -```jsx title=src/Account.tsx -import { AuthSession } from '@supabase/supabase-js' -import { Component, createEffect, createSignal } from 'solid-js' -import { supabase } from './supabaseClient' - -interface Props { - session: AuthSession; -} - -const Account: Component = ({ session }) => { - const [loading, setLoading] = createSignal(true) - const [username, setUsername] = (createSignal < string) | (null > null) - const [website, setWebsite] = (createSignal < string) | (null > null) - const [avatarUrl, setAvatarUrl] = (createSignal < string) | (null > null) - - createEffect(() => { - getProfile() - }) - - const getProfile = async () => { - try { - setLoading(true) - const { user } = session - - let { data, error, status } = await supabase - .from('profiles') - .select(`username, website, avatar_url`) - .eq('id', user.id) - .single() - - if (error && status !== 406) { - throw error - } - - if (data) { - setUsername(data.username) - setWebsite(data.website) - setAvatarUrl(data.avatar_url) - } - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - setLoading(false) - } - } - - const updateProfile = async (e: Event) => { - e.preventDefault() - - try { - setLoading(true) - const { user } = session - - const updates = { - id: user.id, - username: username(), - website: website(), - avatar_url: avatarUrl(), - updated_at: new Date().toISOString(), - } - - let { error } = await supabase.from('profiles').upsert(updates) - - if (error) { - throw error - } - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - setLoading(false) - } - } - - return ( -
-
-
Email: {session.user.email}
-
- - setUsername(e.currentTarget.value)} - /> -
-
- - setWebsite(e.currentTarget.value)} - /> -
-
- -
- -
-
- ) -} - -export default Account -``` - -### Launch! - -Now that we have all the components in place, let's update `App.tsx`: - -```jsx title=src/App.tsx -import { Component, createEffect, createSignal } from 'solid-js' -import { supabase } from './supabaseClient' -import { AuthSession } from '@supabase/supabase-js' -import Account from './Account' -import Auth from './Auth' - -const App: Component = () => { - const [session, setSession] = createSignal(null) - - createEffect(() => { - supabase.auth.getSession().then(({ data: { session } }) => { - setSession(session) - }) - - supabase.auth.onAuthStateChange((_event, session) => { - setSession(session) - }) - }) - - return ( -
- {!session() ? : } -
- ) -} - -export default App -``` - -Once that's done, run this in a terminal window: - -```bash -npm start -``` - -And then open the browser to [localhost:3000](http://localhost:3000) and you should see the completed app. - -![Supabase SolidJS](/docs/img/supabase-solidjs-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```jsx title=src/Avatar.tsx -import { Component, createEffect, createSignal, JSX } from 'solid-js' -import { supabase } from './supabaseClient' - -interface Props { - size: number - url: string | null - onUpload: (event: Event, filePath: string) => void -} - -const Avatar: Component = (props) => { - const [avatarUrl, setAvatarUrl] = createSignal(null) - const [uploading, setUploading] = createSignal(false) - - createEffect(() => { - if (props.url) downloadImage(props.url) - }) - - const downloadImage = async (path: string) => { - try { - const { data, error } = await supabase.storage.from('avatars').download(path) - if (error) { - throw error - } - const url = URL.createObjectURL(data) - setAvatarUrl(url) - } catch (error) { - if (error instanceof Error) { - console.log('Error downloading image: ', error.message) - } - } - } - - const uploadAvatar: JSX.EventHandler = async (event) => { - try { - setUploading(true) - - const target = event.currentTarget - if (!target?.files || target.files.length === 0) { - throw new Error('You must select an image to upload.') - } - - const file = target.files[0] - const fileExt = file.name.split('.').pop() - const fileName = `${Math.random()}.${fileExt}` - const filePath = `${fileName}` - - let { error: uploadError } = await supabase.storage.from('avatars').upload(filePath, file) - - if (uploadError) { - throw uploadError - } - - props.onUpload(event, filePath) - } catch (error) { - if (error instanceof Error) { - alert(error.message) - } - } finally { - setUploading(false) - } - } - - return ( -
- {avatarUrl() ? ( - {avatarUrl() - ) : ( -
- )} -
- - - - -
-
- ) -} - -export default Avatar -``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```jsx title=src/Account.tsx -// Import the new component -import Avatar from './Avatar' - -// ... - -return ( -
- {/* Add to the body */} - { - setAvatarUrl(url) - updateProfile(e) - }} - /> - {/* ... */} -
-) -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-svelte.mdx b/apps/docs/pages/guides/with-svelte.mdx deleted file mode 100644 index 69cdea17b87..00000000000 --- a/apps/docs/pages/guides/with-svelte.mdx +++ /dev/null @@ -1,380 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-svelte', - title: 'Quickstart: Svelte', - description: 'Learn how to use Supabase in your Svelte App.', - sidebar_label: 'Svelte', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/svelte-user-management). - - - -## Building the App - -Let's start building the Svelte app from scratch. - -### Initialize a Svelte app - -We can use the Vite Svelte TypeScript Template to initialize an app called `supabase-svelte`: - -```bash -npm create vite@latest supabase-svelte -- --template svelte-ts -cd supabase-svelte -npm install -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -VITE_SUPABASE_URL=YOUR_SUPABASE_URL -VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY -``` - -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed -on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```js title=src/supabaseClient.ts -import { createClient } from '@supabase/supabase-js' - -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY - -export const supabase = createClient(supabaseUrl, supabaseAnonKey) -``` - -And one optional step is to update the CSS file `src/app.css` to make the app look nice. -You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). - -### Set up a Login component - -Let's set up a Svelte component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```html title=src/lib/Auth.svelte - - -
-
-

Supabase + Svelte

-

Sign in via magic link with your email below

- -
- - -
-
- -
- -
-
-``` - -### Account page - -After a user is signed in we can allow them to edit their profile details and manage their account. -Let's create a new component for that called `Account.svelte`. - -```html title=src/lib/Account.svelte - - -
-
Email: {session.user.email}
-
- - -
-
- - -
-
- -
- -
-``` - -### Launch! - -Now that we have all the components in place, let's update `App.svelte`: - -```html title=src/App.svelte - - -
- {#if !session} - - {:else} - - {/if} -
-``` - -Once that's done, run this in a terminal window: - -```bash -npm run dev -``` - -And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. - -> ⚠️ WARNING: Svelte uses Vite and the default port is `5173`, Supabase uses `port 3000`. To change the redirection port for supabase go to: `Authentication > Settings` and change the `Site Url` to `localhost:5173` - -![Supabase Svelte](/docs/img/supabase-svelte-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```html title=src/lib/Avatar.svelte - - -
- {#if avatarUrl} {avatarUrl {:else} -
- {/if} -
- - - - -
-
-``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```html title=src/lib/Account.svelte - - -
- - - - - -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-sveltekit.mdx b/apps/docs/pages/guides/with-sveltekit.mdx deleted file mode 100644 index d8af92de291..00000000000 --- a/apps/docs/pages/guides/with-sveltekit.mdx +++ /dev/null @@ -1,446 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-sveltekit', - title: 'Quickstart: SvelteKit', - description: 'Learn how to use Supabase in your SvelteKit App.', - sidebar_label: 'SvelteKit', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/sveltekit-user-management). - - - -## Building the App - -Let's start building the Svelte app from scratch. - -### Initialize a Svelte app - -We can use the [SvelteKit Skeleton Project](https://kit.svelte.dev/docs) to initialize -an app called `supabase-sveltekit` (for this tutorial you do not need TypeScript, ESLint, Prettier, or Playwright): - -```bash -npm init svelte@next supabase-sveltekit -cd supabase-sveltekit -npm install -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the `SUPABASE_URL` and the `SUPABASE_KEY` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -PUBLIC_SUPABASE_URL="YOUR_SUPABASE_URL" -PUBLIC_SUPABASE_ANON_KEY="YOUR_SUPABASE_KEY" -``` - -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed -on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```js title=src/lib/supabaseClient.ts -import { createClient } from '@supabase/auth-helpers-sveltekit' -import { env } from '$env/dynamic/public' - -export const supabase = createClient(env.PUBLIC_SUPABASE_URL, env.PUBLIC_SUPABASE_ANON_KEY) -``` - -And one optional step is to update the CSS file `public/global.css` to make the app look nice. -You can find the full contents of this file [here](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). - -### Supabase Auth Helpers - -SvelteKit is a highly versatile framework offering pre-rendering at build time (SSG), server-side rendering at request time (SSR), API routes, and more. - -It can be challenging to authenticate your users in all these different environments, that's why we've created the Supabase Auth Helpers to make user management and data fetching within SvelteKit as easy as possible. - -Install the auth helpers for SvelteKit: - -```bash -npm install @supabase/auth-helpers-sveltekit -``` - -Update your `src/routes/+layout.svelte`: - -```html title=src/routes/+layout.svelte - - -
- -
-``` - -Create a new `src/routes/+layout.ts` file to handle the session on the client-side. - -```ts title=src/routes/+layout.ts -import type { LayoutLoad } from './$types' -import { getSupabase } from '@supabase/auth-helpers-sveltekit' - -export const load: LayoutLoad = async (event) => { - const { session } = await getSupabase(event) - return { session } -} -``` - -Create a new `src/routes/+layout.server.ts` file to handle the session on the server-side. - -```ts title=src/routes/+layout.server.ts -import type { LayoutServerLoad } from './$types' -import { getServerSession } from '@supabase/auth-helpers-sveltekit' - -export const load: LayoutServerLoad = async (event) => { - return { - session: await getServerSession(event), - } -} -``` - -Be sure to create `src/hooks.client.ts` and `src/hooks.server.ts` in order to get the auth helper started on the client and server-side. - -```ts title=src/hooks.client.ts -import '$lib/supabaseClient' -``` - -```ts title=src/hooks.server.ts -import '$lib/supabaseClient' -``` - -### Set up a Login component - -Let's set up a Svelte component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```html title=src/routes/Auth.svelte - - -
-
-

Supabase + SvelteKit

-

Sign in via magic link with your email below

-
- -
-
- -
-
-
-``` - -### Account component - -After a user is signed in, they need to be able to edit their profile details and manage their account. -Create a new `Account.svelte` component to handle this functionality. - -```html title=src/routes/Account.svelte - - -
-
- - -
-
- - -
-
- - -
- -
- -
- -
- -
-
-``` - -### Launch! - -Now that we have all the components in place, let's update `src/routes/+page.svelte`: - -```html title=src/routes/+page.svelte - - - - Supabase + SvelteKit - - - -{#if !$page.data.session} - -{:else} - -{/if} -``` - -Once that's done, run this in a terminal window: - -```bash -npm run dev -``` - -And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. - -![Supabase Svelte](/docs/img/supabase-svelte-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```html title=src/routes/Avatar.svelte - - -
- {#if avatarUrl} {avatarUrl {:else} -
- {/if} - -
- - -
-
-``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```html title=src/routes/Account.svelte - - -
- - - - - -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/guides/with-vue-3.mdx b/apps/docs/pages/guides/with-vue-3.mdx deleted file mode 100644 index a1ec84a8c92..00000000000 --- a/apps/docs/pages/guides/with-vue-3.mdx +++ /dev/null @@ -1,391 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'with-vue-3', - title: 'Quickstart: Vue 3', - description: 'Learn how to use Supabase in your Vue 3 App.', - sidebar_label: 'Vue 3', -} - - - -![Supabase User Management example](/docs/img/user-management-demo.png) - -### GitHub - -Should you get stuck while working through the guide, refer to [this repo](https://github.com/supabase/supabase/tree/master/examples/user-management/vue3-user-management). - - - -## Building the App - -Let's start building the Vue 3 app from scratch. - -### Initialize a Vue 3 app - -We can quickly use [Vite with Vue 3 Template](https://vitejs.dev/guide/#scaffolding-your-first-vite-project) to initialize -an app called `supabase-vue-3`: - -```bash -# npm 6.x -npm create vite@latest supabase-vue-3 --template vue - -# npm 7+, extra double-dash is needed: -npm create vite@latest supabase-vue-3 -- --template vue - -cd supabase-vue-3 -``` - -Then let's install the only additional dependency: [supabase-js](https://github.com/supabase/supabase-js) - -```bash -npm install @supabase/supabase-js -``` - -And finally we want to save the environment variables in a `.env`. -All we need are the API URL and the `anon` key that you copied [earlier](#get-the-api-keys). - -```bash title=.env -VITE_SUPABASE_URL=YOUR_SUPABASE_URL -VITE_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY -``` - -Now that we have the API credentials in place, let's create a helper file to initialize the Supabase client. These variables will be exposed -on the browser, and that's completely fine since we have [Row Level Security](/docs/guides/auth#row-level-security) enabled on our Database. - -```js title=src/supabase.js -import { createClient } from '@supabase/supabase-js' - -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY - -export const supabase = createClient(supabaseUrl, supabaseAnonKey) -``` - -Optionally, update [src/style.css](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/vue3-user-management/src/style.css) to style the app. - -### Set up a Login component - -Let's set up a Vue component to manage logins and sign ups. We'll use Magic Links, so users can sign in with their email without using passwords. - -```html title=/src/components/Auth.vue - - - -``` - -### Account page - -After a user is signed in we can allow them to edit their profile details and manage their account. -Let's create a new component for that called `Account.vue`. - -```html title=src/components/Account.vue - - - -``` - -### Launch! - -Now that we have all the components in place, let's update `App.vue`: - -```html title=src/App.vue - - - -``` - -Once that's done, run this in a terminal window: - -```bash -npm run dev -``` - -And then open the browser to [localhost:5173](http://localhost:5173) and you should see the completed app. - -![Supabase Vue 3](/docs/img/supabase-vue-3-demo.png) - -## Bonus: Profile photos - -Every Supabase project is configured with [Storage](/docs/guides/storage) for managing large files like photos and videos. - -### Create an upload widget - -Let's create an avatar for the user so that they can upload a profile photo. We can start by creating a new component: - -```html title=src/components/Avatar.vue - - - -``` - -### Add the new widget - -And then we can add the widget to the Account page: - -```html title=src/components/Account.vue - - - -``` - -## Next steps - -At this stage you have a fully functional application! - -- Got a question? [Ask here](https://github.com/supabase/supabase/discussions). -- Sign in: [app.supabase.com](https://app.supabase.com) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 41552e25f88..17066153535 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1600,4 +1600,246 @@ module.exports = [ source: '/docs/reference', destination: '/docs#reference-documentation', }, + + // docs 2.0, moving pages in to structure + { + permanent: true, + source: '/docs/guides/auth', + destination: '/guides/auth/overview', + }, + { + permanent: true, + source: '/guides/auth/auth-magic-link', + destination: '/guides/auth/passworldless-login/email-otp-magic-link', + }, + { + permanent: true, + source: '/guides/auth/auth-messagebird', + destination: '/guides/auth/passworldless-login/phone-sms-otp-messagebird', + }, + { + permanent: true, + source: '/guides/auth/auth-twilio', + destination: '/guides/auth/passworldless-login/phone-sms-otp-twilio', + }, + { + permanent: true, + source: '/guides/auth/auth-vonage', + destination: '/guides/auth/passworldless-login/phone-sms-otp-vonage', + }, + { + permanent: true, + source: '/guides/auth/with-google', + destination: '/guides/auth/social-login/with-google', + }, + { + permanent: true, + source: '/guides/auth/with-facebook', + destination: '/guides/auth/social-login/with-facebook', + }, + { + permanent: true, + source: '/guides/auth/with-apple', + destination: '/guides/auth/social-login/with-apple', + }, + { + permanent: true, + source: '/guides/auth/with-azure', + destination: '/guides/auth/social-login/with-azure', + }, + { + permanent: true, + source: '/guides/auth/with-twitter', + destination: '/guides/auth/social-login/with-twitter', + }, + { + permanent: true, + source: '/guides/auth/with-github', + destination: '/guides/auth/social-login/with-github', + }, + { + permanent: true, + source: '/guides/auth/with-gitlab', + destination: '/guides/auth/social-login/with-gitlab', + }, + { + permanent: true, + source: '/guides/auth/with-bitbucket', + destination: '/guides/auth/social-login/with-bitbucket', + }, + { + permanent: true, + source: '/guides/auth/with-discord', + destination: '/guides/auth/social-login/with-discord', + }, + { + permanent: true, + source: '/guides/auth/with-keycloak', + destination: '/guides/auth/social-login/with-keycloak', + }, + { + permanent: true, + source: '/guides/auth/with-linkedin', + destination: '/guides/auth/social-login/with-linkedin', + }, + { + permanent: true, + source: '/guides/auth/with-notion', + destination: '/guides/auth/social-login/with-notion', + }, + { + permanent: true, + source: '/guides/auth/with-slack', + destination: '/guides/auth/social-login/with-slack', + }, + { + permanent: true, + source: '/guides/auth/with-spotify', + destination: '/guides/auth/social-login/with-spotify', + }, + { + permanent: true, + source: '/guides/auth/with-twitch', + destination: '/guides/auth/social-login/with-twitch', + }, + { + permanent: true, + source: '/guides/auth/with-workos', + destination: '/guides/auth/social-login/with-workos', + }, + { + permanent: true, + source: '/guides/database', + destination: '/guides/database/overview', + }, + { + permanent: true, + source: '/architecture', + destination: '/guides/getting-started/architecture', + }, + { + permanent: true, + source: '/features', + destination: '/guides/getting-started/features', + }, + { + permanent: true, + source: '/guides/with-nextjs', + destination: '/guides/getting-started/tutorials/with-nextjs', + }, + { + permanent: true, + source: '/guides/with-react', + destination: '/guides/getting-started/tutorials/with-react', + }, + { + permanent: true, + source: '/guides/with-vue-3', + destination: '/guides/getting-started/tutorials/with-vue-3', + }, + { + permanent: true, + source: '/guides/with-nuxt-3', + destination: '/guides/getting-started/tutorials/with-nuxt-3', + }, + { + permanent: true, + source: '/guides/with-angular', + destination: '/guides/getting-started/tutorials/with-angular', + }, + { + permanent: true, + source: '/guides/with-redwoodjs', + destination: '/guides/getting-started/tutorials/with-redwoodjs', + }, + { + permanent: true, + source: '/guides/with-svelte', + destination: '/guides/getting-started/tutorials/with-svelte', + }, + { + permanent: true, + source: '/guides/with-sveltekit', + destination: '/guides/getting-started/tutorials/with-sveltekit', + }, + { + permanent: true, + source: '/guides/with-flutter', + destination: '/guides/getting-started/tutorials/with-flutter', + }, + { + permanent: true, + source: '/guides/with-expo', + destination: '/guides/getting-started/tutorials/with-expo', + }, + { + permanent: true, + source: '/guides/with-ionic-react', + destination: '/guides/getting-started/tutorials/with-ionic-react', + }, + { + permanent: true, + source: '/guides/with-ionic-vue', + destination: '/guides/getting-started/tutorials/with-ionic-vue', + }, + { + permanent: true, + source: '/guides/with-ionic-angular', + destination: '/guides/getting-started/tutorials/with-ionic-angular', + }, + { + permanent: true, + source: '/guides/examples', + destination: '/guides/resources/examples', + }, + { + permanent: true, + source: '/guides/examples', + destination: '/guides/resources/examples', + }, + { + permanent: true, + source: '/guides/hosting/overview', + destination: '/guides/resources/self-hosting', + }, + { + permanent: true, + source: '/guides/hosting/docker', + destination: '/guides/resources/self-hosting/docker', + }, + { + permanent: true, + source: '/guides/cli', + destination: '/guides/resources/supabase-cli', + }, + { + permanent: true, + source: '/guides/cli/local-development', + destination: '/guides/resources/supabase-cli/local-development', + }, + { + permanent: true, + source: '/guides/cli/managing-environments', + destination: '/guides/resources/supabase-cli/managing-environments', + }, + { + permanent: true, + source: '/guides/migrations/firebase-data', + destination: '/guides/resources/migrating-to-supabase/firebase-data', + }, + { + permanent: true, + source: '/guides/migrations/firebase-auth', + destination: '/guides/resources/migrating-to-supabase/firebase-auth', + }, + { + permanent: true, + source: '/guides/migrations/firebase-storage', + destination: '/guides/resources/migrating-to-supabase/firebase-storage', + }, + { + permanent: true, + source: '/guides/migrations/heroku', + destination: '/guides/resources/migrating-to-supabase/heroku', + }, ] From 5a1b7f352018553f2761b17076cc4c3a2830a86e Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 14 Dec 2022 02:46:23 +0800 Subject: [PATCH 07/18] Create DocSearch.tsx --- apps/docs/components/DocSearch.tsx | 211 +++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 apps/docs/components/DocSearch.tsx diff --git a/apps/docs/components/DocSearch.tsx b/apps/docs/components/DocSearch.tsx new file mode 100644 index 00000000000..d8bde374580 --- /dev/null +++ b/apps/docs/components/DocSearch.tsx @@ -0,0 +1,211 @@ +import { useState, useCallback, useRef, createContext, useContext, useEffect } from 'react' +import { createPortal } from 'react-dom' +import Link from 'next/link' +import Head from 'next/head' +import { useRouter } from 'next/router' +import { DocSearchModal } from '@docsearch/react' +import clsx from 'clsx' +import { useActionKey } from '~/hooks/useActionKey' + +// [Joshen] We're currently using this over Algolia search for the time being +// Refer to the comment in Navigation/AlgoliaSearch for more information about this + +const INDEX_NAME = process.env.NEXT_PUBLIC_ALGOLIA_INDEX_NAME +const API_KEY = process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY +const APP_ID = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID + +const SearchContext = createContext(null) + +export function SearchProvider({ children }: any) { + const router = useRouter() + const [isOpen, setIsOpen] = useState(false) + const [initialQuery, setInitialQuery] = useState(null) + + const onOpen = useCallback(() => { + setIsOpen(true) + }, [setIsOpen]) + + const onClose = useCallback(() => { + setIsOpen(false) + }, [setIsOpen]) + + const onInput = useCallback( + (e) => { + setIsOpen(true) + setInitialQuery(e.key) + }, + [setIsOpen, setInitialQuery] + ) + + useDocSearchKeyboardEvents({ + isOpen, + onOpen, + onClose, + // @ts-ignore + onInput, + }) + + return ( + <> + + + + + {children} + + {isOpen && + createPortal( + { + return `https://github.com/supabase/supabase/issues/new?title=Unable+to+search+docs+with+query:+${query}` + }} + hitComponent={Hit} + transformItems={(items) => { + return items.map((item, index) => { + // We transform the absolute URL into a relative URL to + // leverage Next's preloading. + const a = document.createElement('a') + a.href = item.url + + const hash = a.hash === '#content-wrapper' ? '' : a.hash + + return { + ...item, + url: `${a.pathname}${hash}`, + __is_result: () => true, + __is_parent: () => item.type === 'lvl1' && items.length > 1 && index === 0, + __is_child: () => + item.type !== 'lvl1' && + items.length > 1 && + items[0].type === 'lvl1' && + index !== 0, + __is_first: () => index === 1, + __is_last: () => index === items.length - 1 && index !== 0, + } + }) + }} + />, + document.body + )} + + ) +} + +// @ts-ignore +function Hit({ hit, children }) { + return ( + + + {children} + + + ) +} + +// @ts-ignore +export function SearchButton({ children, ...props }) { + let searchButtonRef = useRef() + let actionKey = useActionKey() + // @ts-ignore + let { onOpen, onInput } = useContext(SearchContext) + + useEffect(() => { + // @ts-ignore + function onKeyDown(event) { + if (searchButtonRef && searchButtonRef.current === document.activeElement && onInput) { + if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) { + onInput(event) + } + } + } + window.addEventListener('keydown', onKeyDown) + return () => { + window.removeEventListener('keydown', onKeyDown) + } + }, [onInput, searchButtonRef]) + + return ( + // @ts-ignore + + ) +} + +// @ts-ignore +function useDocSearchKeyboardEvents({ isOpen, onOpen, onClose }) { + useEffect(() => { + // @ts-ignore + function onKeyDown(event) { + function open() { + // We check that no other DocSearch modal is showing before opening + // another one. + if (!document.body.classList.contains('DocSearch--active')) { + onOpen() + } + } + + if ( + (event.keyCode === 27 && isOpen) || + (event.key === 'k' && (event.metaKey || event.ctrlKey)) || + (!isEditingContent(event) && event.key === '/' && !isOpen) + ) { + event.preventDefault() + + if (isOpen) { + onClose() + } else if (!document.body.classList.contains('DocSearch--active')) { + open() + } + } + } + + window.addEventListener('keydown', onKeyDown) + return () => { + window.removeEventListener('keydown', onKeyDown) + } + }, [isOpen, onOpen, onClose]) +} + +// @ts-ignore +function isEditingContent(event) { + let element = event.target + let tagName = element.tagName + return ( + element.isContentEditable || + tagName === 'INPUT' || + tagName === 'SELECT' || + tagName === 'TEXTAREA' + ) +} From 793f865d879f4c11b5c380b8f31307cd8590ed2c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 13 Dec 2022 15:52:31 -0330 Subject: [PATCH 08/18] Move files around --- .../Navigation/Navigation.constants.ts | 1 + .../NavigationMenu.constants.ts | 6 + apps/docs/pages/guides/auth/auth-twilio.mdx | 305 ------------------ .../getting-started}/architecture.mdx | 0 .../{ => guides/getting-started}/features.mdx | 0 5 files changed, 7 insertions(+), 305 deletions(-) delete mode 100644 apps/docs/pages/guides/auth/auth-twilio.mdx rename apps/docs/pages/{ => guides/getting-started}/architecture.mdx (100%) rename apps/docs/pages/{ => guides/getting-started}/features.mdx (100%) diff --git a/apps/docs/components/Navigation/Navigation.constants.ts b/apps/docs/components/Navigation/Navigation.constants.ts index a9750d6037c..bed28191d84 100644 --- a/apps/docs/components/Navigation/Navigation.constants.ts +++ b/apps/docs/components/Navigation/Navigation.constants.ts @@ -102,6 +102,7 @@ export const menuItems: NavMenu = { { name: 'Login with Twitch', url: '/guides/auth/auth-twitch', items: [] }, { name: 'Login with Twitter', url: '/guides/auth/auth-twitter', items: [] }, { name: 'Login with WorkOS', url: '/guides/auth/auth-workos', items: [] }, + { name: 'Login with Zoom', url: '/guides/auth/auth-zoom', items: [] }, { name: 'Phone Auth with Twilio', url: '/guides/auth/auth-twilio', items: [] }, { name: 'Phone Auth with Vonage', url: '/guides/auth/auth-vonage', items: [] }, { diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index af446fd584c..20d35da60ba 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -240,6 +240,12 @@ export const SocialLoginItems = [ url: '/guides/auth/social-login/auth-workos', items: [], }, + { + name: 'Zoom', + icon: '/docs/img/icons/zoom-icon', + url: '/guides/auth/social-login/auth-zoom', + items: [], + }, ] export const PhoneLoginsItems = [ diff --git a/apps/docs/pages/guides/auth/auth-twilio.mdx b/apps/docs/pages/guides/auth/auth-twilio.mdx deleted file mode 100644 index fa45a547970..00000000000 --- a/apps/docs/pages/guides/auth/auth-twilio.mdx +++ /dev/null @@ -1,305 +0,0 @@ -import Layout from '~/layouts/DefaultGuideLayout' - -export const meta = { - id: 'auth-twilio', - title: 'Phone Auth with Twilio', - description: 'How to set up and use Mobile OTP with Twilio and Supabase.', -} - -## Overview - -In this guide we'll show you how to authenticate your users with SMS based One-Time Password (OTP) tokens. - -There are two reasons to use Supabase SMS OTP tokens: - -- You want users to log in with mobile number + password, and the mobile number should be verified via SMS -- You want users to log in with mobile number ONLY (i.e. passwordless login) - -We'll cover: - -- [Finding your Twilio credentials](#finding-your-twilio-credentials) -- [Using OTP with password based logins](#using-otp-with-password-based-logins) -- [Using OTP as a passwordless sign-in mechanism](#using-otp-as-a-passwordless-sign-in-mechanism) - -What you'll need: - -- A Twilio account (sign up here: https://www.twilio.com/try-twilio) -- A Supabase project (create one here: https://app.supabase.com) -- A mobile phone capable of receiving SMS - -## Video - -
- -
- -## Steps - -### Finding your Twilio credentials - -Start by logging into your Twilio account and starting a new project: https://www.twilio.com/console/projects/create - -Give your project a name and verify the mobile number you'll be using to test with. This is the number that will be receiving the SMS OTPs. - -![Name your twilio project](/docs/img/guides/auth-twilio/1.png) -![verify your own phone number](/docs/img/guides/auth-twilio/2.png) - -Select 'SMS', 'Identity & Verification', and 'With code' as options on the welcome form. - -![Form Fields](/docs/img/guides/auth-twilio/3.png) - -When you're back on the [Twilio console screen](https://www.twilio.com/console), you need to scroll down and click 'Get a trial phone number' - this is the number that you'll be sending SMSs from. - -![Get a trial phone number](/docs/img/guides/auth-twilio/4.png) - -![Successful phone number](/docs/img/guides/auth-twilio/5.png) - -You should now be able to see all three values you'll need to get started: - -- Account SID -- Auth Token -- Sender Phone Number - -![All the credentials you'll need](/docs/img/guides/auth-twilio/6.png) - -Now go to the Auth > Settings page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/settings). - -You should see an option to enable Phone Signup: - -![Enable Phone Sign-Up](/docs/img/guides/auth-twilio/7.png) - -Toggle it on, and copy the 3 values over from the twilio dashboard. Click save. - -Note: for "Twilio Message Service SID" you can use the Sender Phone Number generated above. - -![Plug in Twilio credentials](/docs/img/guides/auth-twilio/8.png) - -Now the backend should be setup, we can proceed to add our client-side code! - -#### SMS custom template - -The SMS message sent to a phone containing an OTP code can be customized. This is useful if you need to mention a brand name or display a website address. - -Go to Auth > Templates page in the Supabase dashboard (https://app.supabase.com/project/YOUR-PROJECT-REF/auth/templates). - -Use the variable `.Code` in the template to display the OTP code. Here's an example in the SMS template. - -![example in the SMS template](/docs/img/guides/auth-twilio/9.png) - -### Using OTP with password based logins - -In this scenario we'll be using the user's mobile phone number and a corresponding password as an alternative to signing up with an email address. Note: please thoroughly consider potential security implications when signing up with a combination of phone number and password. Phone numbers are sometimes recycled by phone networks when users cancel their phone contracts or move countries, thereby granting access to the user's account to the subsequent owner of the phone number. In the near future Supabase will support multifactor authentication, which will mitigate this risk, but for now you may want to consider allowing your users to recover their account by some other means in an emergency. - -Using supabase-js on the client you'll want to use the same `signUp` method that you'd use for email based sign ups, but with the `phone` param instead of the `email param`: - - - - -```js -let { user, error } = await supabase.auth.signUp({ - phone: '+13334445555', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/signup' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555", - "password": "some-password" -}' -``` - - - - -The user will now receive an SMS with a 6-digit pin that you will need to receive from them within 60-seconds before they can login to their account. - -You should present a form to the user so they can input the 6 digit pin, then send it along with the phone number to `verifyOTP`: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '+13334445555', - token: '123456', - type: 'sms', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "+13334445555", - "token": "123456" -}' -``` - - - - -If successful the user will now be logged in and you should receive a valid session like: - -```json -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" -} -``` - -The access token can be sent in the Authorization header as a Bearer token for any CRUD operations on supabase-js. See our guide on [Row Level Security](/docs/guides/auth#row-level-security) for more info on restricting access on a user basis. - -Also now that the mobile has been verified, the user can use the number and password to sign in without needing to verify their number each time: - - - - -```js -let { user, error } = await supabase.auth.signInWithPassword({ - phone: '+13334445555', - password: 'some-password', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/token?grant_type=password' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555", - "password": "some-password" -}' -``` - - - - -### Using OTP as a passwordless sign-in mechanism - -In this scenario you are granting your user's the ability to login to their account without needing to set a password on their account, all they have to do to log in is verify their mobile each time using the OTP. - -In javascript we can use the `signIn` method with a single parameter: `phone` - - - - -```js -let { user, error } = await supabase.auth.signInWithOtp({ - phone: '+13334445555', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/otp' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "phone": "+13334445555" -}' -``` - - - - -The second step is the same as the previous section, you need to collect the 6-digit pin from the user and pass it along with their phone number to the verify method: - - - - -```js -let { session, error } = await supabase.auth.verifyOTP({ - phone: '+13334445555', - token: '123456', - type: 'sms', -}) -``` - - - - -```bash -curl -X POST 'https://cvwawazfelidkloqmbma.supabase.co/auth/v1/verify' \ --H "apikey: SUPABASE_KEY" \ --H "Content-Type: application/json" \ --d '{ - "type": "sms", - "phone": "+13334445555", - "token": "123456" -}' -``` - - - - -and the response should also be the same as above: - -```json -{ - "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhdXRoZW50aWNhdGVkIiwiZXhwIjoxNjI3MjkxNTc3LCJzdWIiOiJmYTA2NTQ1Zi1kYmI1LTQxY2EtYjk1NC1kOGUyOTg4YzcxOTEiLCJlbWFpbCI6IiIsInBob25lIjoiNjU4NzUyMjAyOSIsImFwcF9tZXRhZGF0YSI6eyJwcm92aWRlciI6InBob25lIn0sInVzZXJfbWV0YWRhdGEiOnt9LCJyb2xlIjoiYXV0aGVudGljYXRlZCJ9.1BqRi0NbS_yr1f6hnr4q3s1ylMR3c1vkiJ4e_N55dhM", - "token_type": "bearer", - "expires_in": 3600, - "refresh_token": "LSp8LglPPvf0DxGMSj-vaQ" -} -``` - -The user does not have a password therefore will need to sign in via this method each time they want to access your service. - -## Resources - -- [Twilio Signup](https://www.twilio.com/try-twilio) -- [Supabase Dashboard](https://app.supabase.com) -- [Supabase Row Level Security](/docs/guides/auth#row-level-security) - -export const Page = ({ children }) => - -export default Page diff --git a/apps/docs/pages/architecture.mdx b/apps/docs/pages/guides/getting-started/architecture.mdx similarity index 100% rename from apps/docs/pages/architecture.mdx rename to apps/docs/pages/guides/getting-started/architecture.mdx diff --git a/apps/docs/pages/features.mdx b/apps/docs/pages/guides/getting-started/features.mdx similarity index 100% rename from apps/docs/pages/features.mdx rename to apps/docs/pages/guides/getting-started/features.mdx From 87a6eb9d89aea0047cc4606385d67b51a60ab070 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 13 Dec 2022 16:58:54 -0330 Subject: [PATCH 09/18] Fix menu items --- .../NavigationMenu/NavigationMenu.constants.ts | 5 +++-- apps/docs/pages/guides/resources.mdx | 13 +++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 20d35da60ba..f931b7987ce 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -506,7 +506,8 @@ export const resources = { label: 'Resources', url: '/guides/resources', items: [ - { name: 'Examples', url: '/guides/resources/examples', items: [] }, + // removing until the examples page is reworked + // { name: 'Examples', url: '/guides/resources/examples', items: [] }, { name: 'Glossary', url: '/guides/resources/glossary', items: [] }, { name: 'Migrate to Supabase', @@ -549,7 +550,7 @@ export const resources = { }, { name: 'Managing Environments', - url: '/guides/cli/managing-environments', + url: '/guides/resources/supabase-cli/managing-environments', items: [], }, ], diff --git a/apps/docs/pages/guides/resources.mdx b/apps/docs/pages/guides/resources.mdx index 10d63ca5b5b..d8934c38ddc 100644 --- a/apps/docs/pages/guides/resources.mdx +++ b/apps/docs/pages/guides/resources.mdx @@ -93,12 +93,13 @@ export const meta = {
export const resources = [ - { - title: 'Examples', - hasLightIcon: true, - href: '/guides/resources/examples', - description: 'Official GitHub examples, curated content from the community, and more.', - }, + // removing until the examples page is reworked + // { + // title: 'Examples', + // hasLightIcon: true, + // href: '/guides/resources/examples', + // description: 'Official GitHub examples, curated content from the community, and more.', + // }, { title: 'Glossary', hasLightIcon: true, From 3aee0fafa9cab22bc9b7401b108c1160ac07cb0b Mon Sep 17 00:00:00 2001 From: dng Date: Tue, 13 Dec 2022 12:30:39 -0800 Subject: [PATCH 10/18] Fix docs build --- apps/docs/pages/guides/platform/network-restrictions.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/docs/pages/guides/platform/network-restrictions.mdx b/apps/docs/pages/guides/platform/network-restrictions.mdx index 3ff0854d1ab..7dfde6433cd 100644 --- a/apps/docs/pages/guides/platform/network-restrictions.mdx +++ b/apps/docs/pages/guides/platform/network-restrictions.mdx @@ -69,3 +69,7 @@ Restrictions applied successfully: true 1. Network Restrictions do not currently apply to APIs offered over HTTPS (e.g. PostgREST, Storage, Auth). 1. Network Restrictions should not be used if you require you need to connect to your Postgres database using Edge Functions. + +export const Page = ({ children }) => + +export default Page From 66faa01e44ac99c6d6c596d15d391cd2604bc8be Mon Sep 17 00:00:00 2001 From: dannykng Date: Tue, 13 Dec 2022 12:40:03 -0800 Subject: [PATCH 11/18] Add redirects for ref docs landing pages --- apps/www/lib/redirects.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 17066153535..0c6c7bf166a 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1842,4 +1842,39 @@ module.exports = [ source: '/guides/migrations/heroku', destination: '/guides/resources/migrating-to-supabase/heroku', }, + { + permanent: true, + source: '/docs/reference/javascript', + destination: '/docs/reference/javascript/introduction', + }, + { + permanent: true, + source: '/docs/reference/dart', + destination: '/docs/reference/dart/introduction', + }, + { + permanent: true, + source: '/docs/reference/cli', + destination: '/docs/reference/cli/introduction', + }, + { + permanent: true, + source: '/docs/reference/api', + destination: '/docs/reference/api/introduction', + }, + { + permanent: true, + source: '/docs/reference/auth', + destination: '/docs/reference/auth/introduction', + }, + { + permanent: true, + source: '/docs/reference/storage', + destination: '/docs/reference/storage/introduction', + }, + { + permanent: true, + source: '/docs/reference/realtime', + destination: '/docs/reference/realtime/introduction', + }, ] From 9d626bf998b942e04fd9ad54dfc2c5f89a9d3503 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 14 Dec 2022 12:08:44 +0800 Subject: [PATCH 12/18] update redirects --- apps/www/lib/redirects.js | 191 +++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 96 deletions(-) diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 0c6c7bf166a..265633adfe9 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1600,247 +1600,246 @@ module.exports = [ source: '/docs/reference', destination: '/docs#reference-documentation', }, - // docs 2.0, moving pages in to structure { permanent: true, source: '/docs/guides/auth', - destination: '/guides/auth/overview', + destination: '/docs/guides/auth/overview', }, { permanent: true, - source: '/guides/auth/auth-magic-link', - destination: '/guides/auth/passworldless-login/email-otp-magic-link', + source: '/docs/guides/auth/auth-magic-link', + destination: '/docs/guides/auth/passworldless-login/email-otp-magic-link', }, { permanent: true, - source: '/guides/auth/auth-messagebird', - destination: '/guides/auth/passworldless-login/phone-sms-otp-messagebird', + source: '/docs/guides/auth/auth-messagebird', + destination: '/docs/guides/auth/passworldless-login/phone-sms-otp-messagebird', }, { permanent: true, - source: '/guides/auth/auth-twilio', - destination: '/guides/auth/passworldless-login/phone-sms-otp-twilio', + source: '/docs/guides/auth/auth-twilio', + destination: '/docs/guides/auth/passworldless-login/phone-sms-otp-twilio', }, { permanent: true, - source: '/guides/auth/auth-vonage', - destination: '/guides/auth/passworldless-login/phone-sms-otp-vonage', + source: '/docs/guides/auth/auth-vonage', + destination: '/docs/guides/auth/passworldless-login/phone-sms-otp-vonage', }, { permanent: true, - source: '/guides/auth/with-google', - destination: '/guides/auth/social-login/with-google', + source: '/docs/guides/auth/with-google', + destination: '/docs/guides/auth/social-login/with-google', }, { permanent: true, - source: '/guides/auth/with-facebook', - destination: '/guides/auth/social-login/with-facebook', + source: '/docs/guides/auth/with-facebook', + destination: '/docs/guides/auth/social-login/with-facebook', }, { permanent: true, - source: '/guides/auth/with-apple', - destination: '/guides/auth/social-login/with-apple', + source: '/docs/guides/auth/with-apple', + destination: '/docs/guides/auth/social-login/with-apple', }, { permanent: true, - source: '/guides/auth/with-azure', - destination: '/guides/auth/social-login/with-azure', + source: '/docs/guides/auth/with-azure', + destination: '/docs/guides/auth/social-login/with-azure', }, { permanent: true, - source: '/guides/auth/with-twitter', - destination: '/guides/auth/social-login/with-twitter', + source: '/docs/guides/auth/with-twitter', + destination: '/docs/guides/auth/social-login/with-twitter', }, { permanent: true, - source: '/guides/auth/with-github', - destination: '/guides/auth/social-login/with-github', + source: '/docs/guides/auth/with-github', + destination: '/docs/guides/auth/social-login/with-github', }, { permanent: true, - source: '/guides/auth/with-gitlab', - destination: '/guides/auth/social-login/with-gitlab', + source: '/docs/guides/auth/with-gitlab', + destination: '/docs/guides/auth/social-login/with-gitlab', }, { permanent: true, - source: '/guides/auth/with-bitbucket', - destination: '/guides/auth/social-login/with-bitbucket', + source: '/docs/guides/auth/with-bitbucket', + destination: '/docs/guides/auth/social-login/with-bitbucket', }, { permanent: true, - source: '/guides/auth/with-discord', - destination: '/guides/auth/social-login/with-discord', + source: '/docs/guides/auth/with-discord', + destination: '/docs/guides/auth/social-login/with-discord', }, { permanent: true, - source: '/guides/auth/with-keycloak', - destination: '/guides/auth/social-login/with-keycloak', + source: '/docs/guides/auth/with-keycloak', + destination: '/docs/guides/auth/social-login/with-keycloak', }, { permanent: true, - source: '/guides/auth/with-linkedin', - destination: '/guides/auth/social-login/with-linkedin', + source: '/docs/guides/auth/with-linkedin', + destination: '/docs/guides/auth/social-login/with-linkedin', }, { permanent: true, - source: '/guides/auth/with-notion', - destination: '/guides/auth/social-login/with-notion', + source: '/docs/guides/auth/with-notion', + destination: '/docs/guides/auth/social-login/with-notion', }, { permanent: true, - source: '/guides/auth/with-slack', - destination: '/guides/auth/social-login/with-slack', + source: '/docs/guides/auth/with-slack', + destination: '/docs/guides/auth/social-login/with-slack', }, { permanent: true, - source: '/guides/auth/with-spotify', - destination: '/guides/auth/social-login/with-spotify', + source: '/docs/guides/auth/with-spotify', + destination: '/docs/guides/auth/social-login/with-spotify', }, { permanent: true, - source: '/guides/auth/with-twitch', - destination: '/guides/auth/social-login/with-twitch', + source: '/docs/guides/auth/with-twitch', + destination: '/docs/guides/auth/social-login/with-twitch', }, { permanent: true, - source: '/guides/auth/with-workos', - destination: '/guides/auth/social-login/with-workos', + source: '/docs/guides/auth/with-workos', + destination: '/docs/guides/auth/social-login/with-workos', }, { permanent: true, - source: '/guides/database', - destination: '/guides/database/overview', + source: '/docs/guides/database', + destination: '/docs/guides/database/overview', }, { permanent: true, - source: '/architecture', - destination: '/guides/getting-started/architecture', + source: '/docs/architecture', + destination: '/docs/guides/getting-started/architecture', }, { permanent: true, - source: '/features', - destination: '/guides/getting-started/features', + source: '/docs/features', + destination: '/docs/guides/getting-started/features', }, { permanent: true, - source: '/guides/with-nextjs', - destination: '/guides/getting-started/tutorials/with-nextjs', + source: '/docs/guides/with-nextjs', + destination: '/docs/guides/getting-started/tutorials/with-nextjs', }, { permanent: true, - source: '/guides/with-react', - destination: '/guides/getting-started/tutorials/with-react', + source: '/docs/guides/with-react', + destination: '/docs/guides/getting-started/tutorials/with-react', }, { permanent: true, - source: '/guides/with-vue-3', - destination: '/guides/getting-started/tutorials/with-vue-3', + source: '/docs/guides/with-vue-3', + destination: '/docs/guides/getting-started/tutorials/with-vue-3', }, { permanent: true, - source: '/guides/with-nuxt-3', - destination: '/guides/getting-started/tutorials/with-nuxt-3', + source: '/docs/guides/with-nuxt-3', + destination: '/docs/guides/getting-started/tutorials/with-nuxt-3', }, { permanent: true, - source: '/guides/with-angular', - destination: '/guides/getting-started/tutorials/with-angular', + source: '/docs/guides/with-angular', + destination: '/docs/guides/getting-started/tutorials/with-angular', }, { permanent: true, - source: '/guides/with-redwoodjs', - destination: '/guides/getting-started/tutorials/with-redwoodjs', + source: '/docs/guides/with-redwoodjs', + destination: '/docs/guides/getting-started/tutorials/with-redwoodjs', }, { permanent: true, - source: '/guides/with-svelte', - destination: '/guides/getting-started/tutorials/with-svelte', + source: '/docs/guides/with-svelte', + destination: '/docs/guides/getting-started/tutorials/with-svelte', }, { permanent: true, - source: '/guides/with-sveltekit', - destination: '/guides/getting-started/tutorials/with-sveltekit', + source: '/docs/guides/with-sveltekit', + destination: '/docs/guides/getting-started/tutorials/with-sveltekit', }, { permanent: true, - source: '/guides/with-flutter', - destination: '/guides/getting-started/tutorials/with-flutter', + source: '/docs/guides/with-flutter', + destination: '/docs/guides/getting-started/tutorials/with-flutter', }, { permanent: true, - source: '/guides/with-expo', - destination: '/guides/getting-started/tutorials/with-expo', + source: '/docs/guides/with-expo', + destination: '/docs/guides/getting-started/tutorials/with-expo', }, { permanent: true, - source: '/guides/with-ionic-react', - destination: '/guides/getting-started/tutorials/with-ionic-react', + source: '/docs/guides/with-ionic-react', + destination: '/docs/guides/getting-started/tutorials/with-ionic-react', }, { permanent: true, - source: '/guides/with-ionic-vue', - destination: '/guides/getting-started/tutorials/with-ionic-vue', + source: '/docs/guides/with-ionic-vue', + destination: '/docs/guides/getting-started/tutorials/with-ionic-vue', }, { permanent: true, - source: '/guides/with-ionic-angular', - destination: '/guides/getting-started/tutorials/with-ionic-angular', + source: '/docs/guides/with-ionic-angular', + destination: '/docs/guides/getting-started/tutorials/with-ionic-angular', }, { permanent: true, - source: '/guides/examples', - destination: '/guides/resources/examples', + source: '/docs/guides/examples', + destination: '/docs/guides/resources/examples', }, { permanent: true, - source: '/guides/examples', - destination: '/guides/resources/examples', + source: '/docs/guides/examples', + destination: '/docs/guides/resources/examples', }, { permanent: true, - source: '/guides/hosting/overview', - destination: '/guides/resources/self-hosting', + source: '/docs/guides/hosting/overview', + destination: '/docs/guides/resources/self-hosting', }, { permanent: true, - source: '/guides/hosting/docker', - destination: '/guides/resources/self-hosting/docker', + source: '/docs/guides/hosting/docker', + destination: '/docs/guides/resources/self-hosting/docker', }, { permanent: true, - source: '/guides/cli', - destination: '/guides/resources/supabase-cli', + source: '/docs/guides/cli', + destination: '/docs/guides/resources/supabase-cli', }, { permanent: true, - source: '/guides/cli/local-development', - destination: '/guides/resources/supabase-cli/local-development', + source: '/docs/guides/cli/local-development', + destination: '/docs/guides/resources/supabase-cli/local-development', }, { permanent: true, - source: '/guides/cli/managing-environments', - destination: '/guides/resources/supabase-cli/managing-environments', + source: '/docs/guides/cli/managing-environments', + destination: '/docs/guides/resources/supabase-cli/managing-environments', }, { permanent: true, - source: '/guides/migrations/firebase-data', - destination: '/guides/resources/migrating-to-supabase/firebase-data', + source: '/docs/guides/migrations/firebase-data', + destination: '/docs/guides/resources/migrating-to-supabase/firebase-data', }, { permanent: true, - source: '/guides/migrations/firebase-auth', - destination: '/guides/resources/migrating-to-supabase/firebase-auth', + source: '/docs/guides/migrations/firebase-auth', + destination: '/docs/guides/resources/migrating-to-supabase/firebase-auth', }, { permanent: true, - source: '/guides/migrations/firebase-storage', - destination: '/guides/resources/migrating-to-supabase/firebase-storage', + source: '/docs/guides/migrations/firebase-storage', + destination: '/docs/guides/resources/migrating-to-supabase/firebase-storage', }, { permanent: true, - source: '/guides/migrations/heroku', - destination: '/guides/resources/migrating-to-supabase/heroku', + source: '/docs/guides/migrations/heroku', + destination: '/docs/guides/resources/migrating-to-supabase/heroku', }, { permanent: true, From 602935b5940ea2423feab2798d2b9662a47907fa Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 14 Dec 2022 12:09:32 +0800 Subject: [PATCH 13/18] Update redirects.js --- apps/www/lib/redirects.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/www/lib/redirects.js b/apps/www/lib/redirects.js index 265633adfe9..400fbd5abb8 100644 --- a/apps/www/lib/redirects.js +++ b/apps/www/lib/redirects.js @@ -1570,6 +1570,7 @@ module.exports = [ source: '/projects', destination: 'https://app.supabase.com/projects', }, + // START docs 2.0, moving pages in to structure { permanent: true, source: '/docs/oss', @@ -1600,7 +1601,6 @@ module.exports = [ source: '/docs/reference', destination: '/docs#reference-documentation', }, - // docs 2.0, moving pages in to structure { permanent: true, source: '/docs/guides/auth', @@ -1876,4 +1876,5 @@ module.exports = [ source: '/docs/reference/realtime', destination: '/docs/reference/realtime/introduction', }, + // END of docs 2.0, moving pages in to structure ] From 5e9487a322cbcfc33b14bb5034928506eae302f7 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 14 Dec 2022 12:02:41 +0700 Subject: [PATCH 14/18] Add info message for PITR add on in subscription page for projects in ap-northeast-2 --- .../Billing/AddOns/PITRDurationSelection.tsx | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/studio/components/interfaces/Billing/AddOns/PITRDurationSelection.tsx b/studio/components/interfaces/Billing/AddOns/PITRDurationSelection.tsx index 7f3a6f2e9ed..88609d60601 100644 --- a/studio/components/interfaces/Billing/AddOns/PITRDurationSelection.tsx +++ b/studio/components/interfaces/Billing/AddOns/PITRDurationSelection.tsx @@ -1,14 +1,13 @@ +import Link from 'next/link' import { FC } from 'react' -import { useRouter } from 'next/router' import { Badge, IconAlertCircle, Radio, Button } from 'ui' -import { useFlag, useStore } from 'hooks' +import { useFlag, useParams, useStore } from 'hooks' import { SubscriptionAddon } from './AddOns.types' import { getProductPrice } from '../Billing.utils' import DisabledWarningDueToIncident from 'components/ui/DisabledWarningDueToIncident' import InformationBox from 'components/ui/InformationBox' import { getSemanticVersion } from './AddOns.utils' -import Link from 'next/link' interface Props { pitrDurationOptions: SubscriptionAddon[] @@ -24,12 +23,14 @@ const PITRDurationSelection: FC = ({ onSelectOption, }) => { const { ui } = useStore() - const router = useRouter() - const { ref } = router.query + const { ref } = useParams() const addonUpdateDisabled = useFlag('disableProjectCreationAndUpdate') + const projectRegion = ui.selectedProject?.region ?? '' + // Only projects of version greater than supabase-postgrest-14.1.0.44 can use PITR - const canUsePITR = getSemanticVersion(ui.selectedProject?.dbVersion ?? '') >= 141044 + const sufficientPgVersion = getSemanticVersion(ui.selectedProject?.dbVersion ?? '') >= 141044 + const isDisabledForRegion = ['ap-northeast-2'].includes(projectRegion) return (
@@ -41,7 +42,7 @@ const PITRDurationSelection: FC = ({

Restore your database from a specific point in time

- {canUsePITR && !currentPitrDuration?.isLocked && ( + {sufficientPgVersion && !isDisabledForRegion && !currentPitrDuration?.isLocked && (
} @@ -53,7 +54,7 @@ const PITRDurationSelection: FC = ({
{addonUpdateDisabled ? ( - ) : !canUsePITR ? ( + ) : !sufficientPgVersion ? ( = ({
+ ) : isDisabledForRegion ? ( + +

+ Reach out to us if you're interested! We'll see what we can do for you. +

+ + + + + +
+ } + icon={} + /> ) : ( {pitrDurationOptions.map((option: any) => { From f24a8f523f65e284732db401ee8a151476570a91 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 14 Dec 2022 12:10:47 +0700 Subject: [PATCH 15/18] Only load vault store if vault extension is enabled --- .../layouts/TableEditorLayout/TableEditorLayout.tsx | 10 +++++++++- studio/pages/project/[ref]/settings/vault/keys.tsx | 6 ++++-- studio/pages/project/[ref]/settings/vault/secrets.tsx | 6 ++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx index 8816485b1a9..26275516e01 100644 --- a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx +++ b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx @@ -35,6 +35,9 @@ const TableEditorLayout: FC = ({ const [loaded, setLoaded] = useState(isInitialized) const canReadTables = checkPermissions(PermissionAction.TENANT_SQL_ADMIN_READ, 'tables') + const vaultExtension = meta.extensions.byId('supabase_vault') + const isEnabled = vaultExtension !== undefined && vaultExtension?.installed_version !== null + useEffect(() => { if (ui.selectedProject?.ref) { meta.schemas.load() @@ -43,10 +46,15 @@ const TableEditorLayout: FC = ({ meta.policies.load() meta.publications.load() meta.extensions.load() - vault.load() } }, [ui.selectedProject?.ref]) + useEffect(() => { + if (isEnabled) { + vault.load() + } + }, [ui.selectedProject?.ref, isEnabled]) + useEffect(() => { let cancel = false if (!isLoading && !loaded) { diff --git a/studio/pages/project/[ref]/settings/vault/keys.tsx b/studio/pages/project/[ref]/settings/vault/keys.tsx index 3fed0798173..3e1b3178e18 100644 --- a/studio/pages/project/[ref]/settings/vault/keys.tsx +++ b/studio/pages/project/[ref]/settings/vault/keys.tsx @@ -18,8 +18,10 @@ const VaultSettingsSecrets: NextPageWithLayout = () => { const isEnabled = vaultExtension !== undefined && vaultExtension?.installed_version !== null useEffect(() => { - vault.load() - }, []) + if (isEnabled) { + vault.load() + } + }, [isEnabled]) return (
diff --git a/studio/pages/project/[ref]/settings/vault/secrets.tsx b/studio/pages/project/[ref]/settings/vault/secrets.tsx index 995cdd0b9de..c60a79a88df 100644 --- a/studio/pages/project/[ref]/settings/vault/secrets.tsx +++ b/studio/pages/project/[ref]/settings/vault/secrets.tsx @@ -18,8 +18,10 @@ const VaultSettingsSecrets: NextPageWithLayout = () => { const isEnabled = vaultExtension !== undefined && vaultExtension?.installed_version !== null useEffect(() => { - vault.load() - }, []) + if (isEnabled) { + vault.load() + } + }, [isEnabled]) return (
From dd3072a10c0b6c3c608d0d4561906c842d4dce41 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 14 Dec 2022 12:34:20 +0700 Subject: [PATCH 16/18] Refresh db connection string after resetting db password from UI --- studio/pages/project/[ref]/settings/database.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/studio/pages/project/[ref]/settings/database.tsx b/studio/pages/project/[ref]/settings/database.tsx index 56850b1d5d1..386132dec63 100644 --- a/studio/pages/project/[ref]/settings/database.tsx +++ b/studio/pages/project/[ref]/settings/database.tsx @@ -10,7 +10,7 @@ import { Input, Button, IconDownload, Tabs, Modal } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' import { NextPageWithLayout } from 'types' -import { checkPermissions, useFlag, useStore } from 'hooks' +import { checkPermissions, useFlag, useParams, useStore } from 'hooks' import { get, patch } from 'lib/common/fetch' import { pluckObjectFields, passwordStrength } from 'lib/helpers' import { API_URL, DEFAULT_MINIMUM_PASSWORD_STRENGTH } from 'lib/constants' @@ -39,8 +39,8 @@ ProjectSettings.getLayout = (page) => {page} = () => { - const { ui } = useStore() - const projectRef = ui.selectedProject?.ref + const { ui, app, meta } = useStore() + const { ref } = useParams() const canResetDbPassword = checkPermissions(PermissionAction.UPDATE, 'projects') @@ -83,10 +83,13 @@ const ResetDbPassword: FC = () => { } const confirmResetDbPass = async () => { + if (!ref) return + if (passwordStrengthScore >= DEFAULT_MINIMUM_PASSWORD_STRENGTH) { setIsUpdatingPassword(true) - const res = await patch(`${API_URL}/projects/${projectRef}/db-password`, { password }) + const res = await patch(`${API_URL}/projects/${ref}/db-password`, { password }) if (!res.error) { + await app.projects.fetchDetail(ref, (project) => meta.setProjectDetails(project)) ui.setNotification({ category: 'success', message: res.message }) setShowResetDbPass(false) } else { From b7eff3d5a6ed81677ae7fade8087781f8f8cbcce Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Wed, 14 Dec 2022 14:30:30 +0800 Subject: [PATCH 17/18] chore: separate release job for arm and x86 runners (#10951) * chore: separate release job for arm and x86 runners * chore: add missing step dependency * chore: update sha tag * chore: fix image name --- .github/workflows/mirror.yml | 7 +- .github/workflows/publish_image.yml | 121 ++++++++++++++++++++++------ 2 files changed, 101 insertions(+), 27 deletions(-) diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index bacadccbf1e..0a4d1b1fd57 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -1,10 +1,15 @@ name: Mirror Image on: + workflow_call: + inputs: + version: + required: true + type: string workflow_dispatch: inputs: version: - description: "Image tag" + description: 'Image tag' required: true type: string diff --git a/.github/workflows/publish_image.yml b/.github/workflows/publish_image.yml index fb21fd49d43..f57fd2515d3 100644 --- a/.github/workflows/publish_image.yml +++ b/.github/workflows/publish_image.yml @@ -14,29 +14,39 @@ on: type: string jobs: - publish: + settings: runs-on: ubuntu-latest - permissions: - contents: read - packages: write + outputs: + image_version: ${{ steps.meta.outputs.version }} steps: - id: meta uses: docker/metadata-action@v4 with: images: | supabase/studio - public.ecr.aws/supabase/studio - ghcr.io/supabase/studio flavor: | latest=false tags: | type=ref,event=tag - type=sha,prefix={{date 'YYYYMMDD'}},enable=${{ github.ref_type == 'branch' }} - type=raw,value=${{ inputs.version }},enable=${{ github.event_name != 'push' }} + type=sha,prefix={{date 'YYYYMMDD'}}-,enable=${{ github.event_name == 'push' && github.ref_type == 'branch' }} + type=raw,value=${{ inputs.version }},enable=${{ github.event_name == 'workflow_dispatch' }} - - uses: docker/setup-qemu-action@v2 + release_x86: + needs: settings + runs-on: ubuntu-latest + timeout-minutes: 120 + env: + arch: amd64 + outputs: + image_digest: ${{ steps.build.outputs.digest }} + steps: + - id: meta + uses: docker/metadata-action@v4 with: - platforms: amd64,arm64 + images: | + supabase/studio + tags: | + type=raw,value=${{ needs.settings.outputs.image_version }}_${{ env.arch }} - uses: docker/setup-buildx-action@v2 @@ -46,27 +56,86 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Login to ECR - uses: docker/login-action@v2 - with: - registry: public.ecr.aws - username: ${{ secrets.PROD_ACCESS_KEY_ID }} - password: ${{ secrets.PROD_SECRET_ACCESS_KEY }} - - - name: Login to GHCR - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - uses: docker/build-push-action@v3 + - id: build + uses: docker/build-push-action@v3 with: push: true context: '{{defaultContext}}' file: studio/Dockerfile target: production - platforms: linux/amd64,linux/arm64 + platforms: linux/${{ env.arch }} tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max + + release_arm: + needs: settings + runs-on: arm-runner + timeout-minutes: 120 + env: + arch: arm64 + outputs: + image_digest: ${{ steps.build.outputs.digest }} + steps: + - uses: actions/checkout@v3 + + - id: meta + uses: docker/metadata-action@v4 + with: + images: | + supabase/studio + tags: | + type=raw,value=${{ needs.settings.outputs.image_version }}_${{ env.arch }} + + - uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - uses: docker/setup-buildx-action@v2 + with: + driver: docker + driver-opts: | + image=moby/buildkit:master + network=host + + - id: build + uses: docker/build-push-action@v3 + with: + push: true + context: . + file: studio/Dockerfile + target: production + platforms: linux/${{ env.arch }} + tags: ${{ steps.meta.outputs.tags }} + no-cache: true + + merge_manifest: + needs: + - settings + - release_x86 + - release_arm + runs-on: ubuntu-latest + steps: + - uses: docker/setup-buildx-action@v2 + + - uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Merge multi-arch manifests + run: | + docker buildx imagetools create -t supabase/studio:${{ needs.settings.outputs.image_version }} \ + supabase/studio@${{ needs.release_x86.outputs.image_digest }} \ + supabase/studio@${{ needs.release_arm.outputs.image_digest }} + + publish: + needs: + - settings + - merge_manifest + # Call workflow explicitly because events from actions cannot trigger more actions + uses: ./.github/workflows/mirror.yml + with: + version: ${{ needs.settings.outputs.image_version }} + secrets: inherit From 336023b77e4b829f215056d82fb9dfe27161179a Mon Sep 17 00:00:00 2001 From: Stojan Dimitrovski Date: Wed, 14 Dec 2022 07:47:06 +0100 Subject: [PATCH 18/18] feat: add sso (enterprise login) docs under platform (#10924) * feat: add sso (enterprise login) docs under platform * Update apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/enable-sso.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/enable-sso.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/enable-sso.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/enable-sso.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/sso-with-okta.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/sso-with-okta.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/sso-with-okta.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/sso-with-okta.mdx Co-authored-by: dng * Update apps/docs/pages/guides/platform/sso/sso-with-okta.mdx Co-authored-by: dng * Update headings and copy * Rename files * remove ids in meta (jonny) * add access control section * update sso guides * update magiclink in ref docs Co-authored-by: Kang Ming Co-authored-by: dng --- .../NavigationMenu.constants.ts | 19 +++ .../email-otp-magic-link.mdx | 3 + apps/docs/pages/guides/platform.mdx | 45 +----- .../pages/guides/platform/access-control.mdx | 85 ++++++++++++ apps/docs/pages/guides/platform/sso.mdx | 54 ++++++++ apps/docs/pages/guides/platform/sso/azure.mdx | 128 ++++++++++++++++++ .../docs/pages/guides/platform/sso/gsuite.mdx | 123 +++++++++++++++++ apps/docs/pages/guides/platform/sso/okta.mdx | 112 +++++++++++++++ apps/docs/public/img/sso-azure-step-01.png | Bin 0 -> 264059 bytes apps/docs/public/img/sso-azure-step-02.png | Bin 0 -> 340685 bytes apps/docs/public/img/sso-azure-step-03.png | Bin 0 -> 369098 bytes apps/docs/public/img/sso-azure-step-04.png | Bin 0 -> 566769 bytes apps/docs/public/img/sso-azure-step-05.png | Bin 0 -> 446990 bytes apps/docs/public/img/sso-azure-step-06-1.png | Bin 0 -> 451496 bytes apps/docs/public/img/sso-azure-step-06-2.png | Bin 0 -> 713124 bytes apps/docs/public/img/sso-azure-step-07.png | Bin 0 -> 147791 bytes apps/docs/public/img/sso-gsuite-step-01.png | Bin 0 -> 211469 bytes apps/docs/public/img/sso-gsuite-step-02.png | Bin 0 -> 379380 bytes apps/docs/public/img/sso-gsuite-step-03.png | Bin 0 -> 117814 bytes apps/docs/public/img/sso-gsuite-step-04.png | Bin 0 -> 257362 bytes apps/docs/public/img/sso-gsuite-step-05.png | Bin 0 -> 176473 bytes apps/docs/public/img/sso-gsuite-step-06.png | Bin 0 -> 192091 bytes apps/docs/public/img/sso-gsuite-step-08.png | Bin 0 -> 309449 bytes apps/docs/public/img/sso-okta-step-01.png | Bin 0 -> 235090 bytes apps/docs/public/img/sso-okta-step-02.png | Bin 0 -> 409614 bytes apps/docs/public/img/sso-okta-step-03.png | Bin 0 -> 236351 bytes apps/docs/public/img/sso-okta-step-04.png | Bin 0 -> 454932 bytes apps/docs/public/img/sso-okta-step-05.png | Bin 0 -> 275381 bytes apps/docs/public/img/sso-okta-step-06.png | Bin 0 -> 581613 bytes spec/supabase_js_v2.yml | 4 + 30 files changed, 529 insertions(+), 44 deletions(-) create mode 100644 apps/docs/pages/guides/platform/access-control.mdx create mode 100644 apps/docs/pages/guides/platform/sso.mdx create mode 100644 apps/docs/pages/guides/platform/sso/azure.mdx create mode 100644 apps/docs/pages/guides/platform/sso/gsuite.mdx create mode 100644 apps/docs/pages/guides/platform/sso/okta.mdx create mode 100644 apps/docs/public/img/sso-azure-step-01.png create mode 100644 apps/docs/public/img/sso-azure-step-02.png create mode 100644 apps/docs/public/img/sso-azure-step-03.png create mode 100644 apps/docs/public/img/sso-azure-step-04.png create mode 100644 apps/docs/public/img/sso-azure-step-05.png create mode 100644 apps/docs/public/img/sso-azure-step-06-1.png create mode 100644 apps/docs/public/img/sso-azure-step-06-2.png create mode 100644 apps/docs/public/img/sso-azure-step-07.png create mode 100644 apps/docs/public/img/sso-gsuite-step-01.png create mode 100644 apps/docs/public/img/sso-gsuite-step-02.png create mode 100644 apps/docs/public/img/sso-gsuite-step-03.png create mode 100644 apps/docs/public/img/sso-gsuite-step-04.png create mode 100644 apps/docs/public/img/sso-gsuite-step-05.png create mode 100644 apps/docs/public/img/sso-gsuite-step-06.png create mode 100644 apps/docs/public/img/sso-gsuite-step-08.png create mode 100644 apps/docs/public/img/sso-okta-step-01.png create mode 100644 apps/docs/public/img/sso-okta-step-02.png create mode 100644 apps/docs/public/img/sso-okta-step-03.png create mode 100644 apps/docs/public/img/sso-okta-step-04.png create mode 100644 apps/docs/public/img/sso-okta-step-05.png create mode 100644 apps/docs/public/img/sso-okta-step-06.png diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 2261a910b0b..f39acf544da 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -481,6 +481,7 @@ export const platform = { name: 'Platform Management', url: undefined, items: [ + { name: 'Access Control', url: '/guides/platform/access-control', items: [] }, { name: 'Database Usage', url: '/guides/platform/database-usage', items: [] }, { name: 'Logging', url: '/guides/platform/logs', items: [] }, { name: 'Metrics', url: '/guides/platform/metrics', items: [] }, @@ -494,6 +495,24 @@ export const platform = { { name: 'Permissions', url: '/guides/platform/permissions', items: [] }, ], }, + { + name: 'Single sign-on', + url: undefined, + items: [ + { + name: 'Enable SSO for your organization', + url: '/guides/platform/sso', + items: [], + }, + { name: 'SSO with Azure AD', url: '/guides/platform/sso/azure', items: [] }, + { + name: 'SSO with Google Workspace', + url: '/guides/platform/sso/gsuite', + items: [], + }, + { name: 'SSO with Okta', url: '/guides/platform/sso/okta', items: [] }, + ], + }, { name: 'Go-live Checklist', url: undefined, diff --git a/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx b/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx index 181954436ae..da78296f4ba 100644 --- a/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx +++ b/apps/docs/pages/guides/auth/passwordless-login/email-otp-magic-link.mdx @@ -37,6 +37,9 @@ When your user signs in, call [signInWithOtp()](/docs/reference/javascript/auth- async function signInWithEmail() { const { data, error } = await supabase.auth.signInWithOtp({ email: 'example@email.com', + options: { + emailRedirectTo: 'https://example.com/welcome', + }, }) } ``` diff --git a/apps/docs/pages/guides/platform.mdx b/apps/docs/pages/guides/platform.mdx index a713064e779..8f734fdcd77 100644 --- a/apps/docs/pages/guides/platform.mdx +++ b/apps/docs/pages/guides/platform.mdx @@ -25,50 +25,7 @@ Each project on Supabase comes with: ## Organizations Organizations are a way to group your projects. Each organization can be configured with different team members and billing settings. - -## Manage team members - -You can invite your team members into your organizations to collaborate on projects. - - - -You can also assign roles to your team members with different access levels. The table below shows the corresponding permissions for each available role in the Dashboard. - -| Permissions | Owner | Administrator | Developer | -| ------------------------ | ----- | ------------- | --------- | -| **Organization** | -| Change organization name | ✅ | | | -| Delete organization | ✅ | | | -| **Members** | -| Add an Owner | ✅ | | | -| Remove an Owner | ✅ | | | -| Add an Administrator | ✅ | ✅ | | -| Remove an Administrator | ✅ | ✅ | | -| Add a Developer | ✅ | ✅ | | -| Remove a Developer | ✅ | ✅ | | -| Revoke an invite | ✅ | ✅ | | -| Resend an invite | ✅ | ✅ | | -| **Billing** | -| Read invoices | ✅ | ✅ | ✅ | -| Read billing email | ✅ | ✅ | ✅ | -| Change billing email | ✅ | | | -| View subscription | ✅ | ✅ | ✅ | -| Update subscription | ✅ | ✅ | | -| Read billing address | ✅ | ✅ | ✅ | -| Update billing address | ✅ | ✅ | | -| Read tax codes | ✅ | ✅ | ✅ | -| Update tax codes | ✅ | ✅ | | -| Read payment methods | ✅ | ✅ | ✅ | -| Update payment methods | ✅ | ✅ | | -| **Projects** | -| Create a project | ✅ | ✅ | | -| Delete a project | ✅ | ✅ | | -| Update a project | ✅ | ✅ | | -| Pause a project | ✅ | ✅ | | -| Resume a project | ✅ | ✅ | | -| Restart a project | ✅ | ✅ | ✅ | +Refer to [access control](/docs/guides/platform/access-control) for more information on how to manage team members within an organization. ## Platform status diff --git a/apps/docs/pages/guides/platform/access-control.mdx b/apps/docs/pages/guides/platform/access-control.mdx new file mode 100644 index 00000000000..f470d14af9a --- /dev/null +++ b/apps/docs/pages/guides/platform/access-control.mdx @@ -0,0 +1,85 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Access Control', + description: 'Roles and permissions at the organization level', +} + +Supabase provides granular access control features that let you manage permissions across your organizations. + +Within a Supabase organization, a member can have one of the following roles: + +- Owner +- Administrator +- Developer + +A default organization is created for a user when they first sign-in and +assigned the **Owner** role. If the user wants to invite others +to collaborate within the organization, they can visit the organization team +settings (`https://app.supabase.com/org//settings#team`) to send an +invite link to another user's email. The invite expires after 24 hours. + +Invites sent from a SSO account can only be accepted by another SSO account +coming from the same identity provider. This is a security measure that +prevents accidental invites to accounts not managed by your company's +enterprise systems. + +Project level invites are not available at this time. A member of the +organization will be able to access all projects under the organization. If you +wish to restrict access to certain projects, please create another organization +to manage this. + +## Manage team members + +You can invite your team members into your organizations to collaborate on projects. + + + +### Permissions across roles [#permission-across-roles] + +The table below shows the corresponding permissions for each available role you can assign a team member in the Dashboard. + +| Permissions | Owner | Administrator | Developer | +| ------------------------ | ----- | ------------- | --------- | +| **Organization** | +| Change organization name | ✅ | | | +| Delete organization | ✅ | | | +| **Members** | +| Add an Owner | ✅ | | | +| Remove an Owner | ✅ | | | +| Add an Administrator | ✅ | ✅ | | +| Remove an Administrator | ✅ | ✅ | | +| Add a Developer | ✅ | ✅ | | +| Remove a Developer | ✅ | ✅ | | +| Revoke an invite | ✅ | ✅ | | +| Resend an invite | ✅ | ✅ | | +| Accept an invite[^1] | ✅ | ✅ | ✅ | +| **Billing** | +| Read invoices | ✅ | ✅ | ✅ | +| Read billing email | ✅ | ✅ | ✅ | +| Change billing email | ✅ | | | +| View subscription | ✅ | ✅ | ✅ | +| Update subscription | ✅ | ✅ | | +| Read billing address | ✅ | ✅ | ✅ | +| Update billing address | ✅ | ✅ | | +| Read tax codes | ✅ | ✅ | ✅ | +| Update tax codes | ✅ | ✅ | | +| Read payment methods | ✅ | ✅ | ✅ | +| Update payment methods | ✅ | ✅ | | +| **Projects** | +| Create a project | ✅ | ✅ | | +| Delete a project | ✅ | ✅ | | +| Update a project | ✅ | ✅ | | +| Pause a project | ✅ | ✅ | | +| Resume a project | ✅ | ✅ | | +| Restart a project | ✅ | ✅ | ✅ | + +[^1]: + If the invite was sent from a SSO account, it can only be accepted from + a user signed in via the same identity provider. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/platform/sso.mdx b/apps/docs/pages/guides/platform/sso.mdx new file mode 100644 index 00000000000..8868b0dfbf0 --- /dev/null +++ b/apps/docs/pages/guides/platform/sso.mdx @@ -0,0 +1,54 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Enable SSO for Your Organization', + description: 'General information about enabling single sign-on (SSO) for your organization', +} + +Supabase offers single sign-on (SSO) as a login option to provide additional +account security for your team. This allows company administrators to enforce +the use of an identity provider when logging into Supabase. SSO +improves the onboarding and offboarding experience of the company as the +employee only needs a single set of credentials to access third-party +applications or tools—which can also be revoked easily by an administrator. + + + +Supabase currently provides SAML SSO. Please contact [Enterprise +Sales](https://supabase.com/contact/enterprise) to have this enabled for your +organization. + + + +## Understanding setup and implications + +Accounts signing in with SSO have certain limitations. +The following sections outline the limitations when SSO is enabled or disabled for your team. + +### Enable SSO for your team [#enable-sso] + +- Organization invites are restricted to members of the company that belong to + the same identity provider. +- Every user has an organization created by default. They can create as many + projects as they want. +- An SSO user will not be able to update their password or reset their + password since their access is managed by the company administrator via the + identity provider. +- If an SSO user with the following email of `alice@foocorp.com` attempts to + sign-in with a GitHub account that uses the same email, a separate Supabase + account is created and will not be linked to the SSO user's account. +- An SSO user will not be able to see all organizations / projects created + under the same identity provider. They will need to be invited to the + Supabase organization first. Refer to [access control](/docs/guides/platform/access-control) + for more information. + +### Disable SSO for your team [#disable-sso] + +- You can prevent a user's account from further access to Supabase by removing + or disabling their account in your identity provider. +- You should also remove or downgrade their permissions from any organizations + inside Supabase. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/platform/sso/azure.mdx b/apps/docs/pages/guides/platform/sso/azure.mdx new file mode 100644 index 00000000000..c1a888fc220 --- /dev/null +++ b/apps/docs/pages/guides/platform/sso/azure.mdx @@ -0,0 +1,128 @@ +import Layout from '~/layouts/DefaultGuideLayout' +import { Button, IconArrowDown } from 'ui' + +export const meta = { + title: 'Set Up SSO with Azure AD', + description: 'Configure single sign-on with Azure AD (Microsoft Entra).', +} + +Supabase supports single sign-on (SSO) using Microsoft Azure AD. + +## Step 1: Add and register an Enterprise Application [#add-and-register-enterprise-application] + +Open up the [Azure Active +Directory](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview) +dashboard for your Azure account. + +Click the _Add_ button then _Enterprise application_. + +![Azure AD console: Default Directory Overview](/docs/img/sso-azure-step-01.png) + +## Step 2: Choose Create your own application [#create-application] + +You'll be using the custom enterprise application setup for Supabase. + +![Azure AD console: Browse Azure AD Gallery, select: Create your own +application](/docs/img/sso-azure-step-02.png) + +## Step 3: Fill in application details [#add-application-details] + +In the modal titled _Create your own application_ enter the name you wish +Supabase to be available to your Azure AD users. `Supabase` works in most +cases. + +Make sure to choose the third option: _Integrate any other application you +don't find in the gallery (Non-gallery)_. + +![Azure AD console: Create your own application modal](/docs/img/sso-azure-step-03.png) + +## Step 4: Choose the Set up single sign-on option [#set-up-single-sign-on] + +Before you get to assigning users and groups, which would allow accounts in +Azure AD to access Supabase, you need to configure the SAML details that allows +Supabase to accept sign in requests from Azure AD. + +![Azure AD console: Supabase custom enterprise application, selected Set up +single sign-on](/docs/img/sso-azure-step-04.png) + +## Step 5: Select SAML single sign-on method [#saml-sso] + +Supabase only supports the SAML 2.0 protocol for Single Sign-On, which is an +industry standard. + +![Azure AD console: Supabase application, Single sign-on configuration screen, +selected SAML](/docs/img/sso-azure-step-05.png) + +## Step 6: Upload SAML-based Sign-on metadata file [#upload-saml-metadata] + +First you need to download Supabase's SAML metadata file. Click the button +below to initiate a download of the file. + + + + + +Alternatively, visit this page to initiate a download: `https://alt.supabase.io/auth/v1/sso/saml/metadata?download=true` + +Click on the _Upload metadata file_ option in the toolbar and select the file +you just downloaded. + +![Azure AD console: Supabase application, SAML-based Sign-on screen, +selected Upload metadata file button](/docs/img/sso-azure-step-06-1.png) + +All of the correct information should automatically populate the _Basic SAML +Configuration_ screen as shown. + +![Azure AD console: Supabase application, SAML-based Sign-on screen, +Basic SAML Configuration shown](/docs/img/sso-azure-step-06-2.png) + +**Make sure you input these additional settings.** + +| Setting | Value | +| ----------- | -------------------------------------- | +| Sign on URL | `https://app.supabase.com/sign-in-sso` | +| Relay State | `https://app.supabase.com` | + +Finally, click the _Save_ button to save the configuration. + +## Step 7: Obtain metadata URL and send to Supabase [#send-metadata-url] + +Supabase needs to finalize enabling single sign-on with your Azure AD +application. To do this, please copy and send the link under **App Federation +Metadata Url** in \*section 3 **SAML Certificates\*** to your support +contact and await further instructions. If you're not clear who to send this +link to or need further assistance, please reach out to +[support@supabase.com](mailto:support@supabase.com). + +**Do not test the login until you have heard back from the support contact.** + +![Azure AD console: Supabase application, SAML Certificates card +shown, App Federation Metadata Url highlighted](/docs/img/sso-azure-step-07.png) + +## Step 8: Wait for confirmation [#confirmation] + +Please wait for confirmation or further instructions from your support contact +at Supabase before proceeding to the next step. It usually takes us 1 business +day to configure SSO for you. + +## Step 9: Test single sign-on [#testing] + +_Testing sign-on before your Azure AD has been registered with Supabase will +not work. Make sure you've received confirmation from your support contact at +Supabase as laid out in the [confirmation](#confirmation) step._ + +Once you’ve received confirmation from your support contact at Supabase that +SSO setup has been completed for your enterprise, you can ask some of your +users to sign in via their Azure AD account. + +You ask them to enter their email address on the [Sign in with +SSO](https://app.supabase.com/sign-in-sso) page. + +If sign in is not working correctly, please reach out to your support contact +at Supabase for further guidance. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/platform/sso/gsuite.mdx b/apps/docs/pages/guides/platform/sso/gsuite.mdx new file mode 100644 index 00000000000..3995999c687 --- /dev/null +++ b/apps/docs/pages/guides/platform/sso/gsuite.mdx @@ -0,0 +1,123 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Set Up SSO with Google Workspace', + description: 'Configure single sign-on with Google Workspace (GSuite).', +} + +Supabase supports single sign-on (SSO) using Google Workspace (formerly known +as GSuite). + +## Step 1: Open the Google Workspace Web and mobile apps console [#google-workspace-console] + +![Google Workspace: Web and mobile apps admin +console](/docs/img/sso-gsuite-step-01.png) + +## Step 2: Choose Add custom SAML app [#add-custom-saml-app] + +From the _Add app_ button in the toolbar choose _Add custom SAML app_. + +![Google Workspace: Web and mobile apps admin console, Add custom SAML app +selected](/docs/img/sso-gsuite-step-02.png) + +## Step 3: Fill out app details [#add-app-details] + +The information you enter here is for visibility into your Google Workspace. +You can choose any values you like. `Supabase` as a name works well for most +use cases. Optionally enter a description. + +![Google Workspace: Web and mobile apps admin console, Add custom SAML, App +details screen](/docs/img/sso-gsuite-step-03.png) + +## Step 4: Download IdP metadata [#download-idp-metadata] + +This is a very important step. Click on _DOWNLOAD METADATA_ and save the file +that was downloaded. + +![Google Workspace: Web and mobile apps admin console, Add custom SAML, Google +Identity Provider details screen](/docs/img/sso-gsuite-step-04.png) + +It's very important to send this file to your support contact at Supabase to +complete the SSO setup process. If you're not sure where to send this file, you +can always reach us at [support@supabase.com](mailto:support@supabase.com). + +**Important: Make sure the certificate as shown on screen has at least 1 year +before it expires. Mark down this date in your calendar so you will be reminded +that you need to update the certificate without any downtime for your users.** + +## Step 5: Add service provider details [#add-service-provider-details] + +Fill out these serivce provider details on the next screen. + +| Detail | Value | +| -------------- | --------------------------------------------------- | +| ACS URL | `https://alt.supabase.io/auth/v1/sso/saml/acs` | +| Entity ID | `https://alt.supabase.io/auth/v1/sso/saml/metadata` | +| Start URL | `https://app.supabase.com` | +| Name ID format | PERSISTENT | +| Name ID | _Basic Information > Primary email_ | + +![Google Workspace: Web and mobile apps admin console, Add custom SAML, +Service provider details screen](/docs/img/sso-gsuite-step-05.png) + +## Step 6: Configure Attribute mapping [#configure-attribute-mapping] + +Attribute mappings allow Supabase to get information about your Google +Workspace users on each login. + +**A _Primary email_ to `email` mapping is required to exist.** Other mappings +shown below are optional and configurable depending on your Google Workspace +setup. If in doubt, replicate the same config as shown. + +Please share any changes, if any, from this screen with your Supabase support +contact. + +![Google Workspace: Web and mobile apps admin console, Add custom SAML, +Attribute mapping](/docs/img/sso-gsuite-step-06.png) + +## Step 7: Wait for confirmation [#confirmation] + +Once you’ve configured the Google Workspace app as shown above, make sure you +send the [metadata file you downloaded](#download-idp-metadata) +and information regarding the [attribute mapping](#configure-attribute-mappings) (if any +changes are applicable) to your support contact at Supabase. + +This information needs to be entered into Supabase before SSO is activated +end-to-end. + +Wait for confirmation that this information has successfully been added to +Supabase. It usually takes us 1 business day to configure this information +for you. +Supabase. + +## Step 8: Configure user access [#configure-user-access] + +You can configure which Google Workspace user accounts will get access to +Supabase. This is important if you wish to limit access to your software +engineering teams. + +You can configure this access by clicking on the _User +access_ card (or down-arrow). Follow the instructions on screen. + +Changes from this step sometimes take a while to propagate across Google’s +systems. Please wait at least 15 minutes before proceeding to the next step. + +![Google Workspace: Web and mobile apps admin console, Supabase app +screen](/docs/img/sso-gsuite-step-08.png) + +## Step 9: Test single sign-on [#testing] + +Once you’ve turned on access to Supabase for users in your organization, ask +one of those users to help you out in testing the setup. + +It often helps to ask them to log out of their Google account and log back in. + +Ask them to enter their email addres in the [Sign in with +SSO](https://app.supabase.com/sign-in-sso) page. + +If sign in is not working correctly, please reach out to your support contact +at Supabase. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/platform/sso/okta.mdx b/apps/docs/pages/guides/platform/sso/okta.mdx new file mode 100644 index 00000000000..1d3cdf7d17b --- /dev/null +++ b/apps/docs/pages/guides/platform/sso/okta.mdx @@ -0,0 +1,112 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + title: 'Set Up SSO with Okta', + description: 'Configure single sign-on with Okta.', +} + +Supabase supports single sign-on (SSO) using Okta. + +## Step 1: Choose Create App Integration in the Applications dashboard [#create-app-integration] + +Navigate to the Applications dashboard of the Okta admin console. Choose the +_Create App Integration_ button from the toolbar. + +![Okta dashboard: Create App Integration +button](/docs/img/sso-okta-step-01.png) + +## Step 2: Choose SAML 2.0 in the app integration dialog [#create-saml-app] + +Supabase supports the SAML 2.0 SSO protocol. Choose it from the _Create a new +app integration_ dialog. + +![Okta dashboard: Create new app integration dialog](/docs/img/sso-okta-step-02.png) + +## Step 3: Fill out General Settings [#add-general-settings] + +The information you enter here is for visibility into your Okta applications +menu. You can choose any values you like. `Supabase` as a name works well for +most use cases. + +![Okta dashboard: Create SAML Integration +wizard](/docs/img/sso-okta-step-03.png) + +## Step 4: Fill out SAML Settings [#add-saml-settings] + +These settings let Supabase use SAML 2.0 properly with your Okta application. +Make sure you enter this information exactly as shown on in this table and +screenshot. + +| Setting | Value | +| ---------------------------------------------- | ---------------------------------------------------- | +| Single sign-on URL | `https://app.supabase.com/auth/v1/sso/saml/acs` | +| Use this for Recipient URL and Destination URL | ✔️ | +| Audience URI (SP Entity ID) | `https://app.supabase.com/auth/v1/sso/saml/metadata` | +| Default RelayState | `https://app.supabase.com` | +| Name ID format | EmailAddress | +| Application username | Email | +| Update application username on | Create and update | + +![Okta dashboard: Create SAML Integration +wizard, Configure SAML step](/docs/img/sso-okta-step-04.png) + +## Step 5: Fill out Attribute Statements [#add-attribute-statements] + +Attribute Statements allow Supabase to get information about your Okta users on each login. + +**A `email` to `user.email` statement is required to exist.** Other mappings +shown below are optional and configurable depending on your Okta +setup. If in doubt, replicate the same config as shown. + +Please share any changes, if any, from this screen with your Supabase support +contact. + +![Okta dashboard: Attribute Statements configuration +screen](/docs/img/sso-okta-step-05.png) + +## Step 6: Obtain IdP metadata URL [#idp-metadata-url] + +Supabase needs to finalize enabling single sign-on with your Okta +application. + +To do this scroll down to the _SAML Signing Certificates_ section on the _Sign +On_ tab of the _Supabase_ application. Pick the the _SHA-2_ row with an +_Active_ status. Click on the _Actions_ dropdown button and then on the _View +IdP Metadata_. + +This will open up the SAML 2.0 Metadata XML file in a new tab in your browser. +Copy this URL and send it to your support contact and await further +instructions. If you're not clear who to send this link to or need further +assistance, please reach out to +[support@supabase.com](mailto:support@supabase.com). + +The link usually has this structure: `https://.okta.com/apps//sso/saml/metadata` + +![Okta dashboard: SAML Signing Certificates, Actions button highlighted](/docs/img/sso-okta-step-06.png) + +## Step 7: Wait for confirmation [#confirmation] + +Once you’ve configured the Okta app as shown above, make sure you send the +[metadata URL](#idp-metadata-url) and information regarding the +[attribute statements](#add-attribute-statements) (if any changes are applicable) to +your support contact at Supabase. + +Wait for confirmation that this information has successfully been added to +Supabase. It usually takes us 1 business day to configure this information +for you. + +## Step 8: Test single sign-on [#testing] + +Once you’ve received confirmation from your support contact at Supabase that +SSO setup has been completed for your enterprise, you can ask some of your +users to sign in via their Okta account. + +You ask them to enter their email address on the [Sign in with +SSO](https://app.supabase.com/sign-in-sso) page. + +If sign in is not working correctly, please reach out to your support contact +at Supabase for further guidance. + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/public/img/sso-azure-step-01.png b/apps/docs/public/img/sso-azure-step-01.png new file mode 100644 index 0000000000000000000000000000000000000000..2a78633f21c7bc13477db85ac489599c9a4b99eb GIT binary patch literal 264059 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 P3Ja8?($kItF2~=2s`$I9DvNY# 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%0D?~IvuQ&7N&wj4e~DDM|G+#`UkDq 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/img/sso-azure-step-02.png b/apps/docs/public/img/sso-azure-step-02.png new file mode 100644 index 0000000000000000000000000000000000000000..629afad890a2dc4d0b529c6d3dc784ac2c772d59 GIT binary patch literal 340685 zcmbSyWmsLwvNrCn!7U`XySrO(*Whj&clQu1xLdG|yIXK~C&AqvzMYvlbLV{b-XHhu z=UJ>?E!9$QS65XR5lRY@$O!ldU|?X#(o$l|U|{fuU|^8za4?{p@E0;lFffEgOHolJ zX;D#9B`13`OB+)#FsX>76j)W2B^;qMFUEEuQt*S|btq~G@Pc6C$ZHxJGWhq2XqbV4 zM0kYV)j8yWred(-ScF92c! zcV?MjLdaV(?^BtO{plQI*;u;L@v^`C=o5r~F9a)Q2#dy`_`xVFEDTJwXufl#RRJuf zs~r zW8F3>8cd!rgeI7~5L}Hv79Gq;mz5HfOxFh>vZ_D7Aqf{;tiMSPdIrQ^7o`L8DwJC{ z<2_>wz^yjFB~B&llD*QnQj)}d84ejj z%8qH7LYYFCLLC{#q=?}U!!|q6!wKduwpU{Q-Ck9&Xub5+GV~Pb7O6YhmG#hUHSI!Q zRHs)~H0M+Krz%H{p9vpSW)xXPoomhVcPZ$jlMB^@=Z!1Yv~lZ0>+qKCmibPMPfV8Y zTn&k2Go>;Md7fM;%AyFaGJMcJ=J1`P$ z9dnkBCa?KHB;n+P?T0h@F}a^|3uzo_DBmoLOY_b1_4DlS%w zjOKU~G8y$A>MP|{4Y3WW4NtZti>1rZOW2F-EA0)9b$d%1%Nve4JomiiE*4Ji>?>9c zhPS6nYq2haN`v*W6|n{x8JPtNt_nfp1LH&EyqT?{ z+?9j6Zw|G95eMF1987~Yv4-QX+&-tFr@D9Tr~Jfnai8PP_&xcM`I@uTvJ~5*+wS$} z^d}Z^j$LkzZe{It>`U+9&+Y^&1x9?dz0o(oHjFm_f@+=bIuSYtUqfFlU+Z6c!DGQ? zA+;f@1G)p!AzQgx2#JeBSqXm;*75C&Fi~>RG?Cv+hnt486>wvrAS0|{JUUbk>0Yc3 zFrf{=uVCC#tN(Rc|9eHy6TU8{OG zJ3Sk~c2`Gl86=`;lH}f0ZlVqGano>TJEC)O|=ZNjxQA{ z?eAMfjVYYnpERJ$d79GdcuZ~> zp&OtJq3sv?Dl8dh>2=i>@8r8U>&0cnr}HZ7?X2&-qaM_+ZJ&6;TzThx=y!1q=&R|e zX&>6M8eb3H02@huoDF2IqE8aVF|C|i91)zZcDJkEK-EIF&N_S9{p8S!(TaYZ4LhBt z6Pcys8vYgOm7Nu@VbS4qz`L`>x}VM=z-_xiH`5n|%*-P|$438#t99eTX$yagm&~pA zqyDwe-MW7}vRaXv>662g(;fdBNo(f`>^v&_oc0{$oB>KW>NR0BpL^~=bJ6aX@!Xht zhl)19xx@5Ux}rq0 zkP6iC!R$_FvTc#4{>`Wq#s>qQjR8AeucepEQrb!l1$|RJ+qPYoimjHPH<+DVuTFVu zrR`gxS20ED44mn_yDk~cJ03@?wi_!crw*sOt-N=3lIC*eZW_uOikzKZoBF%$8h6fT zaRQn*Xiva<^pj6ZCYgh3o!ZaZ8$V~ATNWDc9urDFqCUF&F#0CE+%|WfQ{PxFvA&qI zL*7Cb!@R)S3uNE5y@mYh-&dMCqv<^JwtT%T7HoTM5+D>@eUo{#I=*@2OtVL6%Y12Y zeeeD2qP5&D|13(-!k6nl{-*jwWwqEmKT7bYV2WS${q!^Y{ZVgqc{MY<#&G64Xf)NW zSyeE75~01HP+e8C4&l(w-HWgf|5*ejy2vDS#1Lf|ITyf^8&Aa|n+O>nAi= zFoN-NQC%C5%en%yqs8sSBok_?t2y_d!yCaiWfv9~Eq*R8rdZW2K7rM>rDq%sh5+7y zowXUBO@0{+xG3uq{Oq**CL8yr8;}>+S>XpEYfivZ>ku#kQgtIuHKonu<-uq`X*e(_ zaC|UmPzoIM2!Ip(ot6Nn0)zY`9|8<4%n}UhuR02#_wU~q(DS>^pKr*opHB;Wr&HK6f5a($>_)h}7NI#?G0?ouB-V z8a$x%?`%eL(m$%WSo4!>$}5qI+B=z&axgG4Fp&!&kdl(}Iej+cQ5KW=>Y*bdMCMW5 zu6y|bd;oNcK7L+z5$z_B(1-{)O2S`g+Ec*D_ygXb3wAbhb2@W+J+*&v8kekTt*xzP z-N;>qX-~WS2{Xq!~>haDT z97o4s?r_HZ$LZIv7!1qu@{(~HJpbvyz$wv!h2l7*i$W2Af&SBL|1q790mQZmOIKEn zJciue`wjo;3`yUC=wNWa8QNkSLPHilCH-p!|F39JfcOAyQ~~0@Q{a^Ce~ct15EU|w z?{mcyU)CroDcf4o(_)E9j=9#V{xfL$W0YJ#&4QN=D1t-(r|2$#iiVs&)jRaZrWWE? z_`hw9f30Rfnrx1FE7o!aM0px7xXZ8qknLg$T|fQnb%=oEk|mNf|5q0M*{PBW{Ix|w zpQr}7x_tX9kKKRBt2|OeLg4+qw$CHdlAf}1Pg!f}!T!Z3w$iZwa9lZ1Rxse$hI7$J z<@x`a{7?%Nf*daRJe>D_IQLOi=%(b$p%U|4k@C!&UYpu*VZW{k>;heZgf4B;W$BPU zUbeKbW?3?i;R*Jmr}BTe3Yr4-0dKZ>p^01A+96TUJ>|Mqe^r0iV!g z25Rc9xwToB>wBr?>A!o2dJlFn7c$tOyrm{2)1vY}W4t5+inPzuXIcW=Xs$1+%0&I& zg*^KgA^PQhVl~;tGOGt-JRcZWBm0We^2qN*DOWcZEB=%kg*07}hgeeF>_%c5TILAlH%-WG1pDlX8D4@ZlRMVc~ECo zrMxI{Vo7upWl5sykFAoi{OwQnL6JM0J!C?h%=`RXKmYgu39VBf6Vn*;9I$_^44NVY z1x)djrD(d!UUGzLqXK=lO48}FJU4V<9kcUCenCsfF|GK$S_95ohJaF3)blj{)vIxu zM_;@7^^-4I{B#iTszO8-D3mj|z}P5_9SE8HIkqnVr#NGD5NDvpZAJg&j0kxSMEMsc zOUnOwQ{=#4DuJsbcii*1{9S>x63VktvB+@`kXICQ_>fT?tS5yCIL?EKs4rEpH4vUZ z-tlm`)1jqK7uQN+$2gqN!$h@_8Ck?ec&Qj?zR2o;T43q(czX#;wx=r}@2yZbk=-ru zBeI+)R^)z%M6QfcnMX#4EQ_qpzV90cW}Q+*iXh$;1z<|*=MQQrnCzEqEI=8< zlsDLly!jz%eQ>0e>Q#6aps-w~$I|XC@5Wj=VQ!QE=H0@fbVJiwC2j=~!{0>x(#)1( z#xPWI`LmQ7(*OQD=8LfFk~PgN)16g?cHi5DpuTbP2r^yF@rUiV`$4@eF z?PMj0iUOZ}9HSeHgy8Y-V6^WKwWa?Ya^7#2l$;-Q{{tldP}GEwNkQfK4)Lzxe^=-t zrerFxM&Ng~)Nodqx0s|&;G9kuv_V-8V?L&FJ=y2@utOBfdomSL7odWvUbI-{CF*&( z%}^xEF6^(Cx@c`6Lg8N*q<7E=%&a<`E0euBn#=!H@R*pGC>3#o311oEw1`Q_BrbPW^jEpN;C~oZV_p8a2s*{pQkoDItVagi`S%o_s;9JytY zNA>Rtq^D3{J~?c+zmym$6VWU;M=|)C!B;Hn{&HS#akX-M?B+?#G}u;&jrl6Ort#ft^8wyz;mbdsye?z#z3OSfNz8In$%CXK-7wCQ?N zrs7_r=&2!~F};|J&7@3BF%Z(?_DJk~t8u>4O016pTy!|J0}-fVlBb1lse80JA?O71 z)UyRd0V#=_0X2VUCh8R0T7Q8`i0U^C5hyGEn)Kg{_)77 zDC94s+qW0AmXCop+=&dlMc6UxjG6cs&0m)2s(^`E*>wSSeAN}D&ev;xGvi;^pineO z7M2rzn4JmuZzJB={A_2AW~PE>EDZOsDAu)yjH|e5FD)R7Vf&ggnd=ly4(E9yE~8`) zf(~>_^w+dqs8Wd51(SFhqzYVh+$O7{oZ$BAP5b~IhcmeW(h2Ur{8ekM9|lAoEj!G; zr?Y&J=JQVsJbOJ|4t}W5c6j&<57RQsO`TGEzYtuyN>~k&?3t!IA|0j6gxy%%3{-zG zfqkjxixWt1PKrz|W$gl^L(6us`r)1BjO&R1!Ze!bmSp|WpBsvUzJ+3A#O#tk;IS5%qv z!E?kJm7AV(?<<%KuR5Us?J`m&vaUz7g*>iSPjw-6L4~b=PmYf8C%^pAjCXdc-_fRr zXwnTVhtvfFs}Ly~K6z5K740B(n>6a0Ut^}o>h z9Ui1}sU;xd?HTF1sLJC1V8nsF7+KRCeCt>ftGWQ*%t6kWkCMy6Peicl?mhs=Qa@VgWh?2(rV7~GX3fC z6GD^dVCB@xhh z8u)6o6;6cqlh0fKqslcgqEuFTQ}_Cb-rH&SYvMPh^vUrOuRX7kYKZEEdjcI*@-j3I^wbhYu=gqI|hXNZ{KO9q{EyVYTmwGZ3hd(!G zhVW^0HjRdd7a+-6;$p;C|HPT*eLJ)qFj?s4=~GMLZ%vGhbW7D^G?>ZsY?KA4U)kli z=f*w|*uIT>7&Es+XU!L4NeJ?@bTtLre!iI2v#-cYsXW~E9COx0bM3#9rFCesl+zIz zmh2m=s>*3quvSFdlIA;qwW0vldT&S1s?$A#2mS|9T?q?`S zFn!qjN-3tyW#82EKKv&!Un3^vMVm`h>f5hL`KpTZCF}zqi1;}~4FIdH{3Gj3IQmxP zZnQ_)C9+%i<9bs^*irq1vlfHi+ojW9F1mg3G|ZupUx+tf5%y{oKD(7+u!cNYm(@1< zPRO#q9+%)i-FCdg>UJr-(1G#<^t%npT9>N~q|F;K|n{FkFLc zf*a|^=T3kQo~Lu1T|UGGoXJf4N;aR?=*-N`k`Vv^t=u- z?8~8DNeMY5b>=5(7kqGs7Vcl&4QJ7yFZ~!uZiDL-DHaacM62hv{>W}z6tk!%0|All zNaDE~{7MVKqF$ltNdp=2ZOU(Zo4Q3Evom&7qXi_@^ip>PUa5<;FPn|-_o^$b zXl6Ig;Ct#0IM6K;50W?VRni(E0+Y)b3r>&mL%KYeI}9P{;Nr8)$-V;pC#|g&m?uVf zW`p%wnHDl2=$Zg}gWJOJTv?F9>CKUdU_2+6M*o zWV5Svbm~4u0X{LN$=v+lTr{$+Sc{x2*X0!SJsx|jF;0?U-*zLH)fFT* z*iLNuE!FY!E^ryEmAos+`G#SMPBea1HX(FV4>BOS(E$k9 z*YpMfWHm(Lvpyx;zBE6_EFvY55dHabGtC z1*q4Kt3~)+uin%rvop+40#scX_2<@TsU8pSY_ER|?ocDyg5w-2?tpGU+S-THlP`=F zdffz~I?>SP3CHu8^xYxtBo*~n`)&Njds5$k{sVZ`$0U89INNHX5j5#wV5>K9_P)(T zKqhBAwQ{c+QVuaG^ zL4>n`EtecW6AQb(ZK8~M^JQ&k@t{a!j_))6J`!gskLkN|C~q23BhA;il^oKb|L954 z&R_5CtIyej+?|9_9k4f1YI-$@b^kCGIrHG-u47*XhgACR%~nsA5N3;{l0tV4?Y2JR z*KeF!px#Y2D>B?hl1}jFg-GK?_+VH!9_JvsqeP`I+nTIQIc7v+f`c!^qb6^JImtDR zsMmcYilVY4oy!&)nk-{YWyZl;90 zEXCi;O@Bj$i8B9(vk$|hy??lM>SwQ&7%lBzt`@iu&}k}?Tj2Wd@cb_?j~qz#yl8%` z_GKo?)`zjj?#VG{xM~}17<@l2G6lzMJSB0Cu6l}3-gf!XC4RlkIpNEBfgdDl_>9d~ zR=CEONVEWtBP{KQ^ogAcjWhPq{*+GO3s}MlKxi_-Fn>_HX+bgsQZ9y0}WOr3Gm88`2)n1eJH> zo3rfK^OsoJ4Pb~O1(+n7LMu*D@_J8U=ORQp{x?HJ?J+Cw4vELd4bXa^BONoy&nG*G zyK#cG6y-EEa(VhxE3{NY{6THYg#xOLqQfKnK2P_Oc&rXX5MiG97$X9iwpB>w;Fd7(XMJrNn)%5MUW}Fj9b~U4MSw)j{a~y zBntIG-PVCwUn&w?&taEwPSvQT%XPK_Y@{=J>k80&`3$~N5JwZ2{4Wm904}tWQ;2fS zPEu3={Pz_^7r#JkbSKcsyBK}mxd9+|!t4n@?+4gNhBm%ssaEj!jCt70HuK|$S7-E) zujaGM^947*k9F=DjEOnEYD7w^?)+IM>(Q3=Th`Gy3AXvs@H+q`XIxi%$;%U~DKk#-2OE|W0`+=vBH6fGPXcTC|0gD8ACJVAe580nZR~@aqcmUZS zu!EJ%KEAm>;Nuw9%ND88h4QSBg{F;9&`F8dfa4HW`WnK(aZ1wH2KgB@szh_V< zrxIyT*KA{-AzK$|zQ#NH8i{%oZU~y`?OAgKLEE@|R&B~#9kgcCdef<$QB0ps2#`|SS%#C zrjj@$<3F5ve3;8ScGel#{w+~np}g<1=i+1EeX(jeAL$`%xrxEXZn-)gYcKJseJmm@ z}j5!!LPnjbGBM#3i+CV`LG_N>mPC}BkMM`e3Ncz0x}aASA}`q)UmE} z^>g4Bpv!*ydE3iWp)~_?4m*a0NkdNH6nRQYA0`8Q3MHRvb!t_*4@Fspae#}i5;$3I*%F1ARn$oXtUis*DKSF zKR#ucCZ;A8PXIN$W;y;%fc1O;oxZ?$Xuh15b|H{oxNC&yLP6&TMq~-i>La>aIRYUS z-D;B&36wQlu_(^)XMt9tsFykRU(LZ6{UY8UAVxLoHRhU3p2My6%l8{F$25QOaQBBy z)oCTgCDnPOnUW&shKGfs%H?}a921u{13_lmZ3BYos^;7pC~ED~glV(O%SiXkS^pmhbSMr&%w)A8!&7D@7td#P=*$xg$9!&zt&Fimwm*#5UN_(|jQ~EO!o&h7(Yy?l*N#r&}CcK;186rn`E_t#YH4(EL zG8fj&i|teqA-qKV>oYPdv;3TEwssT^LwHo~3;BaJUl056?-^b@DYX z2KDbVIP8b=eEC;q9*T)O1}6+=6v8|8n|E>>M}gf0t0veJ?H9-unzgB+rwdUEgv|!! zX%$!}bovch^eL>R;gz zhKf>tL>p_#2VAMjk9R6fMppps(d>NJqq#ziQxapTH-_g0rL0b?E9Y-G|55}%zPB71 z43O8#hEd1WBj9wxM_M^40*nHmOqOmr{A6y0wITuz&Kxl;8!pa4_x-6jS7i&-X|2QJ zP?PES+M0X(ntENliq?vQNS4NF1b18b zRjIv43pY8ZwqN1MlYi1J7H2I#2}^1tNw4E? zinyB*1GNqPk)7-NQb3}Y;MhnJtbpc;yzIAiAhD0H8%eA79 zwQl~OW!0`_Y5xc?FPE7=zubZta)K1WB~?!I=3MgpYl#OXbJ9%gIUdc+ah;$E(l&FXxTU?8td^mwXe? zbMcol^j%+3ISy>vQUZwIT?n|T*=#gi)IP=7ZW-X^YzM&5q6G$G->Q>F5es8*1u&0f*3wM@4e0r-8Dat1|GIw$xlV&idgr6|el zAZEXzY(Q)&kC-?bq*Ml?e{T{rvF6}^d^R^5oWms)&0O~IoibX`tudx(XEnm#saE1r z>RLPh${Ggy9b?AF-kU3FmtJ2q=m}8tcylymU;CPSnyE8WXpS7W9LZBeG&k@M8IJ}D zay~|ais(A%siFMvt^zOmMsyc3GVr42NCva})P5`CvHMUaz2#alr^Va%p2W!A zYjd4#OCiosT=)AX9D4{+E@_r#OYRqjdr%xUwsu1ZWp4PVV9wQ~&6;2!v?j>snPcAR zM}xKSFgunIlcjc!eMhq&+q zAQ@D)vW-?_-@S!QPUmMdk*T!Hw;a*$qr3#ANo2{vUKI1n)SN786H-o246d#tBU65+ z&A8gLmLX2TS><2jbZPN2K%de4k#qHf+>4Esc$tNR)Znenf`2XGxH5wpZbz74TFO|d zw8bYr3jC|T{5__j&%+ak=k?Ee@VKN*#dFxz*JtoOq++lmESy8#!9b!2h&S zS1e$$euQmYG=9oo-f7YIf$P)prwsf~tK~gcn7`*YA2bzYh^U~c`25sns7A5eY4?-k z@r>5MBQ9h`Y7j71qL8^<-olVGchop}=&B1R(?JD~MkU!_X%7fjU^1o+SWNYb5kUDu_oX1>GoUreV+EP6w<(h(2aMdAO$ zT~ML`Wt9dd3x!+d==se(xXrxeu=5S}qx23(iE}CiO0h)G+4NR4MNgE47;d!%1@Qt? zmTlw@%5U#JD3Ju~xVkykWcIAOi?R6n*=~CpW=XPUuRS(3j{Ncn_J#8NFqGkRWDjh{ zKjdCruKaHLO>+B~{0hb-;?`MQ6Q)I7ElI23r6Gh7jiFmhdU2y);gevENut;W3i5t` z86P!VP@&0DR}uOd&;x2auCUn!viMGPvGk@Ry*BgI$E}{)?G^2gjuSk&ZK5GWuR&?I zzlw8uMTP%h(X&pzD21EfD0BHsBKp$Fk_g^4}z^;RDUb{G`GzCNhzmv}oNxFiE5u_d}L?N+iNzs{2>q2QHuhVP5%+$`9VZGrM@N8i;uJj`))3ta&JC^e91 z)R+y9N!%N6-~9;>y+ogHu%&o8xtT(Db({b>=0MuA)Y`r659O6=RNb^W*Fmc&!@h`jI_|Q*)&6Kw$hF_#U)(4l5Ni*y zM!0t~t%plZUknc;%~~o>|A{8R4jm7_7 zDz-YM8q3h9UxGT0D_Z$h?2U;S-7w&$dK65A&YaE6IksxC01|_9eqeG^XV1N?Purgo zd4>FAlVQx}b$oc$*^zk$aB@Rs2@i2xZ%T|`!GPOU*TPwU91{d{7I+}O(g)YVjnD36 zj9b2HRh5$dbIm3MGUX(^;OfF#D8oZz`Rqrm_o$xycGhHWqu-mNQ3|{fUWsu<6y#3- zih_Y~-LkXd@obw*tfT>VgLs9~Eb)1|Ph#^C-h}r)MW^4Njz4{H0Kxr^*uwHXl-&*^ zv(lps*A=d8vu%5LjV8!H&Yiu*2VCI`>IAb?RfM>}GNd=hE!$ffqanPb%_WR*kc~yI zTkR(Sy750|IU;a7NTK5M9{LN-mCXr&?s3XSN`pQ@Bz^turRt=+mnA76Uag@IQ{YKf zSwH>x5G7)1gx=cN{;4;?12$`oD3zjeu?V(0Z7g!YeMGOQNN( zQYr0i*6O-B~WLODmoA(uzXipJE1&bD=_4ZJTFmlld)GRvvO-5 z1~)h9#|1IGnxL9Yj*sN#?L-fuSLLu$et2W_?Sdas?yy?ZQWn5WMo-owe;wo`y%ctn z%{{hin_)MOXYupriWfmI3Y?RIyP*JCe|B(_j_`YD!d5I{B-60)6s6q{U5AV0@#`(6 z#putZ6q5&Wp6kLrdPh@;Jn7YoC!p(-1mdU9^kfN&EXA62Ci69XfIV%AjLBjVZ$~!+ zt7%{*wclAWQlQWn{cl^=BV*aYS-p8ta=_n=!m+DH+~PGOWqVC9S`A85)2+x}3~zfV zs`Z^YYx!FXRhZpF_8zK8HBki^;)3VgE;-u{X2U_a?fa`uZlVLAZkWfJ_$K+Rh9-%);)h1fJ`aPPam zu6AOh)F23SmZ27MUV1a>^qZ+cYbuaeuK++mtd30qLo^uo-DEUZ`bv=#8J6@>z~a5c z#@W-3%&@E04ZNy4cyg0rKM(TO_%=q%%a+?{2mwHd1mEXc09~&y+IFeVu9su^TXiP> z`;W?HyOy)1KF%^Fdk-vUHduL31!}8lsl5g?m(*mr4D8m^;hwH0E8~yY*{#;iwp3j+ zGs-2@3%!qR{nn#SAPa1kigIWV%L3D9sqYOTDzcQmIM8Z_B{S~kSsadr7vvyz#xB;@ zt>@^y1~=KCDnu4uBT?wOfD#F8sF+R__aQc6px3MkCF(o;mU3Btu}5uM9reZt$GE#- zKg>oq-Ru{d8HJcin2@O>^hUQ~IBk<#?i$5*RVA%0TCu(*wn6SoE&n9aro7}X%QhPae&!iC1lb2aOxnUI>Fhj5y zuy;9^Uc#MSYcO%EJV&>sTx-N?P)x6t*!^NX%M`I(ZzWTqQ}pR2IP!{=v+B#d&7#$} zTtCAQHqY@R`)nwiDcI47UjipWlO>GYG$$aoFAH2)I(s$xT+0*Z2PT;T|+dj$|T&S#0 zo#0AI-=ti964bS`^FdO@iQ0?eLv)DSOuOBm=9#2^;QpEV^v#}^`$mtqqm!r3(rmYz z9<|*xmj7+Gmv$8roM0!DvaoR1SGSXUX4Sdk-dD2KJ(>S*fV0kc%nZN9fRV@Xmv5zf zh}Ro0LHFu<8)f>NY3dVRrHX@y&A$8Yb}dvX{e|2hw+@@NO;i15vr5Vv4OODha+k*X z%lPWk-MY*7i9Oh5@B1aim@fEJ%|<=fywr)@Is%!@oifguj|paz{_8{*eZYWR!fh4U zY)O!9G?&QlK7uE3CkT>bY!T-8y1>;_vg`quze1e;5NB$^Lh_h~TQ%YS&_|c#M2u4= z=yNB~En~wt(BYfp_~-;;h-f2S5md{wdeuz;ue=z|u{h28+K&T-L)@R&nCKUq@DK8|0h7TMwRK+p*G{Z9L zX%*Bm;DJcpyBW-otNw$gax_*u`+hFOV-RTM||6twf*vZ1H=X<=7kKXMs0%2TX z-l?r9%ZY_CUh5YZ>M}J|QNkYOeClD2?IYO8r)N?JLAT;jnz#|g_p}4^=;(_>G~LQ9 ze{WlMpxpKpmaqsxXJc}V+Sa-3a5Tq|YR8pJPbP~2Vch!j!3S7CBBllM?nT@Ib?`gM zJ$;5hqzyBVcw2>n2wwmfbu91bI%2wPlt!DqfBj~y*ZoDEFgtsE_WEc@f_2x)PUXtgXJPnP%fy#JfV6)tQBtcM@x=VaQH z%t2!U)T5l@f8Qz$N|Ge&=UG-~I93tKr^d5AXMT9iUrmU*JNX=p$QEY=*3s zG1(pNp2+8OSo99DOx+qA25{!*FV|xdS*i5~q%aTrWlmm`wBvZfdRkP$ zRA#~xiP^i8sGXyYsCSjw+-6kB2YU}BNUdYzMB3AD0{7iIis~)E@O?gF$Y9l6G3F>V zJ6g;-J%?phv)s6K#|Dk)FTEn)-2|RelPk*apHFAni847J4YRLAW^Z;H zYrow<*n8a$*W(gf_elZp#K1`upU0BeEAI|I63V@JxdKtiR!n!}S0G@Lf=zV|$NA&GW?eB!MxIkr-8qz2EOZ_SqHbOr^hzz6iNEyN|s*Y>q} zyj>Z14+8@nGdLbeaTHvxmtciQb+Vs7_gM+>4s+zSr;yg+y-meQ%?}ukFwNM7`urv5|W;;_!L9;;Vg_tT4wn%H=D@w)dTk#jW- z-J3zQm*%dU%LbM3(rZ{x5YDZw76NmP+OjT zEI4#pvQ<}CR-FNBqgU@&8w}j7BR!IP9}rM90YVm@M@^0L@hi^Dm1Rf&w7F!Utn$EQ zE91h$fkgX-EwiYmTEA6T2qYaW(qrR(daQ=IT!r#o$@1mWa=G4AgNFTnoGYVK{U79l z1yP8mSu(ta#uGQg!&FM0$JJ06Vh^pIg(p(W5vrh_R~{|9g*MFhwV5EiwUb%>?rC|W zDJaQp(=Gb!xolOB|BEx)^6wB7mnG(kwm>YulP71n9$xmggj-zq!RWhCG_nWKnWX9H z-}AJJT5O+d-Vv?)e!GehHG3iAoPkLbWY&aSEse`M`9{wHW+Tnt92C$E$>!ecPM3G4 zq%fpXK0?1Xp#b_s{O7*)+r8!ms~C~T>|Dl#tkV<|PDfV~t$o;k23@PUr#zGK>PfHO z%+owN>Nn@0WVoT>du_!<*?<@Sz1HOC1oc+gZHjLHflJJQV6>A$jUIW zE>P49<L;o; zytmIXe@@Q;uS8`V#w_-qd$fMESIK|fR{L@)yAma=Rj0%sxI65);hJd zWROiKo)CxzLDz?!yhy2jTs)yGmM#Cf#s&*MOFc*==HmtB*Nlvtjys^p0Rcw1+U{&k zkr9YF33BjW0M0u6G9{>wBPqedFu5{?KF_4~ql~3<7^BM)BPQ`p$R%$0-n^?)f**{q zfMQ&`$Rh;b%bz>eq=cXg&(8An!La=-NhyX1I67D_#cm~@Gf$y>EknbhXod$)FL7I~ z-0IGdG-Y>XLiNBTl7$jYre}83AgGNh45I4zvwwjWc3ymdf*=bYn6Gh8fCG}+x&LaO zXbXgHa_^opgN*W=RD>D`OS!>NDH;NAg&whQ76x(vD9mG8J zWShX{^J2;dx_IGq;T`N7L3+1b-sR0nyblr4jp{hQ4E6GGmPl@XI~m@B18!#A{Teaw zJX0Bc;5h!3lCB|!#y9j5b-P9gByWG4TK{nRH1kZC8wC(wu}Erela%NxxaGYmp(RlCa{npdfRV| z7XyZf;t+RvMd@7AMwOxwI9ou3Rm@EI(TF!m@9vU?L%P(WAfV;dU0BvZ>`hf;3s)Iapv&jcTrVJF zyfxSm<`JR*&jp6C|NQl~bYkJ5pz|3N<~lG6^(1-8Ys>5x|IRn@mTi>|9#W_5n z->CyP_FAA?Jo0rqKqTD(6gyo+>;9471JLhv%d9X&{o(!Kh0o{K1n$92`&LdL#hVgi zd?~-1%$ks{p7RUYg&(MSX zp2_^LpW;{KkHmU?`4~IDhN}l-pSJDAnEkvS(hm-2Wf*#^tHgXLaJgB}#SOd?qkaXv zv=t4BYcyNnkMS0=r0sTZD%2=!;PF7>2)}HbS^kC9A~(Q5ED}Gfi=eAqziI{lFnCr+ zJjr?~&1z>yAOzOYw zLKV6Tmn}k-pmrw0>hH*nDo~3`9JC-@AG5Kep&&C2I~$zyZPb&u{oy;MBELAFj3nhs z1jNBrL;Q}r$Ed~_1ySL8KW?^@PWBCRObQw$3ZYCt>fw2^FdFNqotu)mtb}z7LP+mp z3DLeHVYs{Ybk}8*_QWl`fHog2%f4hBDHwwSe7HZgHz;OPYK2|g;|z=PT78uB-gF*y z`CM!6c@Z!2$lo#ijNUvy4*h;#haPz%@Dr)UCu)^dgp3XfRhB-={cF6?IXa9eo)?b5 zy{HN$B>K|v$pdU1fg~lGdepdfC5#U5@(=U75{bLpm!ib)n>gE|wUDZa1F9IU#b_Qf zV?2ILXlgk_j>_y#Tdubh0@FR@@C7ButRxoueRn5MKq+0V} z&UoQeLvFHQpArR8PsS2)yWEWxeI!SoAMc*FLo(GZ%st|}N@*3#4n+sULFQ9PEnFqm z7}W|UUm}6_aefmWJU&~0mBX36Q3e4Kv#;yi0E2?r9&F2pHX*YjUA6y zv%+ycG9l4cWrA)+?~dagp%m>0m#7ofevZ6@g3~9y&LyETi1*mJ8Fg{sd82XQGwtgG zFch&s7Z9%=l;f05x(>QL@ooPf-3J(t4k?%XS&UTcT=jd8e@VipH_rD>JTOnk(CBB( z4~X5SVJaw8T2}h|VcL|dBf6~wmtot$fpX$QZ41K>03M4jST{l_)&qmVA77h{b=zQ$ z)19ODjp|p!=9HMG@a+x!?1EbF36Fpizr7E;1?3%v>QUuaozfS7drVDy-i#+S2~$8* zM(&=!&Sk}-@s5m9;6OtX6AWjP^vQl=T@YRCC1+9@c$UIr+j`lC`Ob2|f}dA};f>nC zT=HX+6c;~HlL5&x)77##%?81!_lHRDx5n*eNu1(W-e*)vA(_r7cYm2^-07aC!}Tu6 zTeHjQZQu$FzAw{FR`BTE-z_q=QRft}5T~tEn*xZ;8AnuxsWA6JP-;mA#puaBE zSAsX3eB;__YR%@m3fTuFtl16PkhQq`uD~1Q#p00~7eoQ$q7v@n;uoV*U0;Uo$eS<5 zF@>9G#;0^F#bA!FK5>AXfu8yQWIZErSMKaiYP^=tD%f;v060gI@ZDuMMe zP-}=XdrFOi&+xaRU{Lm_w+Ip%i~I&6;7Gqc+)D1-9}4v^jQy%;jBrfP{whhk60|vdPo021gpV7J{%kCYZ7eVzP!&8cs5g zI5iIrOBhNn_a)1>Fb5&Wh@iY|)|tz6R4<{s+%lx?-YV@}>o8W&O`6vW+!B#zV8;Nd z7ck?FW!aGD=nWOG&LfR?P zC-ntt2;4=9xl_fALk(szxqdZA?>iK=M0|uJYI7zDTek#9%FgyCu23vDsN>=O^`t8pN^n7iS_+_ZG`nv`<(t6ckGBPcP;Sg^ir4zaAj-NnwJb zq|bjhCRz0Hx6n|wZCDTENP;s^l@AmgyxhIy$JurL{z~!gv1nY)wuztL+wB{@@+SOB zAnZUKc?8Qm@HUQZJ20eh{O7$EjENiX+srB*IZ~1bUZ&(hSnPU&z54g6CX>`?tsn zA~i1x&_Il3pgmg&m=N78Sm zyVW?2;Bc!qA!UDSVI*>QVuQ4ur4pBoggbJwq1U4P|K(akjzqzDbZ&)pH@p|7ZJ2M> zo{)sc<7+o~Sk-xzzZkRl5~V4Se+#D3lK8BV^a`aZo)A2{L$rVHenn{g?XPJ;f8Fme zk^j9nkfb1xt*exBnPTCoR9jQrJAz-iu**5w0iSg&=eq@InrpV9R`Rkk;oA3VzKv_R z*kmg!*9ctYrReejnDas>ks={3xw}dKE$$Dz-0Lq-h}!e;El*r+6N6aE65(MYKDy#3Jf7 zfyvLMj8cg4;5pQppVxyWp;-{)8FQ#-T3`*)!a*zR`}(rob|fluVW!)DHu5s$aYzFn zGf{;V_0JsNQF8x2;gwh9KMTRabmR2LC#*+XD+gU`qF_XZO)CveirGM26s%j?OU^_K zErb)fX!`T@+ig(=fDoH;O!hCCgGf~&zF z#@$_@Z8%WElPVsJ0BP6BwtSxCC(@uR2_!m>X-bxu5(p%UPP! zS?0r+?Y&Tv-?_qXZ?M9)*Tbww3UD`cUN^z|xCVf7yT8DR4ZMU$Z_?AHYqzV>@Jk;t z=WY5UObd!Yb{}NnurIjLuZZ1h+?zUzfBmj2?-ay8i4_kxWx_E_-PBjZ?JKA}@duaC z^zU6yj%hxL0bsP`J9PR2=4_O@0>v{qcjzC8ZJM76zISSCH?%~xQfO}j*q(km;M5Zg z8TRiqxgM~V*$D)!5A^-8%&wlm-@3Rajfu5G2gRTz=|-aT3n!F@cNI%Gj@^lGaf*CAu)e+~P}xX_y&&I?U$ z1D|+x-t`{%WsJ-_n5{r@oW@cBN95!&;wIYs^Vxy+7W(0BGZ;hG2^^+h?b=_kkBW2@ znm=A^OqL>V5qXKDhcmBDOYm_*sq~fjTaBiYUm=hS2CmB`(7!R6YjZrsTBjPbL7JAjrkV_!s$0*z0Y5j%f1^vhd z0I}-5eWq+GG64%AIv?XA^IKv0fmpLtQ+~r-w0vG!ene&xAg2TVfrwJ3VQt<7B>P#S zyIuTy`3!iCqhAiZ-+Jj)Ks#TI?QlNzq0ce@*2C|ul4nri`w(Z=dauHYC00*VBL9EY zyrKvimS6zw%7FOU0;~cXv#N|TRx#_IN2?1@PEGk0SZW5lAQdG;t~MK0k~;RPK4jhS zy>PhBmNv=l{LuUhO8aDt3g6FM;3d0p&b7C4{HLV@OcqCTlsyAi!J~+=&pJCltPgnB zN)^b>k@hlZ@~9n8!Wn-UsaO)BGi;6xm@D5EaqBaY&m(V;?*tslzL2nNR4ZK)kt$$6 zd0Lxn5Z^m4_rTY0rNDfRN6rv{|BRvOq+T9)ljgMT}0Xz&je6d&$42K=2=T(M90>5=Y7tGss_2nDaI!{c^ zf75W0!9V!8f*IJ~SHyqe!xRJ9(329G8fVu^1s4Ytzvfr+5z@YfP~aS--QA}_j8BQg zbcufFJTfvyM}#qcn4`HI8McGo_fPZvy2@|^?re<}>ux;mGd$S@rnNBTLRHG=8JbD@ zZX~Bxt(Zw*we5ZJEVjt*6pXJ9u*qmBvuz-Dg2WMxM$%$aP31M-{^1QU-X`)S8(dr# znXrV*aZPWrW8odjYIeA+zomgq3sCrZtG{ws8ouWaLq62PM3RW5H)S5r+e(TQIcDq~ zV?8i=2rk#FoOGfvrp6s?Fv~E>DcnBHS&5AVx1OB*D)T$oD${j72x5FbEfOMeQAvDtCJ}Id-{33^vf^;0ZyDrqhWcv$z5C%}+}LK{SUzCR zcTg_ag9Fg9QU*H<2OK@tP@-;q|9Lg7-y%#Au$mL!b=*AOG=W2?_!5ZY#u5}EVeR$j zt+P~nxmmc3-jEPc4W5U(ur$nD5sG5q>;0*PT7xWpTB4DYe(>H9h682lZwX~THRe8g zUICrBR;0VLG^68|l-aTT6BBK3`V(wXl$nkB8Sk9+#I{oYYp)4)2 z{%j(O4ad1fI%U`^6I$9c^2v~+DqNfAWbSo7VlB-(XJqjU=Wm58a{}YQ^ z@}#&MnG*BE>y4<;^%^mDJcYA0(Qsf(I08Jr3N&>&E@9$C;^J>{64TB(cLXvyhW8FQ zdg{sWMAoQ07u^0g@R9LX>Dg>E@*CFA1D!1D0oHAaBpDtfdj}HGl?Bne3BsL)x)T82 zcqwQy#s71Pr{opK?Y3xf&UqK znFWwVBRzb$fdq~bm+T%^ZY-gi?e6CxgbK%XSL6_I6MMuyH0U9~7c6T1?4Mfa0azV+ z9<-+XjTPoVhNljx)!1S8`w|T3D1}S|MJ#7xlDY9dPaAEdesJB;gc;DKd>5Mj?Hl_! zINZP6X>(z|F`87S3~pANZX3%a^-6wo+w0X~4uwBH9Thp{*SWJ*=yjsLppOe~^0M~b z>c>ET?_gPV+UKo8t^m{K$DQvl-HzxLZoeE3ZbN_=2I<-8c5qB3^YiK5PQRpeO)TI} zgr!e`1Nx0->gYMozs=5@frwXJL7rZud5zzat(>gJ=NE++cd2{o=ZT)O6L^Y6#`=0( ziAg#y*J-q+Sp}#MJ}W`{j8W!xj7;5?_j`80>QI!2KG@=yIEb6P{*i$DaTDs?p*Lg( zKY$g85Wh0N!{|0wPugsb3?tHF$Tf6QXBcqu^tSZw@n~(kC^*^54knKIOSG>A-Bd|g z7swaHGW+v_jP1Lu!EmaWvwL4u0Au#&Z0jupia1ql20lbdK~p5v69(9mO85Jq4IZiH zKYi7^2H@TBHh^;;^wtnxJGmOs>3~$L()GdP=cAbdD`QeYK*p$07_=gJ* zlk0W(%&^l_=33_8xNW$L9GISO?Ul_}Js7B0Iqqa?z`X`nbNU1S!&9fp*RbR7$FXR2 z-?GMk06SXFtx8Pfr_5PTpFG>TJ=)&uL^K@V)(|yNX1{Pwr#t7t?r?^u{FK=}#Gw{c zb|k)UUfny-*b-FQSExP6FpvjAj(1ssyAl=(Q&zPN@ps%X0OJcc8x$nF)1HI13yJ53 zt?p*SlXey;^&m&HtIEFK_;nAZ8SeBdkR)pd*J}1Seb1O_-O`c+pYW?rvoEINeq({N zm|L;Gf`Y~uY4WbIB%WgxG~&U zA~XHIaCu;ab=1bd$k-A%`WhW@7jUe#tV`oIPU>bAu$s0DWr$R!kDbomC2H`c+SK0> zRD^tjx`1-G{JZtK@y=bRTO*lEW`fr9>RA<>v@y#`AizWVt751 zC=DFa)fqWF-Sxg1i6PEC_42`^$3oamgeV>se{$%=9dKOM|6>J~K#z?u6eka9Dl{Cp z(~q$-6rnSbT;qa$FEW)x8r!_?6|_P&HHx8z-wRhl37x2oLLT-qAKc%jVI=KJxF0ZFubuy#_1Un%V&){e9V=PK=m(pLCb7LP?b)r zfj3?ETH1edIo7{~BL*V&p`$(76sX}2s|Qo>Fv^O+*Da>lxOIv%(c+aIFm28QF}ohu zkEvYWyOpdMC!cPnuaIx91U56PL1SlHidiWoW$wqMOnm6`RxDj`4k}eoxk?6-Bm~aL_3Wvau$cmLUKtXOeWa_n4g#*#<@G7g zn6JnOtCmPC5~ehQ6hcaIHHh*DcvjcfXpS~?(qR;MAFYhEVQDUpcFl3!@7j&FiO`J6 zlgD2cb2pcVjyu*I7yl~m%e^Me)_4Dz@ZKe4RShc9P&9}3V=vh)mrn-S8;J|73^MT1 z&%)QJ5m04OABp}5-|-n>mc$R!zCET@5fVnh=aSR?soA%u z6RE>UWU2*OGz*>sYn!6#!0K=#8=}Spi$LNKJZ|0!mFge6V(+9*vlcw8Z_ z>dURDQ-B$EK3FMrzQxUTrz-Z-56|Eem)T&vpw>#TfbDsO+)({bnf$o1g3}~@F(zpx z-9nQ26wwfCq;yl7Vsft1fF<3)8)KZqDfTZP#i1qXC=|;Q;ho&MPexEoFQL%y+1nkCQ?GB$mxI`6wu@Xl)IF}>YU~5O z!7Ru@MK!S=9uE^>YQvz#*k8haFr@#wEb*yTL z%=6aA7N2-NwzCXnMNNZb6Y&s zKb(%oOJ$gJ(V)uN&A)mNyYm32c9Nrpt8@`Qsg1&n{U6V7gG#Ozj<&@=Pa@Z8!4sVI zS3qsMt*-Rg5bj2{*+66dH#72%a0uM(eKc5k%L&!i?0m&mJ+Y4` ztUJs-p}`l`!y6nW-4{2MrONj`o8<3CjhRD1H|9NUJ5Ee`|J_X=llw`7SbNcDV3YZ&)AvhwwmGGX1Ew z=^z-gUutN)U(wxWyIgg0tW-B+$8wGZ8Zsfpog!*_j2r`=zNB_ekd$6t?(=JM5hWg?yQ)(QagmIj;xwx!+5mn@RjYOBcS+$j;aCl~z9a>95eRW=) zoSY1=i%qt`PQm1eSHSQR2l!bV6*O#UJ)rqu{v?TGl)p|>7W>`1qShJ?`=XoTO?yPw zw>Hj;E`P|=R>IEOWadaHAv6Kj?C%gSRm&LzjQmDHhYj(!SanJk*BN-9MVAR^zg zcK;|qC@V?X!+$=4<31XtHHXD)hQ3J6Lc!n!YX?3wGbfL{OPh1H-SfewT;qid?n}w1 z`bv({XfHAfFOqd~*~ zQfsK$-uI?$dZMlwZFH5?52zSrcHRPul2}M~L))`f>mwl4JH;0zad#{Q?&(cXvK*qI=-<$Y^>SU`O?5;)3%Soe) zGrf4%=?5lvn-n#cDbHNWmFCHPFa^OrW%lpp{__`$#gpdb%{T?=nq_w>kqjQa~~*%);%p}jw7d&1W0_A7rMj4yO?$U9DnzTS)L&z zRpJ^XUgQ47p-g0}w#$G5uNGKwblgWt zc^mb-=BxNU3=dc@gtP!34ppL`7mM{AqUT zRAsuYRC+5wA30z2x6cHwo0FHEdI{RG`aNXP{6Zsa_te=4duK zO(LwCw@79%`x`Bbj?{~EJDPe%Q1)lEbA9r1@lIcl<4mt&BS@TdiPCWUpuxeS;v6a* zn`k>NXdH+9(;Um7x>1ydubb!uVqnthYJ837+~D;t+Zy_|fO&yW6nUBj%%*;mVSJ!O zlL-ztFBY8HWMmR&;M1qOhO98kGYv_UdfAtVx6SypUEgkV%Puv3)#{`{W0O}#Uvd@?N z)wsR3`$mWg7gyq^qm4k}<)HOu;tiMfsz$|o55v~2_qTkoQ(dQK@8LDz8EsBaP9ZB# z(W|3Pjhm4vr=SN+IlJHO#xO3pAy!ggo8)gF#-rS{XNv`MoiraE+iOA==7s7Y)iN|Z zAi_)9&x0{2eiLV&qlK<;^q)O*7zJ2`ZT&Is17PxdG|=Vyg1q-^eDL$I4vs%3gZv@* z!5i7eWEi}UE70H3U~j1`aF=Sjy;IPUO^MIQ(0sS41t|<5apDpi4RuICEgU%`eKamI zA^M|WHuP6DvA)mq4vl1Q9mbm^ZvCc%4FLTwlgBIj8tzf}hu_vZs9c-IJLCeZ-Tp#tM=QkhM#z5`)l0LEE$Iwji1?KdyU(+3Y?P7nOlvEe)uGi<2+;iL*4e>o z+F15n>4#%;A`N;#YR{W=-uw4v`|(f1M*jPW3mFHnX0OExzOS#O9c6bE=q45iSTnEh z_lY*B0RqQ``NC(P&`2it7ryPpHAPGDzSFx6*`#fZM6pm+kvt)OFs`5ZWe(h*uu8DO zrN3qK0?&FzT2=DVD1PAwF<^Bq>k?Ow+%lVbei@q(@%gBac>DU@O649u!wk=o))amNp0x~(9`Nd1p6uR*RG zRx9`0>D?HT5*XmNmx?i{qc#w9LGB-P|LMIy!sp}mGLOhqFAJs;q!#DB$Xa9t$r)U*^KH*%T2RivmD3_lC zMXswk*~hxZ_?B=o?oAVil~c{z+kdO?44*Ng#K#Z^7&UV_h6$M`R&fF%#?ukOR5z(P zM+c=AyN|R9Ppw?|pH5AxwtrN7`D#Toxzyf%T6h`=f2Vz`a4!K)iIO zj!5z6EcRwql9<}s*n6`#Gkjv1N34|_h+zUaCL=95IHt$GBd3HqmX>!b>Lmy5;k!_T zT1SHUv>~FE#=e3||8on&S3$gEKukfTq7L6mpGn;Nb`sH1{SH^V(e4oSXxA@I(fRVV0G2vwOh zx9+}jx{VZ7&DVvT!`+ziF~${9?r_C#e0{n@pfWZ3{)U=YMpnT%L9r#?m_7?z&A_r= zekmGt!ipBvDHV~CSq<|~vVgDOIC&I7;PPg+MDxo}Uk|(4lxN-2UU@J_se^gG=Tf^^ zJOB`}n7PK}8L^Bt7*Y$?TpiSI?V;#F^sKwYcs;t7CTMC|7>s#JUkR{T9g9_yJhVZM zeIlIV!q|Zca}a;(YnLKvWdN@`Lb;+u$auwk zWe^HKfAvd&ITG!m>O)M~&35jVvjd5iXB1uQI7^ag60e1@!DUmTo8%M2S8mW_2AdK> z&Z1UhN}BU-5-(@}UhNerdErba+eqx`5c|gI$JG2QHRo>90pyGXxavS3+CvCMHa(tZ zR+wUx=Y5W1Lk|dXOA|UkU2UO_<+BVbn=(%52W;@N5rN&vV#r{QpHYuKmyiUZX)#Lv z^brXm4j?l~>{%hGr(F5$=^#PWp{$Iv;XQ;s`bvtz6J=$zw-C@8h?WfNh9~~MbL)?A z!}Q~ES&g!>?-Biv6T_x5J1N;z$Td0z_~ZBQu6Jqu&RvM&pN*UyjjcG5S#s6)}rHFcvsm#OZTonlZK#FE&xbVtZH>w@?i#WP^ z4ni*u4gojjs9HZcU)Ae=LzCnUckO8CEbn06ZPxwFo~zS@Iofu=@QK}t%o|-bCcrU6 z-cz^M!%rBn7+a{=;>jSNF@bqQo5Dvsp(?WA#{qKtd0LKjRVk4tVQR+FC{?0qGqI-q zHzyL+q?n2C%3sr{hEDA2?_`LchvK$y(I6;+9RQFPB2-T9FuF7(wWEoPA?>-8F|Z%P zCYqt0w_a4woUm4WzbEw2^-mo+L`rmJi_U4Gv)UY_g)w94{A6b;uSg7cWe(d)8sYU zOHg?{5R+UkTMRcAxS_Bfghig?$1@k0RO?yW@$2KH%U1}tmDl*V;8z%UsrMK1-|T3v zmrA&ST`#7HVs4f}*97?qW_ zaJp88oikB@hfWV`H;=P#;4%e&v{v?Fl*pYU?|<0l0Rk33P$^i%D`wO}0m!M!;JcX}z!#?AJBh^GO?dSs zXrYxwwIPl4n21(>(8;2d#48~Vs+A?@eZ7|oJN8^%mG(gm58e*vq0Mp#LQzn|pVA_2 z__{XMgs=7`?GNxG|Mffk^aiBZ)G&xt|0m5ec^ARhZio(iVjWi&EJ1_y;h3WE>#%T? z=9WA4nTqpxXiU8NO?dkolp~)AxUo3y)8V-lC^ptAaer>OJ?_oBOz05Nk8ztAhf-}5 zWydO*mQXOs96IUu{q%Y?NaKeU+VXc{U*kN!SS-J7Fw5=W9 z2Kxsrytzkb+J21mJDGv@oo7bvvS_ygRLcfIGq+goXL>rQ(x0Ig>I!9qJJ-|`62sIs zKZAEWIAf8t%DWUyaL@MyJfr-v4fB>!N3iN`L(+bZB3H$w7zR6gU1YF&5;`6`ulQZ< zu})S4stNVQ@N7w;6IZZsEOs6tXRA4!-@sz*-cTUQzRv-Obn*_Er|_#Ar?N1FXnquz5DlOlR=W?C=79Qs^B(f^pF@g zfsJJgrxw=TSZ$FLJIorllUUF2tX7nKRA&<3{rYP3BBaKHDqcL~efMzZ#n1{>Hq-qL z6SPUber#w2CqAoMA8J8x_^}FUG{jD07oHGtkw}WP z&=bp$np30KWN#~}qee1Tzfy?Gw7sc~OQ4Fw9uuXHJ)r%t9>|W=u9lQ6@$}V=k9MsG zFg>Zy{`hM1VGkDvV~&)cGD~lkf#8J6bDf(WzHMFZFnDjxoVk({2ApTi%q~}-DkUAL z@dwUVjN9xdU3G6r`+$4gg-=a3b3(8F*)hNUr37@T2FeL#wOedCN^%)7+rlV&#Qhw1 z#e5)<61Os8T+)fr?udfk{l}PZ=%`QKqtPN9#yqdFPX1ug`PSF|(aeSR%)ZQ%YV?%f!U_Yc0W+|^ z-nra&0W#U^c@)4G9Mz1$|o+Dj31 zK9NXgioQk=MbGH~Gjns}A?K$%RRVOra8L zw8~?juGpx#$d-?Y4x5lZrDdeb%Mh+44QeCnB$6J}SVaC8VkQLlN$v6CmPr z;wFw4`t)E2&5PWN$ekd7u}`&6GoY*3+EwVA!ae8#rz9mqi=(uKbW{ADiSo*J;*e+d zUNk@qxNUUq{De8)jz%0EgSlTgPd({V?R@sG(kjc(&)X>bq;SCZ>Tn)?5Cd%6E@%ut z&{y|#?&o0B3h^^nAM$jokq|w4k2h%^ew6>I zLE=|Bjc2vFZ3Zs}G=;k(FU0*webV;LN}Td7@3+alDcx!NqL}aSbMDK`$=?yhLXkw< z)<%_ZuG78XTZqr+?0~s^&Qd4Z7F)gI|JsKPvS8w^uG5~v1fIqq>Qr|ZnE4$63Mm?C zY_4~;4{z0qRceO90gQ|lV*+lEI5$I8(N#^T&crEX%Hzz)gFuq-VXwVI#7c&y(VmoT zIK0*DkwRTEXRH||c)tYi8LqvXoc@j)LdxaH{;|ob5Wm;ww(AR$0S*)rD{OlyZx65( zQvLqhP#9`MJYR{G!r_5}WA3;QB^U2(_vn8j7ReOT>#NKbTpKDw*$!=r-K6I?|7)LR zdkWrcV2M8?4)e!wQLq6Rv>$iDyTQsT(0~Lf@$&}9G=Q0L7O{2)g{XEYXL*#dF{wFc z9DK0L#N1QFc&~9Gy(JO#)d+0rNpY-3%lF}!$YuaB9F?p@x>llcz63QMq~*)# zaQwC^nM6koAEkm}d1}A<{L#+=g+Ikp9L$7cM-79 zO-OT4bNYWe!>Fj7YB*N=b2+G!ztD(Y0rRFUER|N>rtY&dI=l{omcQK#HSVN0i!6L| zZZQaO4FLqaAG_BSWNS$hvX^$3Q4t6k=xu$m4~Bq(C;NLjF@u7s#qblepDCpiS)sj? z!Qjavl%$)ebfoKVUm**9_b}aOjs>o5#oX2%Sm(&izkZpnDvjq}*=d=3yfIp|)#9hn zY^=X`6%(U!3RSy_@9e%w0Zm&Js%ubIp%fGA79e{GuNQM}V{OU&bcFPd3LSLI4nkq4Nhr> zQO?!bDw;1AVYo206hCX}ghOVbf%1AW#EW4CucYqA-~Z4oDteF;JH5B6eGX`)Izc|; zuSq3Zt5R}){4ve(yT~aG&iG!g;#70A9*L96?XfFQd0V`FLz=oY9bmHb}hl#pLDf$NZS5Es$JIJVLY z7F8tzK*G!AI>v9ES|kMBbX5Kp%g5%bo4_fT{?WVxtJOu(4 zf!`|Sw*T$+Kz*qIeaDMQ0IY9F)uH}3iEed zi*_yqPS`_9Gl2WcOC!Ijx8j_t=7U(S#!%2#<)AGG_KN~@N&RtlG*Jjh81N-zj!G1Q zu}*vb&6@PIyIbi5kP5QrUa3#FS;jecmVjFtjIeyE+0AKabhLtIuFgPq!lH#xBj~J5 zedn(`@AYY5MXw${k-17m`ytT zceST*hiJ&Af5sSb{SyS2WA--O;GoZ)s5PnH`Au{5s9r@w`qVwqe2r*IKZV>4mkBw; zGQ5!s8Qc8*e(?+?1VW328Qu^pHys7C%Ck`!kZELMHCygbfSrO{Z+(S z|Hr+a#Tvq!#Tza>Z{Hj?0?Hf^#{1|TAu5>gT;kwUa6+Z{eL$p#?t=LNa9~hQk52apKfuyA88=XX#Q@u z_ebI`h0+gmjAitAz>oaj$RRokpK=GGHA)xJ9V0@7(IvI2w}Wc%Xq?U*J7Q(0_+r?SEjyL|1Z+ zH`n%cgw{!f@(&kM6417}W2i&`O5@IKV)!+pAoDw|rZF-uSq(Ck{xoz!Iqmv&5%o@- z_CrbLePZ*3`E0%^PJ^QxTbe*$v4#3{0n_GY9Z+puOAUPKdRQ!MO60!$rq*a zOyqwm@=kQU`Rc$1%V(Ln`KyUdx^cEs)5AuuyZ+Ce9%vxW(b9*b0Ysd|-Xh=rh%7wk z^pIFx2RO%a%V~7eEX?nId>ejQ0+s1%s&7$F|AyhtbXzBT3cP!gT$?uJ-u!|~fqh_Y zQ4I`In95hbw%u=Sm~gtzl8o_@d=lcDjbonXPB$A;W~f( zXkL)h|6;Cu%|pZ0Ex%|LRDD?!ckCfGn!<9`)Z*}XRm}DCQ8`Nsyn+odPYPo>{cq1f zQX5t@tTTBk#pBya%$hsG1#yasep1LeMMbw0^BU=Qy!JCr1|ZB@@_$c?OGLDuZ`$8Z z|J}PXaiaUp_N$p~isc&BRGJkh*7w=jUh-3wcFRt8*}pu*ltDz5SVTnPhib|oR7b8b$)hEzBev)lxMC+xG&_pE=X@5 zgna)|sKLUy%`=D1YX)^-sdAVNA zS?_B{UiCQpcr;b}c!x>}DlQ>ldNYR%5Nl{1GRZr{NJbECK#n z&P_%&ku0{9T;(6yV_>y^(E5r9US4AOTu08}_|#2_LF=#KpIpX65sy8Qu83BP(9a;q zLEF%7a!dvw%|fyHIyBAeh%K{x8HQ)I$F3YpW$=ABbRW0$lWCvWwiJSYZ{gnBK1#-Fp5qVoJyo^DfMs6{wHw%Cwfz==t1ig9U!L0anwOF zy|1G6T*X}QgRR_~KC*={@Q`8AZ<&4N^i(1o@)Z_Iu}DuJ9M%!5v?hs$r;^I@)7EqB zt^p-Tsm4!#sC9proX}p_HR)cLAk(TH6oRfw;`E-dXRR$5Ux!Erex&7rst#JFViskSz5{X9XDm>4HnV^EIG@Sz{uQ>)|N+V-3 z%y;l3ESPd3(w=Nu75gPUe|$_fu&Z9oD=tWh3$4Bc(wOiZ^^1DTwvhVB>dzh-pRG8` zDfl?tU2R(RlUJ-mrmbqv|W`2b>89<*F_rmYgqH@9^Ap*1ZFj0M5APup!)C6ovwG%mUIyZLVFA?4VO95Vl22{<}buPLf(Zel)?Ni;ZQ!YuM! z6f85UD(94Upeu{@I(4Lv;m{iEqaN>khrBL!*!vPeWILuURjq`;!i7BhcV ziw8k8W!k?&3o{V4^<-s$)2p9m8xe_~uKdr72z$P1iH)6ELCfIV)&FjME&&dzl6E3W zQ7VK}SRo-F5(NT9OivG!@OxZ0HvFDOFRIl5da$FM4w&(+LcUvL-FZSm4%c4$&>V%? z2ntP3YMQ>8=RHV@WTVYi3nsG&l*J!_7&urxbEgiswIo#)<5e^|U-U7RK4~^p`?I6@ zy4KW1WO9PA9I_Wn5)A?jlDCeWXljy&6{Q$}YbpobM-MdYt}kY~ou33+bA;n7L@!BmDqZ%xW+A@Cslbw+z14%+67Z{=A7h=C&5Rd#cx2X=zH zZ*SGC1+o3?nojrfy6@9(@BDB8x(h$M9D44EV@hqbJuJxi$mze>YDxyeK7XU`G#t8G ztfw*$w_mH*w6s5^IQ}wx8+Wh6&%Njw-bnU+Ip*Jh`i)!^q5{wRHN#p`|Q;B8c^%6qAk(}p3Ec7kTK zyJy))oiTo~=CHL#8Z~639~F_b(%L;hf{&(aPcM|r5BWbKmcaRLk;J^HX2W?&bvilg zBvO_JqqBM(?wa#ca_n)q9p6r;45qfn=<;dBEHU8z1t{^5J;BH{W?9%>N4hr zmcixEb3ts4WH&Jv1b>4NnGLvnN%}lK@NYHqPf7FdMMVw<-Xt{%Y1HOFf9!E&Mq^&t z$z3o{Z%PeVgJm#{efDh=e3tsG2CYMyxfG-qZs)e|$#+?8bG0Y5-dQfw9Gc>15AcJK zpQc{aaP>V-6SXJ>7qxugU{7ss3axW%r*#9R!CzvxXSAyWSvejrn|iGP%RszVudIKM zZHa}|^Ryiz)TtG{#(nu?Tm4Ig%{rdV%5lxHQkPYxcEGq098Yi&&|0dZJasHuA6+5c zZblATo4;{wscCvDv1YQf(3H8ekD*c7;B!?$t%vVbnpG{v9cU5 zY|Cf%JQbcL0k2AerE0qK^|bv{egX3eg9qzB0b5f(_dZp>6C6Vr)cO@;`f4URu}+0M zZyRx3K|xT=@0QG~1fD^w3_8A%o$uY6u2+yDN80fn-8w_>9b*ANGm#qAPx4P*y3~q< zFx6spv&*S4~NKK)IEzRx+R8RSDx+L<;rZZ1+uzT@_=KY$mhr_B%ef0k?}1Z1T( zJCpSPn`%J9K!F!?E9U<#9CKK=BHUi8)=y?nm-CCicNA9LyFT?XyRKq3h(qZRaE)?> z;CX>A$Dke^kNBNbO`*W^R&X?8EQ}&dDl^d=I&?(_+Jo8+uqLO5!lW-C!_F)-i@By{qAbP^&K~VHLuXH$efu+Z+XYGn@{k#ds%M|CMW!X z>$JHhrFQ&5{8I@?U>yl#5VPlM+FW0ysX7uIG`jqjQ}h21ZC@Q1)zCY|uLF@fTOdWWn#AvEI#Ribr1CMbA)Gwe#=7>?`42WY zmfc@(-`XCiyUGC5DtGX%tm-0JS+MCPLr#SSIkORfMDz}a8o5o+%8a5c2)gnksA~&hEDQK9Dzba|CNIo&oaOUXR#;g4vhL?mH0Ux} za^!~wEjXD_Rh7{ulFrTO&#$E*K=V$4=v729@CfKlwI*omu+U3nJ2G)xB>=7CJc_0sO=P_{L6!EmU zEqMW7fjm{jhv`b?;f(<`K}p{(wNjd*e9Zukq}H8)qv|RWO0p!t%#V8X1LEARnx2hAw9P zHhK|iUjEM5V`L}!innQl;tBH;=T2KhbC4s14iysy+xGffV6TXTKvtPqL~+M0AM z#^g?cJfM6pvN#Bjr+M_ic9#MUCk3rFL3V|D0(KEWy+f&)U;C5zJN1>SqK6PtUMY>S z>M^~8`7*kiLxJauL)cnE zJ9;ArCI7hK;_WZne8Y1{gDoaXh6@Tp>fnE(qO2Rhi3tNVc#hC;_@k=67*&5a@t_3= zj?ONqdPV9r6e2@8)Bmu?C|mx0C6!2-E5j`}FFLnf^Z?AE-`Ib?Ojy+IDV1QcV`}`s z4p~e)u>r>pn0)DAL%02+A@xueP)YUyvD&?m5h4)dfiQI=7eu)faTHwL7K4-r@}861 z89;Is4XQ^UfN}DnRvPYGH4jteFd&=!h8K8R;RaL6`&LvR!Tg9xg>zjM+f{FFdzcZg z)Vk6=F-Pbf^)>@}(&3Dc(qj2bs#Ue;phS1#ZR~g)F1u&|=i9P{J{O359b;PM?ZgMQ z@rnjC7SNUW>lpW(rD4Y2-6BOfg|)cYs0`DF?aW7w&%Y$ap8l4aUnG--8E6ySPLL-r zxOeNu@8Qya0?~)s6n(3j#^T-Y-V6(4dxps8*SV${Z0Y2- zm-%N?L$W!N!`KHY(VuIxJHEmY^`o|aD|TueD==D3kIoHo%E%*wBLcLk2yOu=OfK5- z3UnQc{oT|~-cnVx6@n5kIH!!GOo*^jat;!yTS%FE)M?$YtBF2HmJ0n`$UYHqym}0?k z&EWVNky|ag9*3qr`GFuG0z}j2$5DAOWp6D?XTA4cVzm<1^-gktE_dI{&X;> z3L9ul-O&cop-V^2y~LjE7lUP^P8T7z6c*)~nm#ydh+_{oe<~9DBp<9(t=#5QkU+f= zo4|@zqo7O}Pjp`T+h8+J4zJW5T3b9-%If~-9sVQ>tMdu+StlWSQxZG9F;Mt+-+|Qj z;xxcpLzkq^hu>_X9MP~!2!TM#92VOUSi(525n|6X6n~sqmnKnUb) zYeFe0ORA+~>KT>UAVtxng$_wPo2d?C-e|Y~y9A`>OQniW!uHR@T zb<16j$`U%kIANt#<4;h;>*m_B<7j$VLv19kw>*_&n;@;1BZ-!(&lX~eKX(4sxl_M< z6b^1ZTJN!)S~D<*zNbn~Ak(elNwKj06!x|>6MAansB!@{|A|IrfB$-1SxtJE?o(D) z7(oWLN^5rZu&KPD&Q47|Vv_uaqi#K42&EwbA4syF!y+7lB2hX)802c|5FA3SwV5nN3uV} zFSvV-NA!=V;y+=>-+g+ok6VNX*5@QImPa!#b^Uaxe-4388!st-^qmNvR{NZ({&x)O z&rARKiKQFQpGeDHy@{=xBF^z&$Y|lBla0=>q9P7Ru%_#;$jD#wt=}~vOQ$K{&$Q>> z|CTLin7OX69Cr?kIxOuhFJtJ=DLpEeH!xOxr}F^U!U$nI$gRy7F0Wm zS-pwq!ZX5u^He!N!V&6PLI1Gg|E*Ei>1G0pR8=h=Y59@m|HZ}ry@>o@;{iZz+b4;C zGd(f?_vPiu?t+4XW@{pHDk-<8^=$(G#bDnX`A<&jvT7Cr7*OY?Xj3l3Usd|QC-}Q9 zeR%&oFvm+GE`P!J|3Q;19<_=7@)Ll0Tvu(%_lb^_ApRs#Q}T-z{m1Xq0hvGHFIyX6 z7e2e_cBkMES;l{trS6-RG4g+y%YXkm3j_}^=^Z2Z%QnBh>~zn+18(N+ihm>J|6?tm zeEp8Zl@Rx=(EqY1AI<^aVeE;F`|m;jk6rm+s+sx*s1>joQzQ=l`U3mU5icw*%E`-z z0AFojy7hSf3>Qx;>tN2oDwwp5XOLYVu4HCzL+(9QVd`wDUi<7B z6W1s9am3DDVP=(%tk>$f>V+41iWRhPv~~4FTPMeHz?aM#a(#JLh6;4Fmu4n^MX6XS z0WjaI}5EVYgwv+*AJJbXc*7V z0^KD^jzxA+^xBpDkV3&ULZg&VGmMr9B}i3ge@nJonYg_XmEcDOSU}z25)@%-E1eCD zNneLQkDir@PHW_AFAsm)jsa&>{lw5a|5gE3>zv-hpDU-Ss$muM(ZRRl(8W^&u!6hV ziTNizWR}F?SmUmFL3<<*ZQ`un0w`Q58c2uOqA0vvA6R-qPh0awYn}x<3~*NDtq)fQ zt&i8#WX8#>YeZ?`vURG*2_2#=OMMiS+W>wt&WNwU2N2~hi=Diox2x~mIj!J2f|Qd6 zX_TjD+Hy{GOESF1`!yq%ygpq7Zo!s#QDhNw(GFe+kQKg4R4hA+1`g8Ju3sHvQq9*n zeCM3C_vLv@4nZT=uKuWJvj5K&^~n*wODB=mk80wX{+eD=a5ml(DK$ct5v}5935h%Q zbbikLq@HbGWHv~x9Y=2Y@9y5(Zazl0cUN6veR>5mabx!@<-?k@Of!eMvpwR8a@jS5 z-{9}r4Nv>n3GP01`#d$+3mbss@OE__h$`{%iyah0KTVrK-!tv8$>o35Ao4~5llJW$ zzdQOSd4sy8=W-!A!Ly9qYgrm!kDOo(!)&pI{NceD4PjI7II8MJ46-@Lbm{Vg?xJgp zE7k`K&HNE46xF4hd};t9zMAy);Etv6o+tgS7~wUv1b0uM;7|3^|MB-Kex?~~!kYgv zdavi>T}dt5gXKv{N_UN-?XIT$Q^p-0kfpju}oeM=w zLU{3?swm;H)9EnVE0GYXUZp3v*rqE z%?9jqD8ISweeKCk(qELILUjmV7x3e=L@~k7;DYJob57s9-7GLd*%NAfmi@&c1&Bn3 zK?-OD8UVA&*Id28MfakMcX{;UUx7Q1pHC1BT9xIM^9>)#&yU^mrI62HSPuBv`e#Yf zadD}rs;UOyfLE%M<%B~c&q|Oa*vI*{mCy7lMfRJY9r{ch&A4NDhn=PMM)(heNL6~c zp&$y_1XG35aK1{AtJ3H9gmDaD9P6G^MfgmF6WaS4Y172`DBT^yz{G{OXw5b<(AXZ9S6|b74><3#rx&W0} zlagGPVV7_=Zq$+TKGgMSzVK>O>BaU2f_-oK?FbyO)5dcHu2}QNi{*>!V+HXdjvB{! zkfxeri;5cNA{&ZR60I`C#rF%-fk=YDb3b!C{@lz!9>Wsrb+)Y-SK=0WQtOn@4oP6_ zrc#gDSIP?^xBwJ=Zayz^Dm#6q#+qxDwe9dERwptp8swW`-&a(|-?0RMO#8aWE+1LR zJ95rr49f1e7EIGM_Dr%2=f95%Q_63T@EqoI{A}A_`Bgpn(0X4wuEwyeVB#IahHAbn z0FjwAUanA-E1TIR^i@?AucQD9Rm_K7ISPx>cA9R>h-zg`4R-q;ILA8OJU4p~m#)z&J$sHxVo7ETi zKin`;azs2K^{n#l=GCI9$KB^0Ha2tRzUg8&Wx3YkqkJ%xn@Ri(4Rg3sS$M z^Gt_#!mn!<0DQOx_f=li3rI4BY|}@KK12+8i#sP_lr1^(Lcxlq#)mcRaooOTnC(=~ ziY$jf2ku!kpZ>AXX+h#(PQ*|V`B5AMuvLo5RqY5B1iK6OXtC$o>QqLOz(fXEIib?N ztcyEk10Tel6?kalYOT>?oupaofqytZ{Z{|D4nRm_gR{Mp!@eVSqN@a9@L+hMUYB{d zIM}W&hIOf70DY;xit>Z;2>K1@k{4ech2>+1e(+oI-mw`Zl_+BPDvUoXqs(2UJ|~?7 zim4hpkI#Tih}dVfB9?%8I1eBP>-J-W&(*#XPV}_^70K6B-QWHMib-ZQg zKLQmOt2S@rN1g5?PetpTF%1<@#7>Qs+FVef+e{D4s+?nGJd)e2i!B!U1;10S5SK(6 zf)mGUpKfxrV(a8-?sKd<)!9R3;OLFOsfto6k>^sv<7G;8_ntN6F9fT^v_ZrR%JU^@ zjyE(73Wamy)SV>4T+SgeaDbINAkYa&QHBp?r?UprN};ao;oPi(^FnnOhwWlJc~bD% zB*r%;TQfXIqNr4CZ`|PAt}WpA?;33+K2PY3ZNU^U7^n~hGMCI*=w`XMR}ZCdBhMB4W6x2w?Je=lTuz$ryW@|hBB{4L;ONh|d&YV9=tJC< zpT^O$L?kq0w8*_Vi;EI1 z4*^RlUms6iCojtXCTrLpAe%keedS3_8J}l__fT!gj)(v!y`t6;Bs%WB7M~}|qqs*! zB{qOLGqli=&Ei16y>_5d>ia`iRiFpf#4noR0DJqDddMMA3xHd$Pp0|>rR(tKu@fsX zGD5j5TCD|~`N?zHLctHqaM=akr{M|-H{9$;TGuWGWtKZ=3#;wP=3AcfnHz62?@WA&yRR&qu;to(---RTU_Vx%Sr)}41VkDO#xSx0#Ln>-u3}| zoF!ZLN}uCEQ{wntEkcD@>#XA1Uh6ECmy$)Z_)J$V&+*krp#8yb^FI`8fbVT);j-7G zJWi2og{`V$jVyZTLT8hMasS>1cWd}bur@bRU93!U8LHYCS-^XT6Bc0lD#(1QE=xi7 zL6>ts-IPGoIU|rKYMFLQYl?67F03iLv!OaaK|S}TKDA0d6$uTQMT@)t`0_x5@F%(b z)6;M%62rHLUNWy?#T#OLW7)U@)W@y`j8_u+=DpMc*C$^M)|*C%F;5Zg^zQX`ladIp zy7dOUvtj&{?!!ERwssy4d7^XJMLn84HWbhj;}$xkrgz#xB4cUFdOYp`kk^Vs9B8lH zZ!SYC;V88pSLL`54^JAyPZtlHR}CX104f_ggc-Z%0zVvDa`@D+heVR?i;VkHTysfP z{AtK^@$RE0Ysn8k&?%Yx3yX3dM+0gx91R|+Im#X9 zMwGuUlk`0R%p}6lnHHMn98Bmtwkmvf$k+9Js_o&EW&=hAgrnsi1C@R-IIFY4m7XT* z(74tU$~=W=Ar>Nc>Y8uRr?IJB1`o9J&r(6-vT^zNXrJ4HRtEX{B2|{1^0(K`CGO}D zc2b**-D@GXlp_9OiL+J}N44OhMrdJ|QxV%REftQcPA;14YbQP#gGZ4zl{#9lNs!!L z>7#4Uy%4BrQ-+ZCR9xV*e<@wUX1G#fv6zPCi4Nd3%y{%sRI%a#2{k;rw48pVe!1#0 zSa7hnXISNw>XO!59_ZF&r7xwT=ltQlu~xm5~NScYC#{?C7LQ-XXtHVe!IC zm7}-KBvK~Qhs05C&OZ0*$XQe8r}Yge`26@x5(&>OR@Dw#DSAw8T^3Ez$0jX6QI$lZ zt>=r&sWZb=6!$nuB5GPh!S(x;9fMC3(T}m1iXg15P!`;kWGTK^CC^gOeYco(>eynh zrb@}JN4#7kvnONTVK5swec;?34&f@F>4S4xC{Z%BcLDh=KEu2g+SGxEqq9}`Y$onh zAAH5`-QlQ$=2S8aqh+XRudJ~-D_RI>GsO8)L^^kM{Tx}iD{oj;7$1U&d9>ezlooal%LG<=Sq$lUmj) zw_0=SW#6k(vA!k~-Il__)B<~UoXn`k4Apj1_w5MKIVKabC}nJtMJv%IL%DlvGrxqh<$YQjo2|GHEj{UUVzL=E5tg|FNs>+5IJ z^OzK}%QWmf>J}X6EpIJHc#EYcSY+{17lt;BjAV!+@FzG{t*JpHad}TM1bNbyO)4#x zsP8C7gXFnZQp@^U*zqI@pXhHO0*9;f(DMFHD%FW0ThPWwLJH^DcjU|;&>t(9?&Y*p z4iB*zg!>eaL2j_#`!>aZiQ|7$uP7`{{pC>Esj;X+bvAU=d3VVP`@Aan`X|TH+UEPU zleA52tKJ32)O@?N=)TMAx(d9L)~%WF1d|z_vJD0F)(y4ARkxgu;lL%wv{?g^3k^0e zQrl_Tk80no&zt%D6mLy^fR~ky2R6bz!7b>|hK+PipJxlOXljO;ETkM4TrhWwb~zC* zM9?Cgj|J>d>`F=?ZtQ~xjYpxJDQ+pb>*`{>4XGQOyfdluiISA<(X9k*+ZKWOlC~u3 zOl7dzy0>1~$-^VOL+-{v$kR`x4J&gVac^i5q1T#@)_eIJdJ~B2jYn3^Jl;BwZTf>L zjwaLxiO4bhq^{FBg;r<{I-&wnw8uB+U@&f{?XvHX^?p?DJI4e|+HA?9EPXX$d1IVT zXQv{6D&7!)v~}o5-~cohu|M713LmFhoVf2;H~Lbkc#D_J{td59b&lhX)%H4{zkMd; zmJ%Y!Dl5ZH`VnqHk6Op35;!Sck5C;2BU%Ue`C?n7zh zczlnu8B}k|=ff>E1V{>%s`G0zKU{hKyparvUbC?Mo{kBK&{m^+P=m6CLbfu2yiiup zg^dWwr!KaQPoJZVsrYw%!{2(@mDFJxHJGY32h00O%Iig{6`*kJr;+3w&&0Dv&nW`A zBW56Tk97K|_;W*W9nwT>5Jy|)dQ1e+JoBWYy^NR|dtOAxIUJJtvuU2urf*zXs`<`p z$>WSr6*?pnJ3!GFL6aJsAfj+bFJEl3Drfn_@Tw{jE(-)Fbb65%6~1`7pU;Km<0x^m z0988fAg);9r-pUs9l7r5t3ay1cRu%o6=5|X<7?(==6 zHYO=TLpXGah97#K?_>6S@g4ttUCN+MO^Q;x_!1`2SOaQgP^axVHrHJ93wcuq_i!uI zS()-#eA&}-@9}|QZT-%cnY&BDjiW>}wnTiJ9`$(75M_jHFHK^NQcWwj-C$_^((BPbng>;fC?y-$*?$Q2i ziP+1dUtkl9Da%xjcF3&`U@00y5=fRToQryu9)Lz%V}>~7TO*J}CC`C!O+WUghH<1+Vg~sGzB4m4wsyTX?DNTwK(XWSQ`~~N z$yU_qL1J#*Si8F6kP$W;s0lA->r8|KjG9kSew(A0mK5&!mQ=Y6s*8{9q^_OGeVq=x zdz(q^=U^lu84Ed3ULpjuYn3SVxIcKJ*FoD<3ayx&k>;J%Wa5l97wg;vi@Te8uJqT` zU_>UuQ7DnhBZXJl8m8+rn=zV87@w7B1IA8(mx+7XwLz=b*~dG@B+TTrP5(X42oPyS z0HEBi@@VBbM@gnFAqz$Zn1u zdudLhA0K&jzE+MvjLbqZ2VrH( z1AQKACh@qN3LHa}&6WUVT?vwRLb$ORA~E|ChYJ|K8h0((yCbLB8x!TwgfMFr8@3#p z>u}SQsz>jAuQ`)Ac?eis2l?@#YQhHi`9yes0N}`!a~vn%T^Hq0h%RntvV29yqSUlZ zD=S7>AlkoF0!3V_SJ3+DeDPF6R%qr({&nXX)@<*Y=C@B?N?k}00y9m;sm zZfMcBps15$X%D?2oEXUATG!Ou7d;VEEsctZ466inYTHnGZ`jtC4D?0y1XTsTVIz>p zo`s%da$RXsl_HiE<@&6kS7lSFD~d7u^xLgNsFBJbGJQ`J;KG+qlrs(G`RE|I#(xA~-s@d|a=-qzCUji` zz&=KuIzUy&RdnpOIGs>mjXvEw&F_yrWWSt@yz2LHa^+I~Zb$YC%Z_*>^TUY)6ei&c z+wP^lCRgq^jNa6I-A^`un~KB)`t(%VFJ$AolsNKODUS&d~OrE#MJ%!?OIWb z8l{8K@~pXw-?uZU>m zjM_SwAmM~zViK^fd!pGKlkBnLq}9vi*G60B&ozIkvg0EkTP0vCUUBYU%P=lJOnh@> zAB;g_hDDJtjg0I}Utn2-8;J?UOtODYu(`(hWC?P$M*ug;QR#`ytFtj|jHRzem9*QF z<-nqtV3?Of`%}-hK$&&Yx|_gGy<%(l9SqBI)ZPEg9@k(WDv(qeIS`{7@%8;-LY7oU zM>=lFc4~ptC;=RP z+jonX$Qo+C1{4zsUvnpUhW{3z@j`)uS?jc*RH-74>UYQ}=0^6H4Bu}P*zPg9iK*@| z-&ot|P@065`T`TS+#Qz}*NC-Yg`J>j5wXDbmOS&CfRthWn5|BUHKBy6DW zk?DA`Y3(uS+u4)Qg?=_}y0$7WMgVAi?=JR>G&qw-HxXOD)7})`WyZ z$eQAzFYZz-U66AUgPnH*ql2cdY#y~V5Gd{5tQZIj65(BsXiF0>U8_Efxf7hoKc{PZ zU_P^@Bw|id$8HeI=ooA2vC#^)>$;4}zw=(W$BMNcIN_b848&LN_~~_SGu==!)T+&y znJ;Q2J95lL&CJT5aN65S=X3pDi#&WRV3pHB!dXZLp!-+KBmkux3|MD)d5!^dFFG=> zV^=Cci98;EYHMPC^Fp!M84&wnd+6;df>=?tsTDw(Imo7aijz{F@>DxDFBaK&4}b$h zcHxXq?khp16A>M?v}PY-UZ3#?yZB&@>5Co}q&^h^h`N;m-FxmQ84sx>NVX>J9e7p- zVU-lTxki~fUvQ? zT{RJ4b8D+S&2iGsFSheyW@gJCvy@a`1I|(;W8?s97rhqLyjwA`%M*RBmbZvWC(Evc zP`XE_R7&j7_^kz9U)Wl=c@fs1WWBRk2IFX?x#|idczcrZU^;lq%b*r*4mln-^=L@B zgtjsW68Rcm`v6nY&~8sAG<@6U$5##C8`orS1{xjQS3P zYZBJ|w`HyaG=Z9gQk41Ithhd=Vp<+_6Zi|l>vzMt`qGfrF~ybp<#%{|hwouMukQ($r1pkmy~}ly zz_79w1KfVj(N---ie<48xbKI`sbkK;WudQ^Q8)LizDcR&ZovsV@c`^hoMuF0^?K=^ zmHqNf75O8y#2ZN?@}I6w@gRQPRj`guZ(ZVTXjU}y%8Gx7pzvuM(E}WT*Y~y>XjJ=i zrGX+4>`lh-8>i1lTPFb3BN#l;-xnmz`?%i~U6W3(oA)74;_UuHmizYU(4M~iS6Jq} zt!qd9Aka>kq!j(Zyl7>na68#LH1|8CC@OA=C2%mtni(N1zR5t)Fl6Q^$cdL{*qKvQ zNaOOFzKo)2S-_j5Ed~ItMMm{KQ4I~!09p$*>cIXNobnb$U8{okMOw;l)&Y<;_h32a z?iJWI=jPeBi|=1j2I0edJnVx;m!9O)S&lV}^IqBkif}JBww&r|mRGVR;(BuKfT%TZ zN3ku_OpJNjVzupb;3PmZ%?Tef?{1EN{4o%Uq2oOJ!L|-9k7|4$VGtqC<4jK;$SlPX z8Ms(v!MLQI%D9Zhn6@d|@2AxBY>RuoR22R^s04W|yn9kE5git5_sxXuwMI!ky;#H6 zDbcMRcj?zvNc)t1zC~_FtTj0kwy!q^EJ$@aK2YqvSBA7}JkrzS2(A<^+AG}5NcQFv7K};<{P_*gq~z& zGu5+dFOAB84hzZ>B^ZjLcT%c8yn<+gwCZ%8TEDz^=e8Ona4-QLhjRtxc)ozkcBRUK zxbQq$f<8P2{!{jqzsbeS^)TE5lZVxgh0~D?WwB-y*^IP7=&OtdVb`7w=a0lYkVHqjJf8b@d{T%_?d{)3^S=#ExmU3?GR zP%4}KK5Qgj;Nxvq7T_R#{T9I`9V<{f3YHgIS+DrHuP-9Vt9)R9W=RARcTYO~g?sRW zhPkdZ*txy4(KJj$vO#pnY;&6|I&A~D!qmJ6C~>r`BR=Vtg)s3_Sehh2%as;8NX7?T z!t(|`Du0npaPQ>3ox#C98fR}pmNXiG-}%K=_UZC&kv#-UBG6pOuwSq?eYbEln8*-r zmz_*`FlaqERy)lW8ibIydjHw=S$c2Q1I+XEaK@=a`T6NUx89`RPu2K)1|N>U7GOG` ztrTAdV)rqr^W`BaV4&z|O@>0Z`T)4SPC-n@`C^y1YaLJjHeLMBh4(byiFV664opDbT*!IloA)*HG&#`~ z)a5zOr*hqyKb#l6=(Q%cYgEF&Lgv28^e#4*nU$4Q0tfUa2p<@5QxC<1gT^R{%X23! zl%1wBIYI284q`klsi(%YKgEv$V&x}*LKB!!eE$1Fn4V8QbIL6k|G=QMrWvVkS&;>` z8V+k)@|B>cDeDagEwJm&t8!G&NbkzOrAX(A@N+SKI5~`p2lK;>n9^!<0{udqf zAOB=|0hFaf{l0Sk4=Tk!%;SfK`jMyN#YE5i3-0JumP}wO5-u$hF)IlD7Ydi`HyU*B_s*3# zR+WK4W(qs$ed&K(*#G_Lj(330cJzH&QvWIE@DDYA2oS7+F1SQSo?qGcziHsZTh}%} zX#%?+zku7RUr^)M=O~*94DesFxe4$;`e_hw3FW-`1;hFKEnmpmy1Szt7CZW16uZ4y zfBWm-G}Z9C5n#I4;W+i{TjkwV0N7y)h>-iKCHhn9sqBPq!@qSw#Bd5N|BF7H;O{2~ z-IOtV^vikyXyZ&^@xXw`(&ECx%@;qY`_ilr{)K8jOx^rW-6snFO7rVd@$&;%t#e}k zTSNa@LLn@`fi17?*Z)mB3GfV>|Ig1b)%*`nb-ez<1IOe*OU8WsOKHl!7Z}a&oe|r_yRT zPqop<8)$0L)kTz%;xV!on|9vNuCUVhTvec5mOTW62+RrHh!OQSnFfJ03*W;aRW~l? zPiGy~>j1Am>F-d`QGM=8=@I6OJ*{Hbt$sLCs133nDTt`B9+f{NTFg>T5>hSF7e$x2 zYzRfh$Fo^lTB@c=1nSLQ&rwdIr%3em87o<@7}ejN+%ay6S$pwl^wRqjpCeWq5if%5XfJA~xAEabxux1V`~!}E z`bC@R2E8zp=X*_m=7}?OJ=UM%_M6J&MN`StyQt`Nf?|3-|8tigJP8xr*Am=rW5@#Z zF@m2p!c<#Z`#WF0^TYiNW1pTm(GSF&)lUdWXl|pI2&cnvz@OyeuKsD1{?4MX#5|0< zVyIo8lX8pW7*$*3-Ohl=$h5gu)Yze+sZY9d%Gr2A1Yh6oG`4N&7~pzx4I@u~PHR8J zVzHUZuI8x+24zeUJvLwGzGJeP`ba8om3)H^I5Q*4=;sYfPxyhov1s55<=UGIozH~U zx|r@L&lI@EH&IKz>R?Xsy1jEsC1A@Ayy-mmJxG&t$)$iDiO2Z7=q`hwX_5SNgSY8H z5`%mJP$2s2FRf4Vabt0-71I4(jeZEn>)5EMkr7kWvwF}8h; zx^``>`gz9ffgD#|G{0F_*??n;_uNFxTltiSa!647CBqeseowcBHknMb?s&O+Sz7Od zv`e&N?1h*<9NXi|)S3E7k5X^XFm|otrel@zq+b_?yeWQxIQB?*!D?x7u|0@{Y9V~u zH}?6w{(H;8?7#w7gSx{J$UvceMscd}H1=>0;22>qS;h~Di)?K)WiA@QQ{8ID^OXQQ7*sjdo1LozPhJh%ccO?dejX3)9+V&j@1IdoEyB8N)^S zfL7+}wC;So~Yyf;H1Ct|5O zxpTHTuae$ODm_ldlIzK+gR_tGfSbY;qGhr{9Mmigm^?6%HW zPCYjBM4xz@@lwXs+slcLg}PqtjHlP(#)gVC ztY}7kvXFC#uKn4eQ9fqEn#&z^SYp)a+?;An(4iuJdc88N!^7w<`%m0YYS+a#G^cM| z3u6s@q$GL;wRf0y>BxBFZUhd@F_?1tW%=Z57R6+QiO|z8=H?``Rb7U20QQ&uovc6p z&awjbY}Tl8s@^lSGU50b-6wB*H06r)uDb2H{ybRZ($WOUdHHR9R$Cke!LriQx{#+C z(xNxiFr7sWF&=xXUnaAQK^LyjT<0^)cSJg(y&ZP@Whh)GX7=Oa;-+@kH1f{JM(>j0 zX)$v29RGvm`o4fqgz$M;_{?@KzHfELr*{fWy5Pd!V%u?I^gl3!KbW-UT5OcnxwUvi zWxL76xiuR9Zjgxch!*CSiIoG_7G4vF<4xUTW|k?RP+aVY&XRshNhoXw^T~#>bVh@i zE3AguW>_K{Cwx{8rY%3~xpu~MCoG;Fqj!oTu_xvR?q9tQ??-~3#Gs=e105E_aonaM zx^9o$vY2Ym;;jkV11a=O3~n4h-(G0vo=GRp=m9t{;&(1kJ3SfNW2}&n)TJyPBGQd! z(_q_0pxAH=^fnw-Eo5DOvUWJQCF6mQ1B$N+j-nhaJDl*@>t%tGSk4*X@B>tcJNC6+t?|$xb0qX{U!y7#GdHUhmVdE?YuX4PchS-=teA4 zBX&Q5-JoHzkVuRlI-$6auoFj%*B|c&AGVxMR9G(p&XELVouXc-uFVPGRXyfjotL5Y zVIijAxCHUt`VuQ!(82ZHGgnP{@YpoIynCk}hv?4cRx@HJ-6e`(R*Rb`$CFY$5Z}LcJ{G9Az^UXSzm? zJoij?>j(xQHU!}?`y3}}K9U`kq5N)RGqba$b;wH`CQ=VT;xC zF6z_qamkzp-lrO4P8VpMig(8xdy5y(@G0s0U7XMQTPG2EwJtkc`}%8#HrUA?D9(a!jC;(Xw!go~5@`#sMuY408b;O^7~TDOP5rY6B~ zyy)F?JUFBv%k(Mxv%u~Gi z2Ub6J@>bjLHCbmGH2UaEF=K;5Z*W9LDX%XZtk-k0G-U`#r%ct?twPQSzlt0u?yipy zHa<8wnhzI`F><{`(ohM!51ae3vM3+#SWL2*WHQf=QsTi|WIw+JBgO~w)s@IC-Y-3(fZ_k4+9G~LTmf&m`q$3$zxwBIetrf)!xD&dS{$y7B%e0JFN~0&eeQke>0N(blGCMp}ubah>Elk zM7%?@Wt;!#A<59H`D4k7t;;Z{2Ns(Z*?gAR4{7B|q)qZ8%b6d2HTfoQ=PKpvP%y<6 zMYmmE85EvlJlZMRBz|EUmhY)?MQ)7w3EtqY26%2OUzCwZl z{4nCFZ)W(BWC>wb9p=oFba@E#`bJYcpLL9`u-g+^QzqsROSiQ1*02?<6I;&NnYE_#yy4DtoTF#SS1PFiq~1%aDw#PBXR7r zqMCQ$TifAL%0hBMQ=~NOB?!xeD&~|ox+VFkv{~VzOW%qg#$j9SPn*4({6g0eYTo7G;4neB z85HQ(>x2nyzkZ!S3!KTvJy%#uUkK{@v{p#Hu938j&S>u7V)DAhr?oaMMp|T73w`Z% zHg5hUUOt~`bvjHo&dER0!nm6dbRrz2NE$P{C6y%)a$gE z_pRP| zzHO$ldX%M#2E4YD!25!+1e9SR>KdPIF*{hFh>mCwBDPt^S#0)TvqNWsQw6cK(zhSP zoaC0yu3h?|I_3B=#GcwT&x6lq>nza|WS^lvTgms%1_) ztm<;GyG`&VLrdbS=Unx-9gwbBHv;b8>5}&aAX>&6Ep9xmBis7RVk~p6$&D4Jy9}WX z(u1FmcPEAC2$+-IA}8;&d(808DSy$u3G~touhnEaM@W-Ux%|!eC5&QT~qr%E#?2he+62eCsdB$P6t1i*G zM;fhRv5@=`*dX2oBB^?0C1@^lcD0D;LDl)@?A76X zW>^)V(Q7WJ&T=~^2{vqshYjxDZ;7j=GzR6*4OYs-}~yQ}B6 z!y6Fk5WZI%s<=TsrY_f?x&Yb2j^W#j%M8v!ZG^a^xyOm#NH-n#J-gh0od6^X<1D?LR8cmwXi_ zm%sn59~mREuQec24~Jtpz&Xku6?uwjcN-%>Le8ZMT=iXzN_A5nog9yzEc<`#wde*P@W5KBY46yuUd`R^!Gt`G{D}iXvcV+^ryw?u;UZU~2{Wfeg%me#4zK-2 z>}l`+qwOohqTbfG0YPvmgOaqRLFpC|5Ts$~6ak5$J5>Zk1yrQFVTeIu=$6lCJrFpGn>X(KJjhX?WV%bnJ& ziD`IcM?I9|0N&?R=x%)`$*4q52mbUJ5{;07>OfX-5xJ8Voeh% z{3AY`>1paCW$$PlA|6E{o&s>0o4Dc1s6*$6u^drc*c-Txa>EsNkKM8-w(QOq+;lm4 zZF?ISi~F-RI^FS%YBL8aG!QLadW&7*%1fqPYq=%k1r+TulFmUDihX6Nc=^+I9-L%m zeV<^b)1?}fPmV47<}|A^pyPDzmnM^qkavs;?!AJ5X*Xtss3 z-4e=ruCJTfkGQ;7w%wMZPySKm5i>kjdk48vJUDL6*q=F*we=H@kF*?Q&m4D_wAi}^ zFf$d7qXrThTSz^J@rxH2Zoa{XAtS{n~I$s zZw(x@Dg^GK13jcdzDmc3E1*NM<{kDf4?E=4-wb%`0!=jco9jS0#Csjg zM3|419jz)m*9YEDZy)?<7Qt4?u9x>-cX$40a{-Cl6WAm2#%OM9GB>$R)lAz6J?B8} z;_rC*t2I7II+btFr@tLWjj|lMz8@O=Nn)6F7*ijNXAb#LWHZ5Te@!)AuDDg2{(9Mu zPS$0t@Cj=q0%FBeG5w`zwb)`1Ib!_`A*ay?dc9i?DqU;Pq(;0T^2!g?1?o#bs?Sbq zofGecYV%Ia$go(M*c>x73od^%ZjNGposO(u3@z6i|La|4RfU6|_(WiE*Ff4t96YO{ zM*ugeUJ^|~LgqIoEgwSb7SPW>^EFeFVow5Ci&H3PPDaH+jF#C&7C&(Cc_ZT3j-l?^eQ`9dz}*;IBOgj=n`^i%fOD z0H4E!3^De_*(`j9Xd8TbS3}e>5;hX)kE;N4r;sLgh(Xy{dNGi&G@TgfYI-5nZwJ%- z<$-uZ4_qHmF5{|@MfZl&iJt{8oJ_rkbRvXR`vu&UY>@j7Iu?IcibRBRPr|N2Dk#US zljbLHR3rnXN~HlF>4EtX`>nB zd1CooyfW{7DnZWCyvl;YV)GH+2bKUpH_wB-WXcRf{R|cvRg{S9&o-Fgersf1hkSj( zx>&$r_N|7ZTpMo*#ZF4qz`}S{0FQOgos#}S{c&&%dAOb)7oEySa~E5WRb;f2c2ZFh zjYPT=7gav?gYbHETtMe(DK6*XHx~H)Z|p5cS;{6@Kyvcl z!y9y^vUokew~VsuHO&CLw=A2TvVY<<<=7P!g%)Iw48AhoLKSW-iV z(|UgB`|DIWt1NJ4c`N)}{a{t2Au{~wrY~&PYww^Wa1ex)Cha1tC|5*a>Cwz_xl^t| zO-$%vcoW~@)c%k~vy^(x=A4eE*YU3FU%Q_Sx#M~6%bxkxP)l5vGH6o~z%{bKV%h1d zIXm^J__^68-ykYk?7V`~YHmY3)gjxH*nsMlYXTgr_b{U)lFJN9Ov`!037LI|oLo(I zi7NUEWsCV(d5}{zvs-C-X{!#zfa&dwPV;0#0Z30zbD>%GU*)5Phr`+REXML`*dG{N z>sREjlL{)o{{SI=;vP=TKHoEAVL1$kCWj>Kb7vmgqw$~;>>`o3YKNhG*jJ)_T3T*=e-Aeva=p(j5wO`W5>rk^JvMPk6neyH{@@& zs#?U-mIYcp=CM>qAO{V6MC?y861-dE-DabTOtLyVZ3A|e21ojsRIQpmE__QEu{|qY zU?Z<(?l7|uuhFQ|Q^S*H%T`->XUN!py*kDtPSh)!m`0ErgrFzTPjXA&&x6U3H(%TC z!$In|`Xgl)CUM6+V-apJGyS#WCV>N?q0CepM@^AGCC@wBf~Wlv>2h)5{vbTs@k;2L z8{36ts?B7bv6ZB*aP)pGh4n+=SYs4w7a)8=d~VJw+UDX|#Qm8`*ZPxjh`>=hQ?F<_ zm{(lbA$+@1hVP{QLmMn3&bh#*`aqECG)o<|8CAGiB0(BNU#}n*?n3O}d9+-p*gNnc zI?1>S)@2A5gf{Bu?#f7%zZ~-W!x)lfllB3=y_~6wC~iYS=S`7lL^J=e?z~dFFHdeZhs{3^POV7#vOI z{$rSF5;bHNz_YLybaCgdp;cjTMYgp;hPY3TQL>h+POCwdKDp5$N z_F8#E$S$Yt+1{^ri>2?5Q)_cfJ&~cFv$+l*u9hgt?Lny8T{#I!W}*mrRsI*h8HY$Z zw?E^_Ej4_vf~ej$oL1oNj1_kKGWOu1*L;~A`3(Fd#bWxNf%ZlLtmb6*b6Y)EnTCCh z#`{~Z!m^Tkt|^L|fVAIZ|KW^fxeG!cX^Vc-;$+qtZ%j@iaK~QDnrmuxtJG}8Nw4B! z1BvKoyFzzSdi$r6EE=mfgeG5IfbEGmmw49|vK7Pr6}UjMP0jm(u-tjYJx;GDCu-?% zqnSbH#QnF4o7$H(zCEb)N1kqUD*UmSI}MD;+( znTM7I7SNeR!AaNo#$A0y4qI*~3B=svAxp+#%~}C{B?z;EUZ~)RXQFw_q&Tm`?2qsE zc(@c|$U9daSD5uN(ujHMJ}#M{^j+c zQTu#{z4C^Wb5b<}ujku1XOwxFHCL|)VkvDY9QJ`Q{Ry$}^@e=yk7zMrHtM{u8tX|oB&bkJKY|QO{I0NHd1cM0Pr4Y z#BPd2W(V6%7#KGPbJ6LPlF!ZESuHI%(I;kbQM)V6MyesMYO94k+lNU=d-9%HFr1V3 z-N#h78gMeaU1jZX^mJum%K6iXFg}V8`17wR|!?_SSYQDZJ41=kdW zA6VNhA6Me$A8s$e2wGT`=Vh zK>6}nypyE;22!!257d2%sB|AL?){At)Aif7yelB0mGq0$D7+ZFB<>Uf&?M@zqoxj_MrP2pgn zRac>{oWe~9rV!Ctsu=zUdq#I-c+IWKJF;>aG1C-N#0BOF08d;gW}KrlT%E$9?tx<- z43i&qBRiu`Y*x)kMfVM-QE+a4fR1SqL$8lN(gz2aM6rcVn}N0wrVMZ`l<5uO(0V>r z;qojxgHMO~k3>8@xe-sk!ez|}K;MN;K{RQ3&u_m;Qc@JSTZN;gEp2+v8K(3e4{|k? zxurbK&oPGBu7_%Ds;>2ozIp9 zuKT3!u@KYRT5@{+q&?$Z*zu!`7y-T8uiTwAfrM9I4wd!2zo{rz_@nhJ)0Bo2LK&MK z8WsJ}&0eLZo?4x?x67ncbgy!yppD(SCdz-GM##GIs9R(K>%&Gn3rCIB%1FtFQDblT zTS@4xEgFs5M7z*?r?4K&(NAHEUlWq5i}cf%w!Vidnh-hW>X!AOkmkAVsl~}ehIR<6 zpB;_}GAXQQ9fJmgJP!@$IQBu=fU3i1Se~G0wM<{irpxT@zgb@j(oarS+imO0=^c;Z(qL zVz~+@duKn{nKpqD%hc&0Q?sWv$J}wxTXDQe<~!`yNb{_;s_7^gWLTF z6$luDFcb*lR+>M(M!(DR?K~tlqUx_cS`|8)iAWezQc`Yf*isW&EH%#dGrODKfSoYm zb2io?P~rR{U%o%iwA1ZIZnV~O38rfXJ}1Rqrw4QDX|iEo?;dz~IMjIWc1bLtKZumiiG?}H4^5{x<(k#HZW3@EfT=2{#k*w4RGKn3vV61_Qi=37ov1#M!%k0r z85RExWdQgLEB-V#++O+x=60P`eOT(FTe1l|8S&otcqg}h5^`u}C}=#PZw2!Nj+Ru; zY7Nzm?H~Pxe8o&wVbrgxmkXSo56HVuvzE5bg<=_%BI~m1M+XK>^_VYcvgmu?T@XA5 z8N+TPr9q_ss>kxTM&u1{Pd%09cAKBfg=9^njRxKaX>l&A0?HLmTNeF!FpwaGp3HFg z$SiUBoJtHJY$l2hyqo?=@oIuRg9tU=3bA;mU)HwxK!ai`o~V}$83J641i_K21VNMc zK~xV$wM(pxbG1v57@V~r!IWLEysuo(M{jylL*I+d{PbtzhZX;LkuS3cd;#?CnNDln z4RH07fP}DJkT+?^@H)Zeqa6{AcwIf}ttS5dCqg@4sXtedDXA*4iNU5@u9!ockDX2N z>LT8glkV7Xsb}?EwsjeG%Yc=PIR~D)#l0hZVlL!+kr-KM(JzZijXm04H31P&x9500 z25c{LF-$~LT_g7){uzHouR`BU`uHTIs|Qr1rc2)Yb=7BR50`{0G9tV~a3USFf3Mbe zGcmL5MZ%Uh-?0C}GB$(h088;p!j-I%{z9aBE~;+sq%?Kz(;GF&LgjXky-vQN`0}TO zEFi3{0X5#|i*!Qz)+?wIMG@RyB_F;qR|###7MD>KY}S>UQqlW<8&!){$Jy{tS=3s* zuyJ3~VR3xAuksp)=f%E7-1oOQp=2YhzpYafV@&B~O|Y_Wti#_Xy{A&n&G%-k{ylx` zV;>cUE+{cRBG-0iE6lE{F%7CZJzV-m?pve+Dj7YVl%XJNecR@i&%AD%sUOGG9>77> zZ|+4V$G_62+T%Y2ap`l{7Rx)p3J=eIDChfuy+DFgIUZl+I{HG;Ti3F@UI?_SVs+!0{PS?gD8etiLdD0a9|)$D#1!g=`{ zud~&$i=B$u_<6Gk!6OS-S?WqMPKwu4hLtFh7JTBB!eYTu5es%%>*hkzOu6?q-78Hbv!uELxTsw(5=I~t6OIz|#s`Rzf!_QKtVc2Jh`4M+;f4-mr{^)yaI z^Oc>bUfyxnDJRSR0u$6MTs_xf>b{&@4B|S-ydgIhgzmt}n=y&^y>X$eM|*AH%v!<8 zRGyoe8xu54jB`-%l$4za(Kv^L1MaWn140kH$B^%i<(smWJ*nnRm!*wPm5wDi9W_dp z5GCX+`mHO}Cc1e>(-(T=AMW+)yRe zyTzH#b9yc#AYU`26LNf~9lPdcXY^?lZYa5;lu%ag#F4L6XqwK(9*h<4Ecn@@(Gd~r z*drq|n3#V-6W)=5mU01Ym(&xo<`{sl4O_1c4iaZ*3>{fAcvh>ZPQtGaJ)k<}WOj`* zKZE22(+KhAJ{vX51L&w=Vlrs$&+b_;8x}re4&4tt`V_gMJ=!eBdO>{PS*c=K6|$dR`PE7d&?3j&de&Ki36`J@4E zf|h;~97%|)$;d#So+TWa<~3sqhb@l398LY!4-YFj`A!!CSCoYEwcSglC~5CIpte?) zc$>yMcKgJ7)g}(H{Ixvu(OM@Q+IEqcnzkayq%HmuoOq{=O1L{8rlCJPygTk;Q{gj^ zW9ac4ngLenu}5E5{PJp90tS|J6ESexDQ-C({xLeRMh?Y>l>AZA3bQzCON6hM&7I+$ zt(ecW(!GFYpEkg0oz&K?P#n&2Y{ieVjERp9r$ZHo00ZaqhA1&Zil`!W@)`h}ia_h$ zj41MO=X9^;Z1{WNHQgOXF^-*LAQ2k4NtFk^na$vH+^qnTkUn;by(rK?*~>9suat$^ zy=L3_aC90?D||mhxIlI>y=R=V9}}Yh2n4^Tl=d5FcxcGQiW>WStY*Y9a{aZy1*04B zB(N&R&hd=33^b4oEZrOT8XTysX{tV3^-%T8G4MI+KUJCKKpxS1Xf{fae1p{afXhqn zp6V6|Jc8OCvSwzcG3vc!S-H~GCpuWd&wfKz;pbK$> z2vZ!t+(hE7hE=-3R;qT655RDaZp{JwtdL>g#L%Smt6kjyc)Uw5*DcqJD`dhPnA!nht2%vM;^yaIO92|)jy$|;s$m%6G*N2QUzmh!PO$G7{ zbXbgJ3g~_hR*VmDsQsbjohmw=G}if`ZIsqAd;axIpE$6|3xHgTLs0#XTQ|QjuY;Op z$Zam3#?4hxbf;(qbmcy`MFyTrQJ=IP0fJ0C4+V8E3-dU~- zf7v<0NGurN0hQ#N`ETsM3qHRxz7}vW9jV2>a4W=ob<_>hhiftU@#KHWG5(}1Z!+iG zO-Z%=_L~twePw+&!|zX)^#|T&S?+Um*M0{J5^7r>ezN;;43)hNZ*U&1npRvN==zHTH9J~CdppQL*sSvCyRwzaS zFnZv>9?eJkK+_kd@!;_H=INurE1KnwSxyzFv&~d#)LWl`=LTkGXpy=B z82^*d&~*7+t-@Jk8+*lzLZAAJyUN?la$S2AWJx>4Cp5PJIni z16M_j%=^t1or8`4xxB%Bi?+DnIsCy^cz+Dvf4ulVwg>1f0lv(T^9Zc@^4pOvp1FUZ zg-yJSNA)KE@`GWrzpur%@&HSxbVbjhgX-^pNC@L3rs2hjYlKaw^$%_qLy7|>|H!1| z+}D3Fi0inz1ljg87Bqth0|qOnlw9rNf^}p^__;^bzrW9G74}cSz2K{Xk;3`jgMZG^ zdtm6V{<*ur=)CRs=WkqQTmg;@vPa~z$AACRCANUOo5-)T(fote*uxH#rbPxu9sl6# zK=cf!nu5YZLydtHHZGj_{0RC-Abey_2`+C!Avos({yH%J=c|(Jz_j4jeN+5D-sL}E z{O|v!gu?6>R377;@A?1vj~Ly^jESHrIO^ZN6mtE8nUcrMRB!*Z?mw6*O^ni&g-_`G z1mKT1ecf}b_VU}b8Cm;(AU)2P1mjRFIW)}l_xJJFix`s(G_yU)e;?aFhU-6HRm#Bu z;=`iYSXw}~%voM0`uC1G?3(rE9N<+>rjPYW$-Z1|NjqzV7`>su;4%V zQjh=R97|hA{gY8tBEqCIL@moW=PkoO<{KMV7J(&kIegr*E$SZ(;+0FKiy8s~;9*ay zttkG%!@hylui|MZ!1E7QzdJT%JzTd8)da{X_#PuK0i?-#SXF@k_ut}C;#Y!cVA69} z<4fQnp%o$i8uok zDQ3-o|2g@^V82*eR@u|?{euldfY~rq;P%4rX_Ghp$Cv*vOVrSkYzU5{DVBF+WXU}n z`D^fHKRt@7Syq1&>@V>*V(kzL9BZ%@jZah3n547?6WWFCy8p=3|NBR&Fo9S7=>>rK zST}rY)%kF5lIK6vm8bZ%2VdNMgvG*gPw;PS$QMi?Szt|?|K*&aB#4=&;H4I=^QY;q zB*@WZ%C6GlV@CSXH_UpXFm*m(vHjKkbr21oHn?T^N-gtFMD(>^^(q13<`I? zSs|RbXr$9`0y@7Q1Y~X({>HlWV**KtU)FEPUvnv22`2cePayxJb3d$M_7&TP%j$W$ zu&KkHC12n1Us0C?;3zf_^n2Y_B_EM!Hs;LOPH-uu1(AGYrNNTD8K}bp@%qmhfoC)iObg4y?1|&a()^v1l(}}G~+9| ze5W%cCu`F5CZH#B5-v!*d;S#-H}d_!EWyx(wX45k8uDW;@@g%-dnG{Q7kWe~!rz^?z26v};m2#TF)kqN@ypC;5%Rhyh}baxaeSw)GT37oC3@G%49)_BCH0 z1z4BCw{^}7pRaQbZUkVdJ5z$&51kdZF&V0Cc`cHnmU%hxDD1@CPMW{s;egV8sn1Ol15W6i%NbYq^H05&x%f(iWbuQ2-c*B7aH1d6@c zX4JX6Kf`?G9>Re0cnU@fz=;)-2YrmNZx;k=GM*DE48gx-&+&hxXiM? zkdc7$B^8~guLc^5sFMXnAK72*Bp9IOI0L04ibQDnQ>1~)Js_1dw5iT3(DRslEdap$wPEKv1}#kYyP4iaSG$HyKq6trZmJ2@ zG`X|v&`}JY$ZyBbqF(s|QF&ajQoJWRkg1&V{rJnnjia@ik^POS(QgSJtG|HHFZM70 zbrk*2m{iLP=9MLcvic5wK8Di=xEkq4b$f9xZ$=0*VG}rB}en%`4gkH^4bxahcDjA zM?Gv5(TNA`mDF|3*L?avXol2rG!a#2De}6Te!X6>_K*SOz^OH=W;UWK^MWR(u}pY7 zPyZyIscRchzD8C79QyXnF47)9tWZ@!q`x(ycCy_#M8s6Y!%^{h6<`trMzL?Io6ceT z@504#x~5Mf0jTR{v7h-#NC(bMjklvY%_<9Ksswlef#D!lXfVcz*$xWSJ zVw`2z^eczP&nCT&0I&}zqPvBy;zPyyRfnrl;r&wc=UgfF=pv|{OlmK2FlS-s+S)b8IZ_Gy)b+a!C)0fwr|CwCfVytXh1?H9%d^6m?DOg6gUgu+)g>Bts0d9`>H> zbr#(8#c!r_e(nuGWt}$l+^cJZmbX? zf>metBe*L1gO0G>&noBb2hHD|#(r*<6l1A_kuE!$ttVW<8=QIR5)^@-v<o}E_!=)FC3Rc|!Fi5o+xpB5hs zw`bh8>kybrWoLe{#$%-l+(pJV!14Pa!tVkT&TBbfcsZmO&+E37TY~x##f2e&P=Gsm zdYfcj=Xz*sH_@4Lfbzab+$#n{m7l8J0%sg4EVfG%_nE$hN)m7Q3LFph2D(e{3MC7Sp(hE zFDs=}!FCm>Uqdng1Sq+H=Mlp;>JD z-F{f~UiLf4dIJSKXQ8#yhI{fT?kBo{V3xCrN4ej?iX41%G5;Q(#OT;{BBv4_HC5CA zj;0-7x3qXz*G1yRipJ1;ir;`1_`8#d=sD?J8Svz54ST5?@a1Z4PnWOL(twi$(Q3(r zH`1^UXT)tTu27heD@dfw^T1y9pzwAue?2kZE@1qO0N%q4vom8CIX%ug;1`zw=NYhH zwM`hjwm;K3c8NO!Z;*>&cY?pg#>TdsEK(JRVA}t?{Tc?t7={fwvsyk7x!i&2NZf&k z94f@}cf*!I0G8QSHbGz*WabPQK3~;F6U}O*V=Os~dQnPnmn0&LHAOKMKoU=9V|K!z0S)+b<& zM|_>hcm?>pDLl2hjTmJ4_WZ}&V3+o2p4A%g$bJ$a@;7tcM+e-`O|oP(D`w1Cw}a;C z4r3&*LpxAqa}W+N0=r&Jmy<;YnM26*@-X4-IOAxI!{^|`7GPdqGhWM1rAw_;PBd(M zPrgcj^78|S6*yq+j)1gJ^;Y(LD*XrM^?6SNw;A%i>z@NUJOEKmZa8!p?3H|`?L&{16NcQa`Tp<(W=#xv z+iRjg(!s^evOkYb&4E^J@>%ZOu~6NXTIamYptmJHooiQmr!41_H4L-1$jeLWlxDP~ zH(j34zs_rXX9=|>Yvw?O| zi*j(g(v@XhZ>NL#XhQLqzfB=Z-vm&_%@1?lnCx-K~j z7hI@>0$}MANyk+`71O788MU*1JzxM@s3O~45`n?M?xX;d+}W?~+;;Aa7twpf+-4gmf^-^lJl0*Iyg2f{j`La z&Q;A&a0aeSccFIxcP1_l(32c_YDsdV|W zCROp!i;S(!*SGyTE8Fu8-`yjgAhQ-c1AOrcExu7(Up>!_Msy>u$F7x&Jh!S5wV$sx z(#jljQhJ;;i=7&27>qh5Psyx`cTWbF|_l{;Bd9?Oos^6$3-X|YNot11?YryNLl zycTDdfe40|_}V^D0Pw-I0R1!v*fLpHKYm|ca&kE>D~_Xb{qf-7gz;R0kN5P((atf~ zP0w+VmL?j+y7m`7ISMK#DOjGU@j-cgb@ySx;&a=a{?2>yom@lL2r!w-d~_xU!O772 zjI$L#|LsD+)$Jt@L$L{sfz7RxY=hN_xjCoFS30ncSOM$)HzXHIyieR?u8xWUo|wjT z5@S){S-6hgyCIjCN;UdTM`wWPp5cc)E_bh*U1Z+{DeqgrsNOl&+T8E?egrtcW94`W zD`2fWe9)<=>#QYYIgupsb9ilzh0$X$&gJ4nSnqMp_iQ+fm|FPGg6HvLKko{Ck07S? zFqBltbz?eTuPhUg$Qe{j9?7AX`kdvJ{0c!!Tc(q5=Q>6}bY-hbKdn`{?$lcGnE3K| z`ssM-O!(>Ua)AkYIB+3=lGPD=P7a&ZuTh8FW_Cci)E!l{@JoZtTYt^ooEo=-XW1m^ zMy8PcG#$F}91;ADPiC)Sc{t&uDl=N}S1hd8*QKE;Z>$#cDpm^~)P*El0Jk(bT;GB* zQ~q^Zke7}Cda^v406L+BcY^`h6_NxmnrWbqR+nUenyYj@mVeC*CBCGAztQichWE4$ z9C$t&(0M;fecL6*<)l|ZD6n44s1-K0615wFa&mE&iE+yJCM0RUl`lmq=pnROMOBgx z&uQEE2%KWk`ww*3MdzmlrH)hji~zB0^pxz$R#-{B-cCafskhTYPa__@NSHRh+XD|+ zJc+HsQ31^F4jB5$O{oPPGs{cWHL-K#2HVzH7NM_c%Z@Cww$vNRdGPc-(^#M^(PBQ{ z$;?AqW^pqeSw;>117I7c%C~9nC8L1oYw@uRngpV;AS$po>L8ya%)`LhDEE8_{>Eok6QMP_o_=MpdYS2Phn`4gk$e9HG&HQ^Ve;$26kr=`-Wf2tbYY%l3RK znM4BJRdJ$(mVAk$^}>2ao*T_GLiV_;ctC*pW8&1NIAjO<@|k>{5EQQLdebwc)UQs= z*w=!;TCRo2H)eJ3$vMjQAosJ9$AL8GC!EPoLIo%X2;j_g=);|rk>;@s8~nW* zQWhv-{OxMM8B|nB9O&FbKs**I_I(q}6G<5kcXkfwxnK5ftu;;x<*R0}j9MHD>t7}+ z+>c1CpV|`d7l2}`suC=1-msdF>B#b`Xw$WYZo%>UuVh~&F9shl;;J*Tj2s}!Y10Ba@8HC)1{FDj^i3YSZPNWzQI0cI-D z+t5*Epfypym7lT)SzvscN<3aC(8A|Ym@r3W@@lE1NcIQUUPWQxIbgS#t_*qpn0ehci)%{@Vojb9?GruIq zAkW@n<;H@W68@!H==IQ9b4@`!Z!%6o{1x`{`CA&qKWv)u_qO%xO5sqx69NQW2N*iU zFU?+%a!)aQ3s*O%664X6X48n2Y1e4Cx3NEvzIh+-jJ<67%XhCNXgzr^8Hvif+LHBe zjG0NV3|w0t#VN+{!gO8yHXKE~w#4t8iSq1cJTd~#rMg2hMtA&(c%~z?y>T?rP8j?` z!-VFaEzm|Vlu zE}1t8ye?TIo>fN=`1lQzaSE;uSy+bxE#tS2I{7?ilT-RSGj>J5{r zWAcOLRhgBW1 z%mszXH24S8bMaEC*l?5(5*rEHPGZFX5u(Q#5M*8@Pp+TqOPM471uGdp8R+TWcS|UC?;!({Qtqcb{GEh>UF0jUeThzB_|$RNe4Pc=)EX*oNA4=Y5+{ z`P{quXF#aOzd@^!K=@{DKCh1Jpr}`2E4$Q4?`UVqk`&)ZDAOm)u9`AGN zwv_M2f7h=`EsR-Jl{|#2gTKLP0l;dgbq64ABlV8;sv};@G@|Y&lT&^q$!1L@?w8Mf zClyZMC&3EDg6}KzR}-I~UNU%gUC(VM?6U}uV>06MRD&9@;8RpPQ)#@7XVa(F|CBs} ztU#Gleon}!9#`mee`;*g7BAg4EW>tQW^fDPbCSKZc6JH>NNqR=SoC@;Hw~70DAf5I z2MaXi#t6zi-`6z7?YH%uL9Pea_s^11tN7jHVR+KxXyM1wu1Xk?4nUmAH@;b04ZPa3 zAu@<+obV2LY+k5;n#eOP6YzJ4^0lc?1muu#9B8$E%gzP}aauHcQ2?yRZTgk)y< zB}l`gGt7JuujU4Ug8?}57koovg_R_ z`$Q&S$%>cb%O~H+i;t}HlB3)}`A}atx()Pf#=ZfgtLZyh2scz#-eGrlotbz2+dvsK zbIm5OIfc1iK30q2w0pkpIYdU*e*_duOhaia*~BFNM8aH|mnp4*?5!%!&Rw1_TVqX> zeVIn|K3>+WFee|IZqB04HD5EtnHTi&1|g>Puiyk(YPxzDk2% zrJiLJF476lm@EgY6`d&UN`r0{KST@ZUT@h`-MK|fnvSloZ+Lq!;|^GbV);vA#5UN5 z(^J{s5T!L#c`60%jpjE0i9?DCz~O-mWSX}KLJ4|Fry$4sAcn)gq>5&(fQs-L(T88T zd$sD3i92HP9{f?7heE?;5(d%Hu>km&bo3pst>!NarzexXq@$ch+V^$4S!ruklsYvw zHb-_5_i-Ei7Pt~`UWIDOu`S0^t8X@wRd=BC4NIdVC!~21z_Y>$o87Net-GBRk!jrR zwW#BLLGyHL7}(Y%LOOZ89n2Bb6w2sITUYL5VF>Bob$u=J{o}dQ1o5!gzE|p{Hpt#I zaJ%Hz9y&`diHV_F8+zkZjC)-a0WzGce{vXTEeY@d&H%_4rlP}1iLKjf z=x6NKi;thce3@A#AO`L~C>^NnO!MmSpy}o@4@_K`9htyRw^fHE;?3$X@eaa^VwJTWOL-rf>YlerigO-gI--jgcB z>o~8pCvkw0B0Fu=_XMLc#L+ti|-NpzB{V}VRVlD=g&O7wC% z!|9H(mu_#!G%y7X*2#JGnITV6;(>)`Iv{Tet1TGn)7l9 zBho096nzyIlQkh-Dyyr1L6h1&8vujWHN$EyTg`cs;dxc{>X6rx#eM6VAk%;!&ax!< zv3NTCSE%P`epdg+0rO)u{W^;kj(BtTqF;s@ zakhou!}J3Sh=F!Q#3 z(T9$&~nq#(N=N{$Rue^`$yb4Rx21pKw^Tg5A$E8`}2^O5_THiP7X7O&O(XSXbSzzMd zKiXnFYxrnB&kc=QU&%}fwikn}0ZVY+2UMFfY#i7*A!4We=B~GE#!5BlDww%u2DmFj z{co!AJiz-##;l^MDJ5~;Z_d0Lu^CD|-CbZyh+na7yf$&VTk@FDuu%`OeyW;rQv5@0 zL1u~Z=}h()Vp{$#ftS_(~; z7XyZRJtw${A`txHFsx^TiXhbt^z2m%JX8!DQHzsrj&vWh7ovc%(6XyEA^@^qrniq3 zzMJIm(NeT1qm>6#S2H}X$n&Hks3YHxAaMLp38eZ9T<|4?(GN8?1tXr~zLlB#ugFh5 z)4lUlLlpa4wuuNx?^1cwo0lpQqoYvVau#zPabs3EnpuL~YYpUi$sUno!{3q#O(oeh zu(C57G`wrt*~`AG(PgnX_jwKKLtk38auz>~#{8Vt z16ewzY0dLY7Rz#Xc{mUvH|!r&pAjiPc~h512AXJZ>HU1kfk!N&)kQtLAc z2IE-RwFm6h8&y|c%m=r;Xz{&G+Wjn#mjkGR6`gVQ8W1t&QZ=AT9bugiu#T;*kcRSa4sz)?*8CJKMHqi}Pkt=YPPG;UB}zgmTyb>jWQSL7rt zS+d6I>1!NbA%5BJ3$Y}^>$P&(ci}v|u%03ASWAmq*2)5ZRIbB#nYFqu9xL&sNT$?j zU)A5`QZGDpOL@-# zsm?Ulh9)IzmnOhn{noNTu#aXY)dSeG^;0Ii*JQ{|XJF~WgV#nDJOYaSI3u;N>|_GN zVhB9H@^CR*9hm==Ostn>wMLPCX@u6k*Y32D7}Ob5l^?7Gg@`o@KY#mP-mTEb2G!5i zOOrLh;h5mLDZ|M<=w@9*&HSJQD>+zt@R|JUvc-NrVy;1SxaLrP)%N+TC&$#~V#6JhbQ1$RWOoh-ujGwAD zGYh16ZJKmb7)`Gj=wGbL66cT28o^JVJ;P!usDoUOL!K}7v`H;3$A2H zf)X0*(mLpRcV!>e0Igz^o;-9Vk6FE2 zN`Xt6-vwcysY52!ksf5pi{JG#YS|jSU@lmFp{OPjNvU|{mH}U?ha`jLUBkZOJ&nfozQ80q)1EZZd>vQJ9Qke7V0Vm*w zn43y5aJDIt$D?qq`;DhW7o>zv0BwHTT%>d0GB)UR8J}G{1Tv=am6xC= zver!n>z@A2)I@6`5c{F|Ge7FWTs~9Mw$ZDFvkYjp2<-=p|@ryQdSK20}Y4ttumaTY8Pt>6e$8#?jND$he}zDE|Xr zFm2Cvgid;1pGW@1FS#qP_hYFpc6>W&YoIWp?Qz00PD{$gTX7*8yCzb5{`Aa!N}wc2&geOEFtX|4sK^#P=9Zd>Z&D#@#_mb`dlf;{rNVsbuNEvFndsX61I0H4ZLbx zql$Tete}ti`CfR~f1)6O-0O`BV#K5)#CVEYjAVx8T`wz$EurD?WJ1Ujz9<xU!UVzxh~y>NKw!yZVvq182qnzEoUcj z__7se!Axn3%1QWN#*j6GyZ&3+-#Gc4b*EM)GX#CYKz_%xZMJNaVJC;myP*B z{OJ7ZtMto2gVvi6 z!|9+RqV%`txn==!EtBS_6gp0C0*a3lhO3n%)LzSV<}W4(VhHXGw(TS@#uhCCT-pL! zOEZZDJl$LCjH=KU2!TwT)BZ`#BSMrr28G0xd0nTu z6Gt2TTAZpJF=w0hV7aj+skvv8n7(Ru zW0WrjdDaOAxy1O%>-rkI-5AZwy0hFq=e96D`qp@e$!490q~ehL0u5ulbLw^$b8IeJ z=3>k#kI4c4nftgn+qT!y?-s=tFKo7WfP8VV#6arAA=6s<0@E+5^EC_doD{)X%HB@T zv|!=P%v>)%&0Eqt34P0C4uWvY*jr3+vbvZ(bgwD|<)^p2~woK3Cr69+F z4L9HYf<()%=4^x*)q1Or(8Z}|?G_SaO&y^W>&#rW5998JYLR{S4LtU@YTUcl)=jGM z{u8;?3amMx$akSL2i(E5UPJUYBToDZ#pTG}vQ}j(`ukFuO`%YZDvZSw{kQ;hN+;ty zs2s-Eo47CM<&3R$SlW)nBrR?Y&1M|iMTK|-Jz9+J>bJJ za(!SCT&|@6#GxzMG`Jp$Ss?ykM_H?S=n2Emmnar=zg@~z++z8Nn)o)z6HBcV4kRAE zyhaoq%r0%TCGK*djtFlgBsS~0Rg$b~c`uh{)Fg(ltIg!!t+68hS%SR3!Pf~u!$Uj3U)anveg@Z^jn#?wN4#F%u!?^2y3pP|wl!<|E~gZhZ2eb(rrJ4t`FK?&&8ogK%S7U22qd`UNhx> ze!Y}Q{XN(Df=aVOwk^k0r143zy`5qM-6QtHUZTcfPG3mIO2tLWM0sNF$s^}QpOQF5 z1i7&W6-3qw0G;TCT^_dm&S0OwmxJU4NGM$T)Y+}~vo|lZ&<7x^yVU69Twyh-(bMA4 zXNxLsd8B?eg6wbb6b9s(S?DbHuI6*>Og&LR;Pb68#Fv~*yj08& z%`>|F}} zByW9$Jji{*G+74<>xRP@8`rRCd40hOYvs`Wx#PW}s59xL&9?11NGANf>pY zl`5q2GdO$!B`Sw&~`)qeMmg2@xoIaD>s=6gC2AYK*E;fPV zNOCN=kg`|0rmj))fCaW$8Dxh35SN~R&P;KiiUv|A| zZK|I@o;QyR{Qa!0qH6n=+CdQa%XxDqWO{V%ZZso;9_w6`oB_$(_R0_HF1rd|m)~^5 zWOm^cDer@AtD~Y8aMB-Tc2DriM(L)bwu;qs{TjYxS$8p<@+}sIX4$i}zN~@7{6>z5 zX8LwS&%xf*3Xcp|a{?REHlg0~X3~!7CoL82Bc`#f%Di#8*%$C#--{!Un~FwreRY%D zaI9zbL9lq?YwJWN6}ID5LL+XK50IPDgY#Ao_#vYwEKB6|ROgnC{uJJgsRwcmii=XH zk9!+4jH#Dtu@` zi2@odGK#P@?3qrX%Z)ToqX?k;Hd*BQ)~Kj?gIEmoM!gjMD5*mhf)rEu4n_r0FB3kW zPY}NJP{W+T=S|J;P^0+^iw0J2LJPX(qq$N*T=YN%`n>H_YI1KA1ON_gL3n3R_vY%V zKsibq+McMCj|YyOT)fX?6YjKvcE24@B1umubQ&Z-`$QmM{?$(umGB@> zm#vaitvPp*+hCN;yBSCY?Nly!UgbyJ!>#!Anh}~9jbl(b$k+g4pJzHc%I3X-Y5?!op!>oiub|Qv#L32#6Xk`HNMSD#^Bzob$^YeAJ{}y!aHh{+ z`>pxm9%bTk78>_#{p9n9gBzy>Rr_nwnl0)BP$R3k??Wgk?P0cjs)6<;5am^}DFG9B zlj+w#Gm(Eep$M4iG{vC#byzQz{2xE&(;*H_B#fT^g7R-itN0L17VP0>v--bl81)IX z?)9Mj4F5|*qV{39f2Z8zl#8GLzLN($@K^lb8UFqMP)xcXK@#^v;(yFY^w)ig=ocda z-Cu7X*h?@1ShQ9s>%ULPxql$D*d^oN?FFzM5PW1AmWegZpGu>$uA%=smkjq$m1C~C zDE-^H9Ml6Z9@8^<$ocO$=TfM~Oxl}852pL`X~)0sq{jzOz&zN9{!cFJ zzkM1tZ8Nl(mPqj5?r z-t(WK=<)9pTJISiICbph{&pCTBjUglY>!gd{+&y@`yoihB)e1m^T5AY zS#^JuYSblK{{iW5|LiALGT_MGanD|;{OuD=@=>ahR1M`c8cF^g1nYetk-?JO-#&oa zhZc11=Do5${?`H&6YecDVY5U1-y!{Hw<(%I(Dk0nvg8-B9q_{CQTp!x9$#cpV0Ore zIFSF=#(fy1@6DOL`=a&UvMf5SNgwL zjQc>#=kq`M@v0NV{`>Vu@-LB%R{rx@{NINCUw_$3Y6crs>CR_dIT%)f3VP?ao{T-j z{%3*y+HZo1S0V6`fi=Uyv1v8Wbp)aeIWA?mZf#WpJs8&Ut)lO7?;=3~pO z$5uIMu-8fDwE|J^^Y~lu`u{mm!u&*E0M3M1>?&&WM^l-b4X9j2WF`+l0<#GBP3=;i&BG8_~2M1yT)~NZC z;^pe;D9H$@eso-U%+gEQ>$yxBGB8(Nx9>Ip9i7lPzC+F^P>BOPylne2r zhex_$skFViVQ;h6Lb&15M&Y%qU;ld1lW#H7Va=`ech?t3bN6_42c;Av~ zMTRy)3UM3Q11J)lC8{OL92J8M)4WCfVTUIye^9736-o6~z=RRK_wG%yd$P#fo#$Jk6Fx}4aG;??}+uk)Cw3!k%zZ7q1Gz#po=U;fu9!%TWWeXP^6#TOM-$QZ}~I)bJ~ z9SRX}XyQJYXCgs_<@?$O7UrkRs0I7MOj;{yJ3Y>QlmbW|EvZEdE_O_}6p{=2^++T;vl5X`#VDws=qBE_FfB)r=sKF)fT#ba}g{MPPwW8&9b&gD*CK$ zGtlYifBM2SG5p}-dLgQ$89DI!qpBV<)>_j7QFv~_HO;PVH&wco`Yo)#g-Z6vZ8cR7 zRTRnp;v-ryR+O863b|FbF{}Uj0h)P+ENWI`zN+;dy+vecZTS|+fMA5eM5vC6EI7hU zCyI&OBmcZrR7@<)A;=9wI=on7@)Elt+%S7oZ_ZR}5qDsCU1CaR|AO#h#F|^)UHF2| z%7n7?LS}zC`$Fm{+ab$y>B~jYVT?$+i`M0~N8D|0d4L=D-}}yA1YKF)Cm_e|b`xbF zu4|T)p#`)p>52w^fzqGujK5{Px1oh;TOV zTCA}I-q{0s5u9`e55oW21yg^$Kc+aVdZEP+zWEZLycC6^tGFOQ&~r^t=^18&T9l#* zj;CA|pzl;RG57NS5bm`tVyvQ_pgUb+&-zhaA74}lC6Rdue=)Nz{7i6qk*kt&=+vQ&2J-oym5N&yNN~>gc~~4YN>YQ^Cx|s&k`~_iPHJ zphU^#2u;p`%x^T#iYL~Wvn_2TXAj&x(9cKK+l1YPcSa8`cx2RpJ!Bc>=0u5feJ#G0 zP~Eu7i*MoSLEkyfvVFOVcZ#igk!B0wl8Vi(U;2B4NM;8S`Iu3w0PGb)4{FM=4>OfI zDk>9Ib}OQe@|?O6N_CKc|0la@u}Q_qRu8Q<`J3h7kLIfZX@NNd;-qFl)(5O7MV9zz z{rcwau!|OE#f>AIcD%p=Mz7z7eO^rkTmJA7_1>f&TDH4f(Oj;U9>NLpSuoR2DoX_VPESVo3stD z=QZH?fpOpaH>Qeuz7BYnt$44MDH`_0tQoOuQdnfA9Yi z|JjP)L1XuVEr@*^E*TLr5J}&2F)6lWry@oX>WzlMq<-={tx87d zI1|iNCeFoeFJ`xRt(_Bvb>~dgFWo&T3t^jY<~EM3!|WQytEbMEj=I4oY{rO0GctRr z%r7?fV0Pg|)3d!Rw|3jDP)nc9xuucTTO98pn#{{D1rf*E-$xwYjEeH8tQ(o`XLC*} z%?9&%B1no_zP<=w6v@0JeVECzk)r2=;NJ6X1fL-wf9FKi7su#n_6McOn#5`m!_l?f zbe9=+nkXdQT(Lx><*#dqKR{-LuD)&Yk1HYbx;V0J4k2K28_$nirw{o`QsGN`xHuP* zpYxSvs^4tKT4AT5FLLDFMcJVgc`e9Y&AEwYDe|VH5(r;;{FtORC*+H zv2!4_Q-?b1J6N_1tV6VoP+bM0u8xQWQ5SMOKG4MfBS%B^UEKilZaCr-Gs{UfoY2wL za<%ZROXP3ENs~YK4i$A2@VS8Nq@3Wu*vz&>jZ8F3GQPJRDHCRMw$P5AwMqbMb<2xN z>g)4w7g~tDg!l2j=nD*182}dr*uMlo_@jdegBIGeh*A`I?;8nyPye2- zALb~Y0-fN@-PqzVD>|8_Y`Rz@2jHrzIzZ|%<8e3VROk@Ly9YqzmGThbp!&wmOmc0h zKcH5NUUR}XnY_rkk-~{&Qk8rI^3Qp-bm9EDoC8MoVbQFNa`78F9w)Ffz~WOA#y2&o zZSyPIC{%3Ob#$fs+uVAR$5!Q(qd*m4Fy}7({&BHNgVU?g4UjZYvucA99w}7l_7U&La|KzixENJ}6+|00(J-p&d|NZ8k=jrxB)I@l`U;$%kRusS zh0%YMFR27xB#-$tDkydz8qI#DI~eft+-A z(j=q1ROTUz;S1AdB-H@1CIEfdOLSwXsj*wH{bj@ok5aC!qi~!pfh?qZrpgM1UM_Vh zZYABHAoy3g%FV7z7wdCC0{}wXbccxk9Q!(yQmALnxedp%4TsO3ka12~k#yBM^z+r} zjO7vJ^^YG5PE9vGhm)>uXha3}V=UZ~u&)T~oV9b*vy0mLoYdIJO`H;e*fvSQ@G&H% z*3|plt&c7K{Z^Uu#lPP#Z>lKTuf#WHymI?;&usj!RnC~5V5hB=9{`xJaQTqJonF_j zvqlx2a^v!}L53rQ-#~ApsBUNHMn_1ZcVW>dq4FRqUARnoyB4>hsW)Sg_`L-SX?ldW0 zcrL+h?*-)sz3oo9Q|-*vx+ zldacT-Cl%g+GIfIdRU5fc<0_LJBj8YOZMM9wJl=AI4Y5*a@c<*;OP_k>!$iZdcpA> zO!(HM!~?4e;9S;JKHPO)?bp@7-MsePaK9-u-Tt%zLM^c~??-;m#%Nk@j%zzDR6jMggodg9WX+2zDK%qf{1o6z{F1;K06=B~ zNRIp9Zr$_^?wUf|9|&ucDWwQyc9`A9K=MuB^Gra4$nc-6&mf}I_WS<$2^O-cF|`wi zZwzwGOke1vLhS{1>+OEA=uL^~)h|995MGY~@M_|T!)C45|*4K1#9+TUBHc~85NQRt6aQ@axR#&rr~ z3WDqwFQM}XL*ug@sWuJPy0-k*4j@liWxSoK5*fCro%$f04*2mzEYT7JstR?uh0+Y$mW5VoF!5rJ72T_K=Eiq;p7)?($IvK*6 zhuuFD6`vd}Nk3Y0oZsXS)@P={Q~Q9ML!QTN+fY~(Sf`w0bf>D6|ImGo`tHw!*0bi_ zvi(LJ^psBlvsXPVk5oO+0Yq~v5SwD{Do_+5<3^{!wfp(>wIr>On~tI}&)n;847Gp+ z&Df)y5Y2jBn{YNW&XR22@kce~b8GLmbbI!ZhO3-H<@J6I4_Ng?$z0P;`8OcA>%Tv< z2FW7ZQCU+B(Xuex9kgw-%6P)2BJnV{@_8eVTjloTp)-|5J}(}9zBoYK*gcLH6vK!bC*N0eOJc)?6Hi`yBfJ+tP(XSGxejh1F$ZZ9ww zf+l_uoCEQkT_9n(J2MRUf@%c{CD5y`ZF{d=NZo@6C*|JGhWrq~o+s$-sRw#f$dtRyhIU8k-*&yAyY0x{gZypjThK zs@A>4b!OM88qhG69(a>?b$VXyZhwi{oi1*WrP4UTJe21Od5idQ&SCtNMNi`wGn23w zulNN7&5^Sj4_Tl~<$826u@*RXt2rIFy`=(9Z*L#}ax|RvMvtp%X-dz@u!jQU7FF6I ztVIB<)v6Q|Vn*5}a+ytc!`1sk^x+Fz6^&|@D+$Z$TUS1tKXZFO48J%eDDda>Z`-q% zA*nW&>N5I5-P7JOq?gdP3!Tj_S5CX;@$X&$YCUn))dn5aAL>(KG4-O#-$gUlyJaGO zM@O!2XBrqSl=xYO!4O&0ZUhZGMs!}6%gy-BjcZzIPkn;Xl=RY1kh~;fso1$&7rC>k zn&+Qq`QfzVjHKqBpVjx&UuxHoFiPByaGKT8A(7Z;~x}5Y% zG4`1KCXopoGVZR1^H!|ARW+U8WNKZjMelZrVRdm3^|7CZ!=2>I)>Yl|41momTHthY z`4PiH$kXU?hP?7q`4rh89Ez=uu(~NXHx!2pZYc33~|+U46_v5dw`?N zVXoHk(9xr)b{dcxeuk)*r1#jB%^DiLwu0@hKHh9_ZsJ6WSTIg-$voqB-1&`bF`uai zuPDe48X~e4b7(ZYPwl8(f&9M8cO+GLip`FK^CW*+j3h*k+7(J$_z5 zOH>SxzF}_JO4G<89FEa%@>Hw)EnT2iXW>#jzBzCZLJQ?+*x_>OqS;M#KHYI?jJrHvzIEOCy)1cQHq#}q@L|An zgsrAMa>y}aLwB#_%2Ef@OhT#Fm&>_Yh$is@+$L*?*(wL7`yc8aQcmyTpZ(@rIA1J* z{#m$n)Jd>WHy^W~%J}}7cEWC6d)6_F7f&JX_WgLwXRBrD`UGLyY4 zvZv?3CXdE4l}5smZmv88v`Ua5He?Au*8}gHvyd&WNfCz9r}!`45b;Jf;`SC7mF?B)XrRc@aX(gkg7Sx`7@*Z)6HU4z7r8F4&jzEOScQFhroPD99(}1Ey(wCcR-8P zMLIKFmuovq7pjM!P0R?MP8#mDV!77BR{VtW*L?8s^f?nVKdVT0ji-_TY5{$-!eTu> zr#&qVkF8hxJGpsRHORQnsgu5U%@?vhD9nYv$Q2U1zC7LBt&(dm_?jkF*L0on;YwLc zLf+x|-gAwo+Z0VF$}}u|ZC)9%GG^o}1`??GTJ~E5g~L(ATl>FBA7HBRB5IzV&UkqN zWu7~J0$jClf4}t0;qlv+eQ=_PY2%)K}Ag z8?VxF?ybem73)hJS-Sk>h&L-6;LFtL27a+HNXfz_WB8AzB`Paxy$Vbdzk^=A1Y9B_ zx9-zkWgq%&@2)Pq3N^}b=I&L;*SAN8@><2~Yk#h)TJ3BA?T+EpTntT;o(ANkf)l1(4B6i#!c)=>EE> zcmP`99JZVTkVaWJns)a27R*@At`_cuZT+CI5py!ocV*?+NV7o%yQ@zmTbBh z`CI4;$p{EiR&Uyl=g#I&+$@(h0NYc^jBA`leIyi3qZu;L<{e6TSPX!!#K5$~JHK!p z))j>xDPWP*0&2sp4?Vejifhw)Hz#vST+QV}9pr9TUcC@?;{=Z{;dxC;G+x>D#mxQN zMGb3cIs)0^2ER-qyua;!+bZ-%Wmk09az9+SSS9NH{Y2MALq7m|&FofFNhKNo@#MSg zac>pU_|K2|?0LZ_2Q1oRIS?))k@z;fkAXG&4eP>@mmhAg72el%j?GDtTdY(@c(g02 zwNSig_Pm#1zOtSdJWH&m;(A|v7G7Yk2B3*vjUK%*LwXHO`nSc*i*#uX39COqEyNlh9!k{ei9r zhr35Z#(7wtpVE3g-AP2ji0tvrrgSNU{7>m{56gwm*Fj461JqOFQa1WNhB)&r-YI)! zU8-F8&r7kn)6&tP$yWGwQKPNb^)gjP*kIo-?aZSf%a&UJl(T)9Gr+rGfK{}E=vCCf z+xtx82Qa4Gvey5`H@c+m7VfizUf{z3GqieH8G^- z(90u?@!Ya0gmR0xzD8(kFE_?LEj;aTTW6@ zHF@J4G+16;*XEqJM4mWmLYD>kQ5V#7Tz;)b>ol+*>S|V6&PlCoi_QP0Qq>x2;$v?W zqmT08d;GD=J;do=R+H$ne`S{m}PbhfK4 z;Z4#?!lv^-c3-iITrL6%3W|m3|0J&gHqq&ZOXighP|p$lAnN!yRviAS5z~}Yi|K-d zL4J+evdp+?l@Xal*W6~oQSzaDT+#_e@ykp1?wMXJtGRhB&C_dY3uki}q6?y$(g{Q=yz#uak~ zE|eGk0eB(|a@!rM{X2<9^Q-oA;wLHVjd8 zj@N(Ibv;i#%tuixXEO?t+5}0?+{^Rkzn+p!vX%9f5(tbwCDkl;czXSPSO;s{sk{p4 z4CCm2=b0&vZQFV=PV}}hzbXAl%U1rze>3H*t(tC^#@P6G{H7Y~w4NW%Y|Ki-}z+BX)O*4q|?#It?9A4mNvg?*B^ji@e`3aUQ5sdM`x5oav1DV-b^;Arub zLC%eT#i#O}33rj6mc>#yR>toME%*d)BSpckSrk3Xk@&4?kHq<`c%f1gjc)R6YIym4 z?e>K$`Au;(ujBdruNA-a^G#s^V>3r^D|Q{Ezngh1VZd^thC}7!Nx5 z%~87Td>v_cm#Y0~tVpl;SI>{9hK5E7wVebk`n$RU@IIaZrCVXXD3Gz5)(zC1OZ>P|ytL=^2aSO} zU;JuU-wVs*3Qri{h3N+AIL~R`$XIv0Kufe<$K?ciwo0Na<7RKMxxBm4+L#rtx2rqt zDfV>NvVC>eY2I;vz+<78?)Wfb!a}5@19kn~DJ;>4Zu*u~dExbY5m_1;tc=jPWeosn zXgE)eV{w4|Fbs7W`OSN>izCpFSH(FkCHrh3Wk2`CtFg9r4YTPc=)y1~S{3dhLKc4&&;h>5O)zNLj*;RB0bq?=`WhU8WI+fTcMQMs3_1=YP}b8+tTqO3?Tn zM`EB?gE8Qwpo2#C&S0y?U|QhvTKo%1@GyKiwLY|VwL2@Z@R?<*3?b7p6S7I1VFqjd z4{W4(@LyYY$3H49pv-zxo|+Y#`ipZgVY4e^ zrM{OYWC!YG_h2iU%#9+x*Qog)jT}z;vTu#klMm#bl)HbL+8>jde} z`x~D&Lm0O`C4`4`rK8e?(=Q0y25`02G3jfsP`aG!bJUmke%g(1r695&Tzq9{ui3Hu zMQB`sf&PiZ(#<=H;wC(JM_k8wzki?=IUi~MHl1!sPK)j8q&R8^$EW$c@5cUURLrkP zulFmr3-^4nIN+fwhdnc&$hFe`oUrKWV~NKSF}LT_Z1Ux%-`cZ}+lmi8gE_F#)Q7st*YHe6K~AvgWG~)nt}1nu z#26o~)fedz8U8pc#|*2uDIRjGZf|?oPw`Nl}v==CfA(7 z!9GkLcn%@kav4W~7LSJ(#op2Bl9&yzJoL{wY+1oeENemAuH%_dAGyy`#+tZxTJ1hO z+cCJNf1;NXuZKWpB*IQbi)UWkf)<%I?g$u%1FjCz!VTt31xM=Le!^2tL$5>J9~pBe ziOTAiF3(u;a7=Wuo%pqgbcJ*HAKm#sgY&9O5S)VE`NP$BbHujoqLa0)8GuNu(J$YY zvhP4}hfdhK*_&T8Q@rxe4SUlcnY&ej*|td|tK~mWFK*H6hppr1xRtU4u3vMJzHin; zcD{w7$>}SGizBYbXm(tDy!wa0!On;U5*AkxC+zXFF4t;-|Ab>Ud1t8s(6Lf&{}Q5u zNP!YrU{jXEyBOq}>P#;$jeuSDuZIHFpuPWTX`n0>mvb?b;4Il(8RHUf*o2P2;GE6X z?)Yo_FP~Bnk{sMS?cw%$z0c2HziH5{A~oM)IrQ4< zX58J~c!aDsIjz!*#=7G_lol?uhlcxT5q+Fip@OjhS8$M}oK7JJb7TuZBkYh1zg9}< zablp;n-pM;kx>+eu-9`=%e>s*K7=W43>fX8sKg6k?}byil~tAQvNI_F!hk7xw zyWigY76a&1&doR!{EsU`^;c0=^s&*JLHOW6NjY15h+1`fbA`$t@5NV72R~v`s>Z`1 zI+qto%Z$&{&T)CHg$QWX87{c|4hX(44HK8UpzN>%hF=eNd;d6)VXIGu&bK0>qc~2c z>|S?bDmAxsA92)^3gnPKKl&cf0Y#?2DQx5~2~7)|2U)Cq>5T3pM`((*=40~7Xf>^+ zy(X_xChGjX+uOmY$xFmNtl!@Pdf3UcwAM4aKKN^zTuyS8hvzTmuxLy_r==3--IUCo z)~F#}bE$q3^|f#jvFWTw^5Sy%3l`4SIBx+Se7C8(`}3esVXt;mYPcP!T1jgnO+FXH zO#WD9xfdDoQ8na=3L=(;j`_<}!bx89cnQSYWWRUPRVnJhmynyQ=YC^!9QnJ9nrg z$Zv-ivByf+bbq(;it?+7keI+8s4cuQ9}s;iRLEu$`zzXmX*Q9A#ebVRO&G6}Ju=W_ zW`;MW0&f7zRAD`20&75ogXQ}jTjkAX-g;)KKnPZh*EAfzQTpdcck1W2F`Bc%1Z{>1 zX$hd;aDkttXy%NafvR0t)-si?+-nz7rcCMCJ^|9Sm2456dx_7xy}I;wm-}}osd^?h zh9>;#Ya1^t`uzshTPJm!|eIy)kj3y&NIJAx7-3!{-ha~te>zF2qvLtuXa(? zG_PpbhP)b;qB6a0PtOx!?Gu1uC(64K8;p zn;d?7`|N$n39kdJv)tPnCRm`A9AyDbnra=~QGSO)TYo}ptS|0D9B5ed=3!mXFq31Tda+(3&T!JQ z#3QCz4do5NplG{`EwigfLRA;Y%dZ1YJ1u7DCuSv6cG=xSJ>lJR?%Zv>@f{S>us{nM znRk3)4>gThO#u6SXgouN?VBD{gI2&{=%978-HAqy?MiQ&+D2Q z*%)1C9h17OQ9;8Ih=bh(yS72+>OqP`&~ms!MtgAM7C=-`H2!P~WOZ@hB6QfoD9^jS zUG)1(HG})azE29d#5P5^(}3st0G#tiv1)acXrz;;3N`Drt=x+arYQF2D68E4f*gj> z3{uvEbhO=13^k}U2nd`}Mfda&O_J`L86;_9T=uzp)klT-Xe9jf_?*)@;u+Wl>ax=k z&aHX|r)xILZ!t~xQ%>=a<9;-Ecz^OdJejo{r~$}}CGBKC|1Xg|=eCu)eJjMXdbE;Z z2^dc@2(wxr;k+o&I%ou1Jb@Cw#!6Rlb-u10wBeqFCN~bgLrX}}LkL@BOp4!28?C=k zwTv=~Fv;Ja7F1WY_HX)~T?2JJ^frxRPA3%JNRWS4J7m>IA60qJZZ;?63ZETnS+s+p5WOLJ4BcK-ac*R+pkruc_5CoAQvg-6qTcjUJ1`@ zYoPv?3I0tt9R(v?@fs8mqVACRAxxdGXFXiwXQ1htiZ`Y#=Uz}b2HZypw(UznbrLJvvv;3c z6~7nqAU`1s;=e#adK0>~8e8^Zd^W=CpjGm5A6>X0ZQkR($GWxeS*AgM{jy~})2x3_ z=)Ce55$@0l^&16TO?+Px2GM3BH~|EdAZAxQ{C?|{wjceBqvExv9dX8n+f=W`` zW>klH9(&qOXxTbP=w9>omr_1cS!g}7tnQ}&OpB#g*(qKgk3On+K4mbJPmi;u($>N- z-6F2?_9N%aW{c>GbgE*I@lO2_yC*d%MA2-pd42?2bg406^p~4{fg;`^7{xel!J zc^(A@T-Tt*(KrdyNI#zwnf_%yiZ|4xwdF?)R|KM8CBoK=QSvTAj>ZGurf^Icc27=; z?05_&7q%nAQ%v*yeDJs;pruW?!fLCg!@r_Cx2p&f1LGt@y3ERtw}&6uGmwjnd6t z?Tlq9*{tHp&#{XDbMgAGjc$82-}B#}xD{0w?E7ASl81gVs|}V_b}L7wv1__m=M$z% z>04E9ZhhZfvp$|Ln{2^TE?x5OAvSy#NWSb3RLo_#Kn`b}7H;bEz59m59IzV${N#<} zJ%1*3c_$IWjV#M>e%4$>ay;!q^t&SE7H^2D+;Izkam(Gf7+@RPEy(nV^+yx+TlRLl z@E51g`Oa&_gmDYrQEbe30hpSV%BfZLA%m%MWoV*`8D$CKu!3yDR)3Mjf;qbbLk}I1 z>zJ0;jY*NB&&Mv2e6+)|l_%~m@{IJ_gTGobj>NugvXK^8Oh%qi+-sGwQXf)SrGPh* zl|NMJR@(nX5%OufV7c>(t^cc(x)5$&?qYA*YeGgT8!^GdJrF^=$o5nTtl%dxN}#Ia zpzqht6!Lh)j>rqlvDoEmJF`Akc<176J=|4z;9@gzAHt}~UYa}RGZ|Qt2XMb`!U&kb~XLmH5=2H)V}p+tNFSF zBmzU&7iD!(rta;&uX&?a$&B+P)6XKmWS=PrrlhHv`;kY*iiFf_9^$cFdU8xZbA;m( zb}-RZ_F2)ed}!4Rcx>TB^X1!K4PV~8(hH<2ko!>hLu?unUaDtLi@$EVZT#EL=A;Xh ztyYbYTP5lpzdc28XN?NiezMCGr-VjsVsRXVOV$sfwM|NOVd9DhpswQ8 zm9HXNVm-|sk&g~H9BlL#b2Y$+vNY>MsVK1gC@N`u`&11V>IU7D_1h_uB82BJQi}uO z2i~#eN>xrWg2{`R$m}G#!*8nhHjC_T66j>;E(uWJ6dkyH^VNmEpKv5ZoW-VpJFjVc zj6Rwzt$D3_W-(-N#d>zG_~3?%=}#Ko*YT(_ohKC*5!(q6(>l6%1F%&^`A$CN?Abk3 z9&AL}!V9%&iFfO-8Or@#*+|bjYNu8rsz#WWXk$HGzLn{?VQ}F+k7G7W%f=cr znQG_x6XMh=C`RUz3BEIgqOP-3co+A@(}S=V#( zmglj~%x{@8MG7sxr`KSH;t`GPiBk^ZVf`T*!#@MHyFvYaWT~p$vVFtOCWsuCM^Uj{ zW%kzN0xOn`hUFBJ^Punsyk^pdAH^bmP_eTqHx4U48KMZ91qa+c_Sl8y>QJ&>g=ASd zFL+LNk>!ZawtH7;xnbI`a$}yPWQ#9{n2(k_f+K}*N1Y(y8C|6YD_KTrpC4rx!H3m4 zoc0^4*4iND77^nqEt4!;9HV%oWj;BTwr~4+mAg3V*~{+}8$;#d(*`t%p$n;$QwAYy zH-E6g1>x4CYMozRcZNJr752m9DRx~J#C${IJX9i74!!K1tO=_cj}1m93Lc_TMrGBk z`cq@tVb1NzOoGoot#!gfoVOIzS#H5%gnL)H5C~1llfy&a*Bi;6wIgsAmb)PsJoH%U zeXg7YQ4i^MFQ7spf?`I#!egpi&HRre1`YatO&LQ@d zAVyhp^8tqwBXlL&or&uqnrIIWous$TkdqI>s%jo$;B3g&{hV3!*;*8t5bZ&`q4&*J z$~gERU(gFiE#fN7RU@)~+QsdFNrx6pTGge}P6M~owP~=m0GOSmt$_WwQT}r=A8>D7r$zMl&w8QN^HpUe!TGV(V1(kt^$v&j zsnsQxC<{Nto2@1v9@5Gh?w$q+;5Pk$yuc6UKke3|xg}rSsCC>#*LeA-c;;Pifqr4V z@MOR zW(x1yhZl_J8DF4?lUZoX-a=i3*F_(i9_8wZk(X6v*`kZJtdqJ8nbAIFC(T3|(#KSJO>51DUgBaSoqDbbPpye9)&oX7Y6 zy8k3K!!G<#_3>M3O}L5+HG{FglUAtOHk@>(!`3~QbzYPqfn7~UGBY-KW)*ox6-zoJ z>hOph7s*l7NvJ&3YjE7*Z`ZmyN=TybCmzI+OLVS%oXR;Y^_g>HCMHv}J3V``WxmUP+&tH~>2(*LM_1)^t(0QHzo6okc5o+p%>joDS(R#mZmg;)=X zdsvB}Io92foAK)U;{B}k36ffvY+5fg(+`D=K>fe-XE=4@ZM>Ud^qV8prLqxh8XfPQ z6wHAHp0Qew;mn+g)S8sv|2~Q0d^vytCtVX7WbBkSVi=`?Y73z?Fs`hn8txJwp&Wtt zMDja+v|GeWQY&|B} zTwd*_xm`@oVvTv!5Q1czPnHY3+LF0DB=g%8B9|Z+=$Eq&-y{Cx*Y4K9hHxJuDdDRZ zSN3_TG!F^7V*o8sKE z=@OkCU0qLwby7?o7z-q#{cDdAFCS_E89AgWA$Wi*I^hIAibo!EI2A#=vC=byOQYkW-@t@iQr-0}l+CzPMBiJCfTu1rB z6=x@~BiN>ODnvO7r}O8szE>sM@U1y7yxfR*oaa;<<$9!H!Qd5p#_F;!WrnfJDPJh7 z=@8DmP#}qGJ0S@TxZNJoG+=GCDKVEPL$F?1UfoW1e~M&6yp#5iU<6*ZRf!@3ZzU4t-uYDlu=r; zWE&8U%6wAu2-yIRWJ{2#LWND=?J^xw{RXk?*kJ&Emhm?SWj#FFw3zd%nfKP%GU@j# z_v@gVc;+e^@z9kQ3~qz!E=>m&FLVa!5$*SQ;1^db@$ z^P~i^Y6*-XKpF0Qbf|Fro)L&^wS$}r0YqNHZ`)LWCrLC;>y% z=dmbj=;~g}4WT?nYCmIDOq8s~bPV{O%q=VUtE$kXhZ1vy$E00`G`3J3c>y{QFrw$P zHE+7yrHr`J3PmLuCx7w(vjAqQOgfmXfl$m0(i^WoeVE>xrG24ifMEF6gYfovkfWsa zkMH4JGmw&gv$<;)J%lA^SfSAw&jIsJ3q;i@_J5~$W*#lHJ*OD5Az}d>LW=rv(Hk$A z^n>84fA*(Kwa~MKHs$)CV*QYow}jc&!_Qy4slEzem3bCTht9ag67g|+*<~Z@Raabf zppP&OAyEGUz~%0oFJ628V+gu&a)T6wcn~P6u zxcK`jJL}^(Sa6|H=iR%ZrwJsEiZ0&?Tz``_PRbXnS}88k98D|Dr3F&A>Ivdi`c6`9 zDeQ)-O*|1tFL0@0@}}}&+GwoTSn&99%qdy2rYi#5dqKD`MY%w{4>0yPW??#6Mh01dV?gq zeLc$0WW-;DgxQlvg8EQmXQPE#Z%5o{w;;Ni`JcQJc^o;at_E@TgWtp3g@jCTLlLLmk z<)F>LAG;qK_*SGHc~b&v!h4M-i9vie3=5nz(8{JFzeMV(6~H(UWy@e~SbJnmZaC3Y zE|Amxii~k*ecojLA5yXk3pXtz&>MC@qLW#5_+jD3}C*0BCW<7*41t+i5R z82)d(#a`( zzC%flhUP|p$-l4?{PkC`{I=oZM^%FruChnpSOF+jD54Mt z;*TMsm0)X8-+b?rOkD70VqyEmR^dzjVze?FfJ+rWHB)@TpWrm)su+%Wo|r5I`(MF$ zb9i=M{VlWl{OF|SxtwnP4H}4smw&lmq7g?4C=t&UwxskkUS{HPfOL(_sy*x~>Io0o zE*h(!i&U6ym6rEmT0vIRZWNikNcjEU*7=c{veT}JjJG?W7Q3JQ4p)b_5^S+t*O{15 zH4HEtqkPB=sQRudMW+;H!1YAxNhkOHo|dR;H*@#y>boB%+Bez(_yTEo;+FSp4IfYm z@lSJ^>hVJyzN9iJMJ`F)G;ln_vsWbBz_9hk!dYcd@bU`!ZWb**Xp~Qf3lyY3XMuTt zWrz*FOuf{m_U44LxEd2OYK(pa*S=&b4*jw>cq?Z~I>>tc`tYk-dzG7(z9XnW)d`5@ z0*f#z4%Ew&>hvzLFzXvhzkv`O#6JEp|TT}R!`9dxzZD&HK%f=_I!gH>+w|2&3a zoq;vc&4E&p%tx08vnwkSN0&T#U_j4ixv7a<&AtuLTjT(A)l8I^X=~M~g5S~?M9~U4 ze26I^*<5s9E0z$SQP@bTT7GJ!hk!-&|B8^qE)n8U>B5S`pQPWq$ z7tP!`STJx%Rxt`{+a=|m5(@Yha|l!UwU&LavjtMXIr@J|3>NykPAbiZ8x^w{b7~hx zfx9)La0&+NTfA7{p_P-X)JDO@Odu(!8-I}!m^LCQ7~=9lELa#j(5n986iAMgHH;O% zZ8z(S3_FJ5d%q~Mb208!PG3jHN8;cFWeM53)9Bag9R9FX*LFm31$^fmlkEq&tWzJo zwT>meT3Q#@n6YhluEpex4d>8sJ*P0Cqnw&kjsetwv-uSy0q_X249%`!>}i;5G-BXW z?5*-Cni&Hor=VHV>HgE$by?kKWvXjRf%PnjZ?SK?*w8~yW%vm~V{z-U$lE)7Bt+7R zp+oLdZl>yTUnY5mCCJzZaZ(xPOIxHao-fO+kPatk8mZs>@c1=cCpX_rH;BJB>qORY zTFgyH(HPv~9Y|=R4R01-50`)1ihquCE3_b2g(S&f09K2P_HVGIbxh|an{GRJHrXEVh|R*e2rwr|Tw_{OE5))1IFjV$%|3-`Zv+ zBWXseZ)5m=ebnw}MxNR;yv+$ECOhqPzNkZ!_JcRSIY?56q4Q_oj84`rk?W!;fNU#- z2~O~4?d3ctL=$-jO0I~^Ju}sMkZ-|P2}MRv8k!cCG`Djq3%Dn!)Zmv{wMM_3_-zp1 z79DC$Le7VqF`;z^*#+;-57=S2wYCIPLN!6ABrYzt2WL{-LS>l>ze@8%x&hiX9$c>c zqVYlSu8K$L;CEc9gx7Yg)iRP2r`lbjr=`Gwo{J`KEVsou1WC7DyFr`=(M+qK_pYa`Z_4jaOe-zP~90hgOUvhDLBmoG5k zPM^5}eyVHm|2%~41FnZx!Mw}{eH$XzLk{-VuAdLZ&rd7w224A2)rQAu^7BE71FQ9q z5r@buGR%L1^JY0JpJ92r-p7J7a!R=vsw45odrSepzu#FqZrD%n3AJ%=r$Xietfn@Nwzp3{W9U5psQK_cRj>SxwA5&QkXQNu}l#l{QDHsmv6{oM~G^elqi z#Am^zenTFJ>#33l%FAT{Fur3knwhi(@WMBi03*`Q1G3UjX#RKvRwy4*_I_A~%W=^N z{v81pR!ASz49uS2Rij&)pq2RZ^p5Qj(l0X?_7&l29QH271^+mG6%c4hKkNY_!kvG~ z@DPsX0pHctLW{6>$*-EYW{i}RYrxPp#4n9yvvg52&$i16h4}2QgCDSi_=u&V4BKsS zgVT}&&%e)>+qL~LC|z>?rTBQ0{IineEy77)zrE%OIk$WBL;w@er@;3#Vyf@yk4t|am?gt{o z^~Pu9@<|P4C_(}>NZ=mQ`jbzNYJQn=5pL{va2-wQV^|Gu8dY`XHx1Ay-NBl6Zeh9%3YG)% za=j}pHSW~2&8`PydM-Y=iC3R(*x~8*?Pkp3u##LDox<{o5^VXW9GrDI8k5<#+fYdH^1Ry6la^8#&4UR z5cbkfZzIMDhD=OAwqa0tjFq>I3g-&=u^Fid*BW)Y`SX&zgHTf)eU5P#(jDBzi$_%d z^wM=+f5Ffwu;SfC>GV;A;Zs-GvU$%thEgAoI|hi?0@83Fk7TotQrGSTny|d0M}I$1 z(2x*a0K@_H<+;De5*OPbEs-w7Au>Z4Kma9--ID7pcGjJ>?L|OD{g92Wf$t4r#nE3r zkO0;naWvcSfM@)V2r0kI*S8lAW_^^8te$(?4M0TvE%za1;k`(stzL=Bj)+>7TUOyQ zc2s>!bnGn>Xfs}xXDJGPM7G9sNH|S>MWiga1qmn0%QBz^*c~r6d9fVKm3(Gk_*639 z225v8sSbH(V*ADUS&YuJj)hy!0EWYH!>+{2Sz9il5c$q1^j5DD-8NYLJX9PF+yZ<= znhnXdeNuFRDt3q^H*9+b!=e43$75YM3bk68BY}W^EH^`NkE-n`rnrNC*{1<2oo{`R z%8K!VxUkoCG}C?2AJxH9s^oFlTKa0Ai8=*!N$IJ*8r_Z-JQ*}C#JFsm_2h3q za29e;T*@to-Og>aV}Eym3L<$K0+o*eAydn;&+V!v^XH1&X{W*I?e`*An+Yv9jS}>> z?SM0y?*#n5A}`DOAXz_qmB{zc=~;=&TVa{U{ndKgR%GlO>7|O6qiv{0^d?z{;Nh5? zGJ$OtWrzRHf2+lRYL(Fv+lDt$Zp$S_ko3}QMN`Wy|9bcPh*XJk+)jA)Jaw3o;1dvbGLKz7=6(SO6>LQRb0n@HS3 zu78@ht0S<6;m@Gjp9$;JTLq(bKu}jZGU%Sr(uOLLZFvbWt56Dkeh5m&AiZ=s4^SXb z_Q*Rl@_6vHN|}yC+5VQ%^(YA_8<0;gBS2R!)CE2#QsRON7Sjg(~87)VT#ef zH$R=06eCZ*Un^^kQ@$wkQ5-T<90d z;KTL|YRgW+`5v-#(!W2ODUO?~Or?Ko#d9H?hdWvGHcNENarLol}_4nEmByWDpzv3B1D z(rDm^0$GgYcg`#k4*CDIP78`un&BN%3u1-aq)MgUK2B`7L6Odp_*p2!)xl=)_r@DO z<2}SJz_u+9Cr!Q2hIbU3i%5^5W?L2*M>Cl&^pW-7Cc3JwAmt)hul;_V*us?gsR`&V zIxSC|c~OODF+5*cW~Xoks1J`y`Wd(-IVvfmuvDxSsK$uzf0WPxVQ|*{Ewpo@v|StA z!f~rHO#%eO4&s(^NI^Bbd9Q==d}}eujic237&yM?KQhnkP`C5qrfhYVpr~BXO?4mT z&Zro|{&shlguB!K#59lfNuYDF*|fe;B~6H=H}8*erhrbA(KVcx+7KUjliumx&t?0C zj(^r)z`6xR(wYqX;udeM^^LRm<*H>-G=u8D$qk60)zdXq|`UH*(7o$EOSn&}MJspx^jTI?S$%BgujcwqxFI+oG* zW04d>gBXtSSc!S~Ohdhm%2_JsRu*0GPlBqvuOH8!B?4u~k#+G=JV5gbi{L(I7bE{4Mewd% zM1y`@n#b*sqyg~jH`fBYj!j^WO(4MFTcJ5Jf5(i7U`!-D;3!8WV&+J)MyRx}C^a*H zCxpxkW`lqh0MKu;FhN3h&(J+@k{#nyWOUzftngYWCZoh(62{M}6RenE$(E9d#x z!)RRo@N;^xgnKvCQo7_Nz5~M)4*L5S_(}YSs^TWNfzJJ-cyzLjdNOJ@SJPU=g@2gF z|5!BD%Cu`e}A=(Z&`arHJjG88O|DTvWYpwT4~VY>P#{=Bbopr)qfv`F({fVrMx;k z&s!B3cSG;d<#1T%t+tzU8QRN;MZ#;}p5&rG>-_it^}FvzIc8uoo*$5H{7ny7ewB3J zV2R9mLi)LCIi_fqHV;Zzw?u1M?k@KZ_+j48uE~g0O_U)V=K1%acZ3ZHL-4Jhn*+9$ zXBgv3J7A8EbMD5)pI6mPIIs2}iRpZJ) ziqS*8#vf+Bm|bVpXs$J4L|kx^%D(vQ8LC>SHAlGPO=R*?qpw{1-|&K}h$xo9z4wX_ z3b&<_fWM4UzxSP++Y}&ztSZPk-0gDsQ2vNWPRmr_G zph}ufVmJ@Kr z*TiBXp~=7x;)?(LqrOfUI2ayx(UdZ+xM+BehlQ26z`2W=pb+hWaZW7Yi_+qK<*c90 zl9Xl3@|9e5qoj}brM9XjCPuf-B5#>~Uu_MUNkNjc{GQ20JX;{Y@2r79Kg+e=voiHf z>`rB`ie#U=`vPZg!6)y+c18gvC^;jvnin$fw%ga z<4*smC=IsK>I?HMA$zgIf_; zY&gxZ6edsWM}}Lq2o#_uC)M4Y>+5%jDfzJ&!A>U(+cIrR_2f`WQ+-k9c7RQ1?MRaH zHvviUoH>sTrTY-hk1eKKX~2E`%Z=&IyD||NQOj8ommQdNR)dZu%%jI%$3WZuX2TGC zbi|$IFmQ?vDIv98vGD&T9M*bV`P!0{rRQt~OwPcE}uO zd~ax3#;HCmvZtRrL$1qVqe8>C$OPl@=D(Gws7jLGQEC!g?@+8UsHEsWB?@-d=A-Gq zvXfR&`_imrP_-O5IBUU=DRuh{e`@?8^Ej&GZfJ4O0ygNq1EdFY@ZU$N-r`NFhuUR6 zZi}8k^;!IBQsF}ZTV|^Fc}*+_uKXev$$LeeJ*(=B2RHCA1e`Q1#<{jkXrXL88MgK1 z_w{jb*{d|B&s5>bVTr__yipA7IQ6Bbz5a05Ye$c+HiFdK;{er;FPh={OM|;{%z5g{1@(8LncFz zjb#oJ>vo8K0J6Vq~cp$(rc@^Y1 zYk*Jd9#Sj9+g!P}o*j(V&}iR4Ll9IY?8`fh0Lg=~8H|LBTN?9&Lp%zi=sE$_p}Y5@ zeH;=3lELwN00b>Jf>zm5b8~P!6SESlJMX3Mr-8WJpd~GVISbqeyJjoJvbN@~>M>wg zT@tm^x4A|v3Cv4SE3njCfvem0`k9>`7jXXZZHhH!=blB_)$W?p z`P65XTaPz(x(q`(GA>ZNX%pmLlO1IULLDvbr|X;j7(wT~!nRg&o5?uyKeC#`k)2Yh zZhLb;8qE+aSG-3PZEjf-d!Ho=Z9O0Tq!@u|Li@=#PQu0{&HVQA_-H9e@0BisTQwV) zzdjOBttVJB*&hhl9Xz+L+(9fms}P7UNPQd29!K=4-&tXwSFxW&3K|O;Z94MJG0Sw- zDSUu|{1WODq)8U|g-e_nuqSrpu<`Z2zDpZOIEl!P;wC2RHlVM~tHiv@h^7C zwEwPZ-7-UC8d_IM;kw(>zn|rL%TqP|b^-$CRH-BLJf`8&_AN&1Mg2G8I0>csuqv%a|Ru5eurQP10(u-F2Vb$UT&-R$YmS7S(rdp1`VvuX0r?&N<%?m> z9LM82Y!((nxtW=cq@Fl5p|By08S!KN1~dGv1i^z=M8)0;hiN)NCFiS6OeKz%=@eVK zeDRNFG!eWi-}UsfrL%%v`ckcRKaYA9Ce}-~BbbVgqRUxpGimG`d+oR^@9Z3`8{{x2 z=@e$t+4wiIfnBT0q`(ZD5~%R3(Kz3iVnSP~8i{%hoj&fJSs#48B@P*$x-KqjIu9SZ z(#$er_tfmGZc-bZYeNrobhjxfgaxlts-0LHKJPo7YzKQTme1?`f0ocS=kKc6nU})C&-=Z%1IV~M#USJn zD5!W?8dvG;xJ>F(CMr>o<|Ub2tpxWu153pRH!H%b&C;oU z+{BE--{E5R;L|tRXat~5mLHL2Up65qg~c#eW_BytVJ8z397=w=+Dm(C|UCcr2s+Dwuy;8IIEp=Gvg7 z2o<}MQ&;{wh5c`sC`KhZZ(ueyaCPmdVKg?N506!C|671bpRuLzO5zmjT^T0(?jE7m z8^jywH=nsqiv!JUbsI)&WB>XGprM@s>7hbsS02?r<6Rp-;%5cTuMHC;@)RJ6y3^LReGtypnGbAM3jOJvkdb#Z&8k#|N=pAn>zw%b;)(H-V4ca}I^7@s-aRC%LcU-Zi? zg#1Q$Tt3iR)j?`;O@cR;a*+2QYiJ&~>t*FdPeZD*pU);5_9 z?R3fj-)gLV6|ELUco++MEbmddX^A+-%gQPh^*`$Fg4=@^7lmw<&@=#EPCeJlcS{pQ zR_aff!k|G<$kGzO{`r>;JH5{%qrKk4X!hzuz|#S4kv zCkc_R0zM11{W=q1Ih@V6?9|$Kjn1|y%U;%AP1ar28)-N6@5&`c&7C?ynf` zg_kf}KbDdhy+~9|;2CXIsc>sRz7kqV74B3IbaWm0E$?HegQWlTQ#IR4(6LXw_qgkH zjAN!I@|u>TOS{RR>!y}IDszZ1d4#&>vM*tQ{Z&{6}o&Jr9 zVatvuD6{k6zkZrjiKT#{Gn_|tZ0a0xKvywlU-DABFnWG70kbEvC-{WKJ*(9A8DdaW z%a7NNB7Y7puTODh=(B4ASk&GP%j~wCX$$@{p_@FQxbhHIDGK)xdc)>>XU*i%jouXU zrM~)-OC^A3+BIIuwz{nOM3r`eGhVZ=X6=%Ai=LOL+5N2%4~@E@8VH*a zyvSnYP?8}TSaD$oypr*#GiEW2?f|ctU>7`v6*KcUZzbv#iJRB)3B`)XII= zBo5py+4bEg9!S&kQOvo#yv6;%QtU55!T_x4H zJkNQ`XOLcBhh^odJ;6tZ?1aRj`m0Bvd$lv zTBe_04%@SZb@rY%0uD_^yBF%bf={uZavUGy1iX6t-oc$gTfq@qopJ1Sfp(Cv&m+R8 z-T6WU1;9l08} z=z5H}uB?U&QWqWL3@xkm>tV`P444NrEsL|k41oyn@}d6uHM`@gj$us?u#b>}Wf}q} zT9qpG%q`xA5A7QBi;8!#9lfvaO_hi6h5a{a4>TlBz-F-+#&v;m+0?$1-{Dq?USQus z{gyN;42~PZr0D}fkV*Ld&dzg`#)!@VY)X}_9D4#hvro=azF0Hybe~H5eFKczZghOu zJ90y*3c0nmvUaRBe9FtHOSAPeD2>FUWRHh7^>x6!>TudsY_D{WrAT(|WRBa+iJs&y zvR8+yptDx6A*8pmOuvi0=`BmjY+(|WlaevdAOr(&2N|6;B}ZXU7aeBbzq1_2AL9So zs=U_sQK!wvR|fg#j(F*yAe}ZVjvH0CR3_8=g+y8cpZk+;ubr&*6y1+QP@x9`+Izur zDJ155lk(5kYhf-Z9tzDe-M8O)hc?Z{mF=M{zU(#@W!pn1ke;Dm%`My5e&1>*WQ+(` z&PkqXRWceXb2yKs-7`~Hhh-uWlD4?|47 z-&*pxv{ka1mh!Aw>hJO{Tg!joTjy9HgvjEYWk9hRC)6WleM2t9g)6_7WrTNC(lPHN zL^DGZ8H^w`562q>b`eF#9QU!>gmYUvgC7jh-)7NXcP64M@*sz;8z$z8@a{YapfrCCN zLt8mdSPDohs+`$NrPN2(R%Y3oDJN7^yJ^rc{1&TODciegXggHXmj7z=yGstU5ncam z{;tj*t=0vQBTBy#P{I<6O8vuuUT{FJ*u(BPMYlpKo#KKDwUw} zYd%0lm_&qE(wO4(riv@{w6`N}M7fiNjXz)?FG7?l>~(VEfM8IKRG$eQ*W(4b%mW(( zQLU7HVE0A8@1Q23e^4G;%+u$Bh(%{w4((QT&G*mXSx3=5*s6bau2o;&RLlPGuF8Kk@JTn#lY7SJvD&(Nz(N&738MIe#u?bwwF4<<_X2#XIH9Nb@V@|s|AfG zbL5;q=fimJ4qNOM5i%kpioOh)4yI2NpP0szucovi<{Qi;(6axz7t=%@Jf9Fjh`+Sv zTI4MHj8SokiBlue1JE|*mT>r1dkw)SOO8E+T~Q$rxsF*Q>gi`R@0Jq{Fiz^+lZz&Z zLO(eQVju8{_{cs0k&jw^CLz>#e(p=I?%T>Feoo2aCvtbFs%Re0r*A@fRk)bT-B7C1 z*)})?mfyl9l6J7~-sbL)OkYrJFdK`UtSCRxoEG1>W83lrf{c!$7Ji#Sgm)G%Xp7~p z@*YbUM|w+9|D6A9<(d)9jXvvSxF?ZdPEr0+s_Q;oXw$mt=ZW&9v=&0)_MtE9a*Jz~ z<(7L@N}Ld|QD#^iA3Z#MWBgeeIr&2Sl52AV3@1(BO3~vV1R4jU3bc2W8&4wiHsL@d zO5A{MBuc-LO8Jwjj|vy~*fJ*fCy zg#`8%TW@*Ra)A^02@yI0(P*m=vv?dsj#$uaZ@z%0u{QDZz}pMWj4oIExX#uk+o`t%K6>ln5odimQuL9V-^SbXlv~rnt0ioqVJJCyLHR(oXX7lIvArZs) zugG-E*FzR$jdk1kH%E3ceu(lo!*kfU+*8@y^447Zjc{{R(Ats3G=%FiJu9ApmZJ4T z{TGz^XTr?$@_llaszMV<9#4ABWAR}G?%A5>1rb>QNd63xaVEpCU>NBKeHlJA`TppTh& z)}k*(rE5hi$r*Gs{&7Bn|1DF*EZ6w6Ld$XA%-;1KI}hN{U^Ig{5fv5_&F15OJ!d%9 z7MmNTO6Ze*IXD=^s_N5t>-ZhQ-#qo`MeZ*%zlT3a4TjyJe|h~^%kP#PqI&j4)1JDh zjQX1M2JEwrkU=Y z?(fKvG&*;Ra9Xl}sG(;1x6A0A3t5{-Osww1V6y?>dH(TI^4w~!%Gx~gsb2}^f}+3j zS`Ic*)^9$0RJYy2|3ci(eq=|8NbCnm)SID1>gqJyUCs2z*TrqWIA_nJeWLmM0Cl4B zr~4iBwrbf-KWr>5PNpoxhkA5~$2_DM&$FmXMk`8X;b-^}RgUO}vXg%;Da`ltJfvoR zSX_?IsiIif=>i#etDzH9k7nfk=pjQgr_W+2t|u9#rt_aHNz`nH67Sp6{vpP;%dIeH%}C~*spE- zLpKRD(ysy)xn5)!8XNS$t9&r$kS#rOWkWT3-Ch}mKmEq<3Yph1vwp*Uy<>5it$7!@ z@X6K-0PupW>0GEQf7c{eN|mEl>DJ9pC18%snUa_Ii7kB+t*jHsZI5j*0lVGoAg1P~gHe$#u09G%K+~ z2B5iPRkq$c&3PTzc0OQG#5NuDMsofYw(q4QM;%uXy}g{22nwUGp|UteNSqp{+SCl7 z`q-_9G2qnaU?*aC0Pv0A7>S3s-sblepH}Xc5uK}I2rLEmE8C`siR-&rKU`^cve&?k z$V01u(}PRj}# zc1&N%&rC8yYCdMn&xw6NZZ|cMN9f)Opl7M0g>H8_dlEmJuOUYs+i&PIJ!j_sM)EH= z9k(fUn*iFn=(UH_zto+0fEtQz6aaKvdr}h?rF-q$`3l}|LH%(0D8TxhW-8k&9e$5h zK~X<-KeV>Nml@ElYAFXNtcxNGT(3<+f}auVGSc6jO5 zqF`n`5_a|T76(;;$1$V>d1Y?`{TtYFedYjISfAZ)9W^Xb*)?6w*gY)geuJFdpYLs+ zoHX5KJ0P(I%tuFhf$zn&3qawMPR^TzP?||Rj=HzwAJ%5=x&bnxAiz4xF=Uw^#gCO? zQzH-0?C{(l`1w5mE8ls#nWbEJ0|d}5vB_;3C9k0!kN8+qC5*XM5SQ>$l5GyZ8)w0V z1sxw!-!v1>TLZkUE;=3E#nd;Ww>L!Nwy>l62&Xaye=^+PBm8=)j=_6fIg){>tp$}d z7#-G58)tn~L)&3tiXOB)JE>-)rvRcGY&_sfe@FjufogMSL)(=%t zFjky<{GN_8Nc%muWmk*QK6kkD15%p7#->XU7>IujvGnyjTSw* z$LtJesUYd9>%@0?uJ^>!GnVGcQoJydXH?Kk+iMT>-8QqQX7O9ihqpdKmV-9{`Cg(F z_SG}wvx*p7S@m}MymNU5La`m2s@0O%rzljb_6F(;|IIExZka;GbD}wra62zmrjVVz zaypB}$W_UpXn4PhArXoIzGKBXv$5kdUjWrHc&psrI;qH`)cEIi92Jv2HEFhi(3`)? z?2^t1=JMPkcC>RLEF{2F@e=sG|L{TFxU~-=U@}BH-R28bf|`UsXQugomqjTLd>YqgVr@eN*HsI@O1rP6*_#DfTMlc^ma$%}Z6+uWP6Xk;at)O0=RXGY_kG4R zhpZF=b-lhR{?Bl)2Eo8FAn3q0TiZ13U1wp6!7|%3v}APH)5zlqJ)pKzdAgXVe*0Bo z+Ps?qKB?34IBv4sxG3URA>kBFfb@Iq1wQq6=NaZSo9S~PZ=6&%fr_<25!YKKGtC=E z4a+a}Y^Q~OzK((aY*%@Nr*RIvP1sD>hwImsq1V3D!`aO&O;QnwW!)dpeSbyZ-Bqiy-NwGwVazx3-!nj-4WHvfRr?P`qg zWj?#}QzU$>OL(@eJFr#%(ub3u_D$4(UvQyLa4Wm6hLne?{Lg&H+xt3R%`p>jWdPyWTNk}%3R*Y``i@**C1vE1D=yuv&^%=^FeeNgx(rP61s=x6<6H91`y!5Ttgm=8 zI$$=jWW#arct=sD(;x}Ggz^wA9Pn)%iuPGF$9Iydvgo_*RdL#A@1!dn%V^ym$umGG zcKu|`$ph8w|3H(Xaxv7&)&i1`CzJwGb=bI*o4yhp zn4U05G+^;cnYaer7~fISu1KOK)_znido3Z*ynVd=Di?_A_WAg?3uYyng@4ZW8}EjjaH)ZIC_N66?S7PuHWEz?O#$+7ITkh@^=!_1 zc*wJGyL^nu8E(#Rc9v(-yq9n8{!bGVUSn)&=?4)413^?H@SZcXEVpCN9ndYe-PPA? zLanE04{pEb@u4X&DBcaPUiJU!ZZ5W1yefX`h3!P1IZ}q4ZBRcpMwI6XAZWuqAd9*i z{-GjdP(?0v5oGrfHsQ=X;Ei7OD zoQjUM-cC-E6fSP--}4xz&ZF(nOeUY@m=~U_(P&-a5|2$NQCL=A0s&;Ws>gOiN7Q#J zI!`)sHn()uIg113E&*~0VnYwfD2iq;D>}?s0RB#E=V0|2Uw}Rnn}3nh_%Qw~82kPH zTU77haT4h(@jDm0vY{B3m&C@*P`YdXHLcoR6~AxfBQOh0%}D-NjyEXl&8y!rJAo_( zJXsjJC(nm$B%msL&t>h3hUsHQF6Gv#_9e45H{ijk8l|S)dKKe|u?lHuMd-(t4pOFM zeba$PN%6DpnbB={Ovj^`=+~U@E!exAMG0Tupk0xKOAJ2`eIl+shp_#PKtcO(C~k4_ z|8e$~VNpeG8|c6wh#(EFi%@i7Na}^xSv(MRW&#`*EK?e!Lpn~I?w;=jWst|KP2~`K9i)`iNIQh?_R{jZA*M%LMYs{ry z#|04wxEr%mXN`DlC4{?L=R`6Bc5pP_I3-~LrgYy3=$OIfHRA0>HH&N|UfBV3v(u<~ z%FS!0qXOOlNqr%6MdV6M0JS5(?DoQ?UjxoK&oXuBGyf3hf~eJ$!S`bAk%CDklWQ?i zvRkZnF`EO!9tH7pG3}O!qUI}GHdc?jk*pGRoY7ic=;toD4cErPmH=!i3dolFgs4BKpi2jpEWS6w9LZXcZ^r!= zhWY{V(-HW9&8*L}Q-mcCxYph(#R7YC7-(-6u*n;6&S)tp7YG!4J7gAu1#xAw&VXU9O-}`)gtvCm2!UkP`_V@Wi=ankAC@Xx4 z^mxphVnbaXF)MFFWw2iqYYaV4N!=xRZxy%w>oY0gn6ijL&EGQ(oYH*igg0Sw8_wMf zQx+6-ccvi?c4lS?wI<4h*JExv~h()!juvdv8(D1-O-$U-iG;+{*I&>c{b#0$`ghy?>{PC=dGbiaWk)p(A)<+-h_O6}eF3edN{z%D?LI9@o-UbYWma;fHtnzb&xeyIhdh1)p{daKnO z4a~t_)@|ga)3f;fysazrl^iLkXgb+K*xh&~X2eSCyoZC*>@ptLX=oU+#`xS!CuZ#+ zPn>W3HN>S zE6)&o2&*##QWwJP6mUk5!L`Bn_g?xQf59ZOudP`oOkL6058tVcBkgW<2Nb6AdL|Ht zQSAWKdglJGy{9^(X8NsEZr|w!i+{gxfRvz5r<1gFC+?rPFV{UK=FStjrQcmdqA z=V&aAlr+EZGrMioA$~M9P%rascY9%A?Bb_v1@!)|Fx&FBio~J4$Jlwpz6di{wB$(` zuiq0%kNd5C{TTb7+Fx|(N}gr42%9w!>^(Q_2s>&!g4B&lnfIjNqt-F3W5saf$1 zHz$?5rjP2W^ApF^#h;6AkB=JoK?ZjWAouNcx9Fzx7=4i6+7fU2uY4z}|7w*irpNVd z%*oHTOiE4_HoL~{d#1XayeaceHqa}!;?uH=3Owbh38~vi?ica&IDB~r^!%{$Ci?L+ zJ71;*jC#MYu0}@Dlxm;->*jYBmqk70`6m^*>oS6f&eL@urfP5lju;5(g6NZv?~bFYo(hS2QcRh`pj@;eDxuEt|O3CVr$9@K*{=TBj2ERl= z+Iv$1)!p78O<(OLuV>U^z!7|7l@UlOVxq0TZ64C4PSe2h)9X1~*^G3F14O~;HIba@ z$(Q%_ibPHm-T0ZG6x5YpxX)L{kKFlukAm#%HjJz*C>PD!j9fj+`yDHNwT0MP+GASI z2I4WEzOza($ClSLG*@4_JRgRM7* zZ5-6YqR&G`=sVzTFn9WWbpjI;K_oU~B6#fY7TtMRqm9D#ntao*kw9ItY)Zx;GX-Da zhq)6n8vWC@0sE0liW$c;&w?_xtORFm6uE6%+}P`o1g;+qCN*guQ#txYFgETcf+}$x&xA9k>oHrhFHBwt_cF2zL?{i@ZOR@?FJWJ26jVo z{JMyiHE34Xj{MH2!nG*HHKO&sHFehKbfoQ)#|kN-7)O881Rcw5`~*%V!n%G=O%T&& zl`?BnuK}guK`I)2mr{lUN-%}n&pfv`7RzSVVn?TbIyLY0{;J5(#;UKovFD9q6z>)F zVd^|8?eLv_$}7Pa1Ks5(qZcqnkdlg7ZqTssSxx%m6IoPt%Sa8N$i7I{LCM9a_yl<# zP7_K;{;sn>&586x$z4CgCu0i~HrAQPp}hI+pgI1yi_RYmIr?aufAV|yjH^3DH@$eh~;!j3rW5S8J> z<&T1hga*Ax?#+6ulbum<+($@ZL8JnYv%HebEj}s_CFr;kDwr3UWhb1XC@;{NDHIo; zg@6eHh+0Q&+8h0`zl+4Y5yd+;34KdODeL6rK!>IobM;idmthaD$~xk3u@TIxD#$t(_T*2v+SP-^%JG2r9bcno4Z z{%E|bGz_RbDfh<0jxoHx|BBM;)!tREGTCYES)P%*jqC1)etn~LZ}I$2O6a|R%RO55 zPK8Ar?0hP}T7LEaAUC6@2{F888q3Z7i9fe+rd)Ibii~8uQA2*)9<4~Rm#xWDm=4)f z?{p3jJN^^bE`EWlr9n$~`gTUUNY{g@S!W@wxmWv@QBrT$NZ}p!Dx@D;>fE@g^@>8O z(q4INuYO^3qS*J!KE5goUPInQ7Z7kUlL54_^8P0Hh&=lUNDqD>^=ruB+y%XG~RvRjv?fGp(;FMzHjWXE|g5eel9>m zC$6sZGylK)6!2uNa z$$|T!ApcX>;@bG&MXnw^sH%(q^C2;q6oBUr?uC)+1xqyw=9uPbrphbY#i|r*hC`eOvTet6o@381?bnJ8mx7l>EId;ol_XQ|{-l zLt<>VNzr6K?0SU?B5)6Ql+BJ(d%92Po?1C;^%bP8flO~>Bl*)5cAQK41T={pOQ86u z40=z<0rCRzKQhKGe$QxqM}`PQ>3kQQpTZ9U@&$iTltPk!A*bfz4SFFCpKw&qjC@Z4 z1~F*_bf}ld;98g<`OXL6#zI}Qsz#%DK$K8lxM>FSd?zF{xN$Aiel6G6woA(85w3kF zsrMUE^S_BL&);7u(No8W#ZpQkoDn(sQB?Gz9V(jsJrJ9YUQxftZQ!u(h{Ulc4NmWEK>RsUDS>8 zC47&uZ>H!R8%I?5GD1`pB{8R-tV|A8=hz4c4Z zp-_J=A&a3=0vPD))J0K$hTsN($-2X_ThF3>oRG@bx&_;eH=sh(X11v=vDk~pw3`}6 zq%$cXZhOhpt|XP#o!ur=dX5Z`CNB8B`2kDX_~X_`aI#-qVYSrWIMl>tH4GFWuJUXJ ztfrp(MCp10xXqJz`rq@hM5E`D0k*jcg394F@nApU)h~#ch~-qf;yPhqY7lWhd&#~r zfE)K`dY>vVxxSk={ye0v+1)9A?(vg=WKV+KxJ({#iifSvDi75cdLoG) zmi@+H)_!+kZa?;fXaxvLBEH2Nr)>+0+VcyFY%@Yrq;~RP(g#2`(k+I@nzB)?iZKjq zk5Z#j_OnX|CmMLz)NUR$v?p{OS`fc)=bWHd#|EXbdHqbo@7&b?%~MTHMj~DdZ3;H3 znw$;_s2&*o4Ft&14cmU^-_&>QgcJJPX0-Tj{9Fogg^RJLpUKtxubh6?*qx$VIjq}E zcN+hu(4l%4?6R?*@BD3xNDo?Nfj;a1_0soC+J5jK;QIr2K$<{z;WZOhOb9dS^lH?z zYe~~yb?_>gep!9MFL)KTnE^KxpwZ)F%y#}T->thZNC?vym|B|^B^Wh)jcDB2W$~qe z-QgQ$zkBTyL#@!qUJCn4^y?l!tW^_Mc(+|Ow~7oua9$F$i%^A>0WXy1hwWJ~Jz44J z>g7ZZXX95Ju<&2>?yfzknoV-hq3Ba9t9cASdiwIZ%hYY zyZtjef{xR`HY0+~HBR|UwOu%drP_`&8Sb1Hw06ZbD!@x?zqqsdlkuJye<>+WsUbh2 zLYgxXm&xyl#pINynuFWdg}y};1hU&q^T^l96Wd5)O$AD7lV()c{#cT&W_hCIj5UqR zO7II;J@55+U}nWgb&D@1uUysVg0!pp2!Cw>xgmrDtl?k9K*muo9P?0KsnsT_#R^LsF3${BWtLWD3R1TG3xxB8G(`DXwk0%>0xTi>b}q)7Y52259DEka z&vy$ef(sNPskwYSY1wrI-Rf+r;7>rBR315@Y@)!MlWeTZ6g3LGIg>kn;=*aL2?dGv zT1{@80uGT&>fkMNTrHf(ty^7!z^EOEF?J5H7$Ae(j9HnSZH*vw&(*#Evt_E0L@I+O z_bLWyRa;+aJ|@C3By@W!0(r^t>xs+9Tto77elkowlR^s1BMIkUEF_IbZA2!3Dn8mo z0dnCbDfat!7-g8cL4uLv3^f|CgC~-%fgiKIrB|f4jsi2nI=jSjH;9Ff@S)$>Y*WDv zbkx_t>bozoS86tGci2Q1GYw`js#MqToT;OL2@VR4eYv?x-d^$rV*2=zm z(1?fzTp}-n)w1L*@33XtG z*=+zkhtd`K7GfZg)@N+{GCQo$nGuLLcUtnl453oaKnQYW0=I;NyL#I6_{ozs6<`7V z_d1RN+ekq$RW?~Kl4H-(Nq;2~YOwE(CWUMp?)m0|`rZWzo(!C87;{Ow+ECaEP)eEZ8>(UGXHZyonaymP{mRy8#a&~p5jY;NMm*< zt)srQbFNjLkjbCue__r1oe$ODQ9ojgsOsQ7nQFnjcn6#pCZliI86uu;rxpH`0GTLD zosZibY%wI{>favj|Gm1z3D|`EtqKJtAN^t@n2tmD8(|*gB-`dAXU>y@d`ASM;tb6_ z`kpy6I~#vmxt%4K#+Y%bvKuS&FBEJ(`>K{e^0f5PCC5E|siS+@A^gbW)5{+R=uAMmx!- zzjBF7m7Dy}icR>VxFc>qb*0CZ4yrQCAD7*=K?s@k} zm5*ombPBd|75Av3-e6YKIeP>f^+7N);m!o1E)QghQX%!?Af-o5sijgsMPWOkkJfLG2qAMMp)- zBjVDpPDFf-PQZ9WBP$XZ?lJp#EI{we9|KI&&b0Rro z0}*LrfsF6Bz{+3tFLs!?gn>agATYBGZY=t^J&Mb5{uHq&O%bYIc0|zw5@}U|k%pD{ zt-<4&wq@qIAX=*{o9!I>k^CE^fo$NjHMumepp_TIC-Q`EG^}{HNYpH5q z9=wfn`@t4~#xovnT8&L_yW0ax>66ucMua-fiX;no94~k9C+}oA;p9+Kjr+Kzf-eU% zC6+)#hv-LU@y4#VA$ z{QrOZF@X;SOfG~F7B6l%Ckp!eN(MLRrxS%&cmWKI`wRp)QYKoV?{dY4v|VwnfLO`o z5B_AK!w+wqyOm-1tImi09fCG1?2j28kt;)jTC0S{ES~EnjUO;e)iGY*k=XrQ#0M;$ zbXNw`<(X?$fs9rU!F(($t~R;K36AsuD*OjYK*yyC;b-(pTrlzthKyb9f41-c?N9dG zFVeYqFl7{&26>qzZUn$pFbWxv3=Za}FAknt@*`us1Lw_q5t1du9vU@_-n5XmldcLk7HGFbvYT#iKTn`nL48wxB320OUxJ-=y1WM z7z|)i4$_Q=5X5c*1c_jhIesJ0h4VIg*P)+sK$_oNdv1mweL(&6DiFk~*)z}ngD!~V zZ%HfeJdu8@23-Hnm#@(m?8D#Z?=+E*?Ua^e=I0Q%Q1ELsybZxl=>zZYa~oA1!FNr;VeED9=wHmko>%SS7wDYD3@i z3I2)ku`l<9r+-b&GC>-FS-J_pl_82#g?JAnVlI2TnL-Je{FvXF`}?)Rc)&7@9Oo^z z2-4xr^C_dy*tDKTE}viKaxc*h$=`fupZ8RrL_=xb}VPOU-`GZ;v>=!1T8? zigqBriYX_}@v3yjGQ~Z7Wa>N=h?H7d0WyV2BDl*H{oXVxt&GXWIQ@DDIa9Rc9O(!m zO#07Og1rFv0o_QP)+?Y0d9>(vI(Xy@<_2!6#0o=$3S?$YxL29ZGTnQl6n(<=1+aV+ z0(S|`btl0z^-WOJHv<(zBn5@#ZxhB_gCs(<3?z z7H9fH@z?Dc<-r%0##PY!_o5HqqMgU`bpFUnX1}3Ehx3UXTrLH+9ECX8+BY7vnOwg7 zoXKQ@^CA{v5>Aj;IFBfC`UB2;H_rt%=s#iSeyz_WyuMU}k~Zy_FzJ}k3I+NFL45&x z?a2__d-*)>4qDfwO~_Rzz@g~%(Zqd`#fSG}&RP-;eK_fTdj6HgtU}g*s9WBI3siCi zc7cSNF9KDjc9)=1_)elbf3sMvtL@S4p2+vYn42UvV)&7&f7?Ah{d5LqfrMN|l`b`}nz5K` zlLm(x!rR1I!4~&P1Cdm()i*P)^>666Y)Jl8$*8*4R-Ne?FeUV^cvSipSlC4ga(a*x z0C0FF|K4|{HlUwiaI8lqa4Q;3F-`kU`&B4|nUR145>Kj$@YmN;@E`%y@TpiX{R09v z?%NYLLTc`K6|WEghuG+yktRVk8nz?19H}7*>?hrqJ697QtiS)-yCQs<#A%FkiA%cN zC8eckj0?I$L6amCP)oG-SR^}_>$px!SCT>#h8NuK05l7PS%!g906Q>;92QLX#5lNZ zHH7KlS={`O>f#@XUT>9Fezdgp8l9_)7IR`%jFpVmvA`#!!O@mZH;d-CpUy6W<{9{w z-vDVBVMhbdKqV@|DT6@SB#&7efSwL>@A*d{cc}+$kV0=MNbgKyF{c^WFTHFj-1TEr z1sBqhDyfb9kjp@G)YZ+k9E8zz&l!Kz01`)cR4|ETf8ck%50}D&Bad@<|2Wle=9lW@ zXn)H%>4@^hDS4t4mdmfdKGZbI`i}KAmf3$N$$EYbbn<}g_ti|TPQ=HZ+kU6HFDMA? zO9gu&yqR6zXjg>t$zK4H7Y~od<5auW4g;6}@!y<{U4GQ0aH|LS3m>L!mRpl0mxJ^F z`R>QdIK8O*A?ce8ezUY|Ly~)TjZ4ty7G1FawAOV9!bN!ukP}G@O3J#lIURqd!yImd zLZd8Je>{=V_W#+3oKNhZA1dE(o^uQuQ@lFgWr~)-ARXTvHjcF-%UN^b(CV2D6U-gT zySMbqy~?wRhG1o2eHJt}> z`pn6zH*Wdw<@O|VL}rJaYH-)v-N$c;GZff;BEU`eTd!tSCep0G$tCP;;nll+saf=~ zNL>-Vw^+BC%5ZCPSU5l*Ra<(4w4c&43U~y$LS`MM0Ez6)o#h=5l)fnOHAoW84Jh*j zvk~?|#dcoe%twIOj<}t`m+z3nugzctwVWg?EK*#BqzHsFDSr@#8}{m5E9PR+w*<*q zr!2C-O*snw~jU0ll<8Q8_};b)J+`oEa^N9!>eJF?W-X(xwsXeJ2ytJ6fhRtVr= zE~xK;dPFmwojZpG`+{%1p^1rjD~+{X2dm04$khnG5OCmxciW;v%@X--Q&x!eKl*pQ zk{Q8!4=#PFzr2PgjZeFMD?PY=ew;xXGfS779#+yU4mk@{QP%fNt1^2OBZ0y5C31Oc zv=F)E!d)P3rh~xd7Zl&~Ty*x8v;cJTH8E=81S6EI8LP_*`e-NM!$TzD=&%yu^BX?P z;Z`Qsjd1pKvV$6UnV|=2-Q>74(VAKF-sqI5Q}6I^fFtZktmjy#K@AY>{ENKuB>#go z;Sk`H>@k2Qr&AMm)(wFDOI>;3%}~v}ixRRoQ<`wMXo~Q`VO}HKnwu1e=o-W)2%Hnx zwr)!iz;gu?TV@GR1@4D3dU#!=0wp_uE(7aP*)g}Vi|uwjwqVXnRsj0gSH4vHnuUud zlCYv&_EJWs=cccLTLy0jxMvHSsw&)w(`ozb#eoJ&&@MFaT2I?O-l$`hn6Xi7x{O4z zL8L$J1Ta*44|Qakn#8?*ozsp4$M;6nLn8)NUNoy0?6wPt%}0ActLzcJb5T)O@i?Vd zpD^!LDWypeRofr5#7obkY`&uX~Ux(YyZUe@%7B5mca7)7wfwXp&gVXte4ak_6 zRZBj*-}Oa-Q4WIrZl2u;GOHOmQGngJP`*@!phWj7$A$o|uxI4HjKs?wcn{&|ckUy2 zpDc=;R78r4XZ{J|?idHkESdsTpjLd|}sg0{!Lz-CRx%#&FlH)-D&l?t&6JX>=_~i(0v7?mafnjeRxT5 zq;O4!OJDCw4jq)ZpZl}|uhsUK^yMFV6}u^X+FyyEf8dn*)KLe|L_y2{mVQShnW^@L zI!8Xrs|^QB_2JB10o35+HotVh#^TkbJOirldzjRM^998hKOi4l{C58HVdZJ`Lky#+M-g{Y4T}%8<;n(}LeJN4LJ$k58CCdqV*UAB-GvsWd*W50Uq*5S!9e9<~2Rh&gZDJ zmhQdrf~;t90eNq9_>k)I-}X0h zJ&^H!d4DlWATA~PF;7@&55op`F&QRyEo_s|@klyDKJxtv)KBoS)?XmkK#1o@cfrQH zc%XQQqo)?-$0@ZfLS30>Wxskc5Tpy@e&9VVqeT#dn!gODA|dP-1HWzm`3Dvb=5YZY zEsp@d9Fvvku%0*&1sVyp+idRJ%-5x0z1kJ-vGcrr!CRQk6g7^XN_IDcb=~9cQIef*#~0r++#Cftv!p} zXjd!d%uN*tp_m5zwjg&KmC?QuL3=4!e~Jwu=6--2W!2(sCfa%z_O136;C-u$?3Tum zTc%qi@ShF{S~2sW6;A<#hVWKf5!t@UmYZby^{z@Q(*xsAT+%_Q`1fa}a++o=(?Hy4 zYCK$7r<rrf1JSSo55y=%c3W|Uv4bMv zSfEQH#g;aU1Ef6dw9UR&s414-lK;hwnKTH7q;l2sO>-|79bb`_+KK94<}^U{u3&!G{BTfS~9;_@an?bM;FK2{g~KR&A@ODNWtedflyMNLL($P z96s%}J1Elr+Cw!ZcGGS$#;_cIPJXy4ZIq{UQ*ea+%Ee2nHN82zQ5oQS9%g6Sgf;fR z0?a1`ypMyUR=nF@5%JJ_^I+by?MV2XZB0{3BUeb1^1{WQh z%{n!&Mr~wB_kkoi65$!wmqlnS8kDmch^?Z*E$Ksvl(^Ep3oNM3zOcbiIF#-AlJ#AW~rlEl=@CDuX)C^Z#bE{ zrGc%SwoD}zb`B_n9`|RQ(FA4{`URp9Ooc`P^xYH)=y4|{X~m4jO@_G3v!52mx%`Y) z>_QJ3T!KMsEUzivCELM0^}Kkq^P-^lp6YnU^YiBT z)6bVnM3Md88|m!BRLgc;uZ`pk(U^rLx_ju|X$XZs~e*yGqqzsc(w`8xs z*xS?sh+385JC}PYp1oO-(=x`4Apm${8tmRpDh4X~mffG^__8@O-~UrUL}TVaazT7T z@s@L>$%&rFjKw;AcQ4>XMTg+E76AX^6gURdN)fF98`G$odo?LV^F&j(Cyd>p_~xix zdR8A3Q*T!Mwqf&{1Lg)vRA#cuTB>pe5==TKG4#!GuYOGM$$g=2Eu!k z6lN}Rwi5@aC<3iauhBbw&hI$y&!UvaJ{$V2bc%Y2>Ui9tRpTl_oH6!&TN$y*&)4#Os(=}ZLe>^${swiQ7^AvoSGFqkA!@Na7w-0*4kF+$ZKm4 z0yp56&a%jUbSyS=HMA9iZUFuZTYj$F|1a$DHKNg#BjXmNj-@T!v z{Gz`m??Hcz+1gS;jzW|1DX`zeA88u6zqnK6{WMK}s&R|UTWlaTMABz)qmwgtXB5+*8d6_TEepIRQebfyuzIfeITDb(SlUHAeKc_vesYfTxw&%J8x!=1Mf511l`_FG2o6^rLEoD} zxL)Np(Ciy|#t7&PCF7*=z-uxuKKw2iV%0DYKKbjpzb%%jiK#l{YHCe9EIHr!^9-SD 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 z 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


NI@tAbQS(dnl%1oCb<{Qt4Fg049y_ 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

@OWsjCt5k_Y9}``PahvFk>Smrw@rPJj1& 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%0DKZcn#9mOPxF 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 SO&!qbfs01*^%Q%AXZ#QQfR%^< literal 0 HcmV?d00001 diff --git a/apps/docs/public/img/sso-azure-step-03.png b/apps/docs/public/img/sso-azure-step-03.png new file mode 100644 index 0000000000000000000000000000000000000000..0c928c771296191983d289fdc30fa7713a039b0f GIT binary patch literal 369098 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%0D3=&0TMb!hN7f4KDS&Bw{g%|U<}(Mle4M<2K4 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ྚr=CM=VHEK4qoqBWK+Ni^&G#|&e$LcF zpQB8%QB(-661I@Tvu2u@P{$YazxPXZs{Dc; z-knQyBDbJIZ^)thEu|$uVJc+5e$~_ltu*%8NYP{<)BcM`{>#5BUp;$$7B(#vqTN9B+l|#;M&BlZ=oV-=- z3j-;O2w9GqqwF~XUqa{oYFW)vQ?j*J7pvegx+{n*vrDt~g!>#Z$WtIieU@s&Y^FwxhC*wqOFC3)PDjiJDQ$|;6&gkJ0IK7MhL2RiMEb(* zTb?BF-RglQ;HdW*weRZW8C)H=nX_*NmPO-E{>+f3;^uvjAtt{>awY^LZhMc*%$Q;7K}`R z@BENpasIIdCX!jP4GgDg>5H2U+VY|bnqRK$*71Ame%Sk2AON0d z=^=WBa)cAh}Ol{2FUfL*%7}*#F1gdqzc>MO}j!Kt&N15XmTw zNR}i50wNM53P_Gh&N&qnASfoXG!M{9fS185Y)qwG?#$<@*@6mKtnEf zNVbCEhyr!?wXqB!JCQ_DWbM503+1gUQwNDO!|o>L8|%R%x^5xkr8|u3oz>6c_SHt3 zG=;3&;)j#gEl42wgn^XwfDLh$$9cA0sL(+1-Bo{*Qf`YIgm-Sz`lsxJ-znA8X$lHZa1%iHlDx>5@Ib=vDG$im8KEGugjSYTS^I>zWs8#BEth zVARibf98Sk?grP*+!(w9i=u%jT2r$+=c-n1z|S}@AF4&^J>AmC@fs1IRGlg`ha<2E=;9ZZmC1NSnQDwP-|A#Z zCmobFe(O?va?vxSVlcU{v{9E$y|j6+T1C3SEmqZ=X;^IVV~i|o$1VM@4zBK6F32($ zuEwy6A;Jw%iIv&Rb)AM>x`2iu`XWmuscwhVLrL7w|x zut_eq!}+Kpq%V+D_Jw#2R=aL5aRUbM1=*j1t?G0>zfvJFE%~7;4<6 zB$=Ddo*jiJ{pP)o;Gr#mv`BYc7*ry< zULVT%Hf2$xJ?*?>Lv0iuF&cYS7|4ETqTPpy}_@sw^vQ0xNV=jW8^uOlMB#O-UVZ}Pv&BObePju zolwh58{6Q^)G90VBcnJ!7B$06ziSAFG}WA11S&mmnFhaQNF3t08lu#iH12r=EUaP; z*h|K^E_F&bNdkhce)*3UF36v3hPO`9SiDtX)$~OJJ{;CMG__Gb(frX8^c0e2==)#j|3FD_p5`1Pi&Q^g{_k9;AE56~ zI0XmLasuXY0Li(nVHUU~YeYpQ?fIKxl3cLLn&pu#5T(K`xvaz}SaJIlf$cId2(YcA zO5$>WWj2N}`OaCFBaK{5>MxYNms^ZnQL@?001!%u+*5V`??yH*rbDwTJK*}z|LU># zih*wIX=LNcQ|MD|2YWLZ$qUUqqHoVDRLD`0-Li0T;8uP24rus;)n${Zir(FH?fk