# Password-based Authentication

Password-based authentication block for Vue Single Page Applications

## Files

- `components/`
  - `forgot-password-form.vue`
  - `login-form.vue`
  - `sign-up-form.vue`
  - `update-password-form.vue`

External registry dependencies: button, card, input, label.

Full source: https://supabase.com/library/r/password-based-auth-vue.json

## Installation

### Set up the Supabase client

This block requires a Supabase client for Vue. If your project already has one, reuse it and update the block's imports to match your client. Otherwise, install the client:

Install this block:

```bash
npx shadcn-vue@latest add https://supabase.com/library/r/supabase-client-vue.json
```

Configure the environment variables described in the [Vue client guide](https://supabase.com/library/docs/vue/client.md#getting-started) before using the block.

### Install the block

Install this block:

```bash
npx shadcn-vue@latest add https://supabase.com/library/r/password-based-auth-vue.json
```

## Usage

Once you install the block in your Vue project, you'll get all the necessary components to set up a password-based authentication flow.

### Getting started

After installing the block, you'll have the following environment variables in your `.env.local` file:

```env
VITE_SUPABASE_URL=
VITE_SUPABASE_PUBLISHABLE_KEY=
```

- If you're using supabase.com, you can find these values in the [Connect modal](https://supabase.com/dashboard/project/_?showConnect=true\&tab=frameworks\&framework=vuejs\&using=supabasejs) under App Frameworks or in your project's [API keys](https://supabase.com/dashboard/project/_/settings/api-keys).

- If you're using a local instance of Supabase, you can find these values by running `supabase start` or `supabase status` (if you already have it running).

### Setting up routes and redirect URLs

1. Set the site URL in the [URL Configuration](https://supabase.com/dashboard/project/_/auth/url-configuration) settings in the Supabase Dashboard.

2. Set up the route users will visit to reset or update their password. Go to the [URL Configuration](https://supabase.com/dashboard/project/_/auth/url-configuration) settings and add the `forgot-password` route to the list of Redirect URLs. It should look something like: `http://example.com/auth/forgot-password`.

3. Update the redirect paths in `login.vue` and `update-password.vue` components to point to the logged-in routes in your app. Our examples use `/protected`, but you can set this to whatever fits your app.

4. Add the following code in the authenticated route to redirect to login if the user is unauthenticated.

```vue
<script setup lang="ts">
import { onMounted } from 'vue'

import { createClient } from '@/lib/supabase/client'

onMounted(async () => {
  const client = createClient()

  const { error } = await client.auth.getUser()

  if (error) {
    location.href = '/login'
  }
})
</script>

<template>
  <div>Authenticated page</div>
</template>
```

Additionally, you could utilize the Navigation Guards from `vue-router` explained [here](https://router.vuejs.org/guide/advanced/navigation-guards#Global-Before-Guards).

## Further reading

- [Password-based authentication (implicit flow)](https://supabase.com/docs/guides/auth/passwords?queryGroups=flow\&flow=implicit)
- [Authentication error codes](https://supabase.com/docs/guides/auth/debugging/error-codes)
- [Email templates](https://supabase.com/docs/guides/auth/auth-email-templates)
- [Email templates for local development](https://supabase.com/docs/guides/local-development/customizing-email-templates)
- [Custom SMTP](https://supabase.com/docs/guides/auth/auth-smtp)
