iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
SideProject30

30天製作與眾不同的TodoList吧!系列 第 27

使用supabase實現會員功能

  • 分享至 

  • xImage
  •  

首先我們需要安裝 supabase

npm install @supabase/supabase-js

接下來建立一個.env-local檔案,env 檔案通常用來保存重要的資料,像是 API 、 key ...等,不能公開在外部的資料

NEXT_PUBLIC_SUPABASE_URL=YOUR_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY=YOUR_SUPABASE_ANON_KEY

然後在這個檔案中加上這兩行,其中的 value 可以從 supabase 中的設定找到資料。

現在我們已經做好了基本的設定,接下來就是開始使用這個工具了。
首先為了避免在每個使用到 supabase 都要 import,所以我們可以建立一個 utils 資料夾,用於存放這個功能。

|
|- src
|-- data
|--- utils
|---- getSupabaseClient.js

//getSupabaseClient.js

import { createClient } from "@supabase/supabase-js";
const URL = process.env.NEXT_PUBLIC_SUPABASE_URL
const PASS = process.env.NEXT_PUBLIC_SUPABASE_PASS
const supabase = createClient(URL, PASS);

export default function getSupabaseClient() {
  return supabase;
}

這邊我們使用process.env的 Method 來取用.env.local 中所保存的資料。

import getSupabaseClient from "@/data/mock/utils/getSupabaseClient";

接下來在登入頁面中導入這個 function 後我們可以直接得到一個已經做好設定的 client ,並且我們使用一個常數來保存這個 client 。

const supabase = getSupabaseClient();

然後我們修正onSubmit函式,用來處理表單提交後的會員註冊。

    const onSubmit = async data => {
        const { user, error } = await supabase.auth.signUp({
            email: data.account,
            password: data.password,
        });
        console.log(user, error);
        alert('已送出,請收取驗證信件');
    };

這邊需要注意,因為有使用到 await , 所以 onSubmit 會是一個 async 函式。

到這邊我們的註冊功能已經完成了。

接下來就是一樣的方式去處理登入功能,但是比較不一樣的地方在於,登入頁面在成功確認 user 身分後,會需要進行頁面跳轉,所以需要做一些修正。

建立一個 onUserLogin 函式

  const onUserLogin = async (userData) => {
    const { data, error } = await supabase.auth.signInWithPassword({
      email: userData.account,
      password: userData.password,
    });

    if (!data.user) {
      alert("帳號或密碼錯誤");
      console.log(error);
      return;
    } else {
      alert("登入成功");
      document.cookie = `token=${data.session.access_token}; Max-Age=900; Secure; HttpOnly; Path=/; SameSite=Strict`;
      router.push(process.env.NEXT_PUBLIC_HOME_PAGE);
    }
  };

這邊可以看到,我們透過signInWithPassword的方式,使用密碼進行登入,並且使用的資料會是 user 在欄位中輸入並且經過 react-form-hook驗證後的資料。

若是沒收到 data.user 這筆資料就表示登入失敗,並且在登入成功後將 token 保存在 cookie 中,並且設定期限為900秒。


上一篇
表單驗證 - 3 & supabase
下一篇
獲取登入後的資料
系列文
30天製作與眾不同的TodoList吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言