Nuxt 3 이온 커패시터 스타터 앱, Supabase 설정 및 인증 구축 방법

30550 단어 nuxtvuesupabaseionic

기술 스택



Nuxt - 하이브리드 Vue 프레임워크 - https://v3.nuxtjs.org/

Capacitor - Capacitor를 기존 웹 프로젝트, 프레임워크 또는 라이브러리에 놓습니다. 기존 React, Svelte, Vue(또는 선호하는 웹 프레임워크) 프로젝트를 네이티브 모바일로 변환합니다. - https://capacitorjs.com/

Ionic Framework - 고품질의 크로스 플랫폼 네이티브 및 웹 앱 경험을 구축하기 위한 오픈 소스 모바일 툴킷입니다. JavaScript 및 웹을 사용하여 어디에서나 실행되는 단일 코드 기반으로 더 빠르게 이동하십시오. - https://ionicframework.com/

Supabase - Supabase는 오픈 소스 Firebase 대안입니다. Postgres 데이터베이스, 인증, 인스턴트 API, 실시간 구독 및 스토리지로 프로젝트를 시작하세요. - https://supabase.com/

이것은 Nuxt 3 및 Ionic Capacitor로 모바일 애플리케이션 구축을 시작하는 방법을 안내하는 일련의 비디오입니다. 이 영상에서는 수파베이스 계정 생성 및 인증을 프로젝트에 추가하고 모바일 기기에 배포합니다.



수파베이스 설정



  • https://app.supabase.io에서 프로젝트 생성
  • 프로젝트 이름 설정
  • 데이터베이스 비밀번호 설정



  • 프로젝트 키 및 데이터베이스 URL 가져오기, nuxt 프로젝트 구성에 필요합니다.
  • SUPABASE_URL , SUPABASE_ANON_KEY


  • Nuxt 3 프로젝트 설정 및 구성


  • Supabase Javascript 클라이언트 설치

  • npm install @supabase/supabase-js
    

  • 환경 변수를 설정합니다. nuxt 3에는 dotEnv가 내장되어 있으므로 내 구성에서 값을 설정하고 nuxt 3 구성에서 사용할 .env 파일에서 값을 읽을 수 있습니다.

  • // nuxt.config.ts
    import { defineNuxtConfig } from "nuxt";
    
    // https://v3.nuxtjs.org/api/configuration/nuxt.config
    export default defineNuxtConfig({
      ssr: false,
      dir: {
        public: "public",
      },
      runtimeConfig: {
        public: {
          SUPABASE_URL: process.env.SUPABASE_URL,
          SUPABASE_ANON_KEY: process.env.SUPABASE_ANON_KEY,
        },
      },
    });
    

    샘플 .env 형식

    SUPABASE_URL= "https://p_ffE-7s6JoHGUMAo.supabase.co"
    SUPABASE_ANON_KEY="eyJhbGc.hodygUWbLitlddXjIG9i6XjYO_p_ffE-7s6JoHGUMAo"
    

    Supabase 클라이언트 관리를 위한 플러그인 및 컴포저블 생성


  • Project에서 Supabase 클라이언트를 생성합니다. 시작 시 실행할 수 있도록 이를 plugin으로 처리합니다. provide 기능을 사용하여 앱 어디에서나 액세스할 수 있는 composable에서 supabase 클라이언트를 사용할 수 있도록 합니다.

  • // plugins/sb-client.ts
    export default defineNuxtPlugin((nuxtApp) => {
    
        const config = useRuntimeConfig();
    
        const supabase = createClient(config.public.SUPABASE_URL, config.public.SUPABASE_ANON_KEY);
    
        // allow us to inject, see composables
        // nuxtApp.vueApp.provide('supabase', supabase);
        nuxtApp.provide('supabase', supabase);
    });
    

    컴포저블

    // composables/useSupabase.ts
    import type { SupabaseClient } from "@supabase/supabase-js";
    
    export const useSupabase = (): SupabaseClient => {
        const app = useNuxtApp();
    
        const supabase = app.$supabase;
        if (!app.$supabase) {
            console.log('supabase', supabase);
            throw new Error("Supabase Not Initialized Properly");
        }
        return supabase as SupabaseClient;
    };
    

    응용 프로그램에서 Supabase 클라이언트 사용


    사용된 API


  • 수파베이스 로그인

  • https://supabase.com/docs/reference/javascript/auth-signin


  • // use composable
    const supabase = useSupabase();
    
    // make api call
    const { user, session, error } = await supabase.auth.signIn({
      email: '[email protected]',
      password: 'example-password',
    })
    

  • 수파베이스 계정만들기

  • https://supabase.com/docs/reference/javascript/auth-signup


  • // use composable
    const supabase = useSupabase();
    
    // make api call
    const { user, session, error } = await supabase.auth.signUp({
      email: '[email protected]',
      password: 'example-password',
    })
    

  • 로그아웃

  • https://supabase.com/docs/reference/javascript/auth-signout


  • const { error } = await supabase.auth.signOut()
    

    Nuxt 코드에서 특정 경로 보호


    미들웨어



    상태 정보에 액세스하는 방법은 아래의 middleware 섹션에서 확인할 수 있습니다. 페이지는 렌더링 전에 실행할 미들웨어를 지정할 수 있습니다. 렌더링하기 전에 미들웨어를 사용하여 사용자를 확인하려면 보호된 페이지가 필요합니다. 미들웨어는 사용자를 사용 가능한 supabase 사용자가 없다는 로그인 페이지로 안내합니다.

    // middleware/auth.ts
    export default defineNuxtRouteMiddleware((to, from) => {
        const client = useSupabase();
        if (!client.auth.user()) {
          return "/login";
        }
      })
    

    페이지에 추가되면 페이지가 렌더링되기 전에 미들웨어가 호출됩니다. 사용자가 인증되지 않은 경우 로그인 페이지로 다시 리디렉션됩니다.

    definePageMeta({
      middleware: ["auth"]
    })
    

    색인 페이지 - index.vue



    <template>
      <IonPage>
        <IonHeader :translucent="true">
          <IonToolbar>
            <IonTitle>Home</IonTitle>
          </IonToolbar>
        </IonHeader>
        <IonContent class="ion-padding">
          <h1>WELCOME HOME on IOS AND ANDROID</h1>
          <IonButton @click="router.push('/about')">
            Goto About Page
          </IonButton>
          <IonButton @click.prevent="doSignOut">
            SIGN OUT
          </IonButton>
          <p>
            {{user}}
          </p>
        </IonContent>
      </IonPage>
    </template>
    <script setup lang="ts">
    import {
      IonPage,
      IonHeader,
      IonTitle,
      IonToolbar,
      IonContent,
      IonButton
    } from "@ionic/vue"
    
    definePageMeta({
      middleware: ["auth"]
    })
    
    const router = useRouter();
    const client = useSupabase()
    
    const user = client.auth.user();
    
    // function 
    const doSignOut = async () => {
      await client.auth.signOut();
      router.replace("/login");
    }
    
    
    </script>
    

    로그인 페이지 - login.vue



    <template>
        <IonPage>
            <IonHeader :translucent="true">
                <IonToolbar>
                    <IonTitle>LOGIN PAGE</IonTitle>
                </IonToolbar>
            </IonHeader>
            <IonContent class="ion-padding">
                <IonItem>
                    <IonLabel position="floating">
                        EMAIL
                    </IonLabel>
                    <IonInput type="email" placeholder="Email" v-model="credentials.email"></IonInput>
                </IonItem>
                <IonItem>
                    <IonLabel position="floating">
                        PASSWORD
                    </IonLabel>
                    <IonInput type="password" placeholder="*****" v-model="credentials.password"></IonInput>
                </IonItem>
                <IonButton @click.prevent="doSignIn">
                    SIGN IN
                </IonButton>
                <IonButton @click.prevent="$router.push('/create-account')">
                    CREATE ACCOUNT
                </IonButton>
            </IonContent>
        </IonPage>
    </template>
    <script setup lang="ts">
    import {
        IonPage,
        IonHeader,
        IonTitle,
        IonToolbar,
        IonContent,
        IonButton,
        IonItem,
        IonInput,
        IonLabel,
        alertController
    } from "@ionic/vue"
    
    
    const router = useRouter();
    const sbClient = useSupabase();
    
    // local state
    const credentials = ref<{ email: string, password: string }>({ email: "", password: "" })
    
    // functions
    const doSignIn = async () => {
        const { email, password } = credentials.value
        // make api call
        const { user, session, error } = await sbClient.auth.signIn({
            email,
            password,
        })
        if (error) {
            //https://ionicframework.com/docs/api/alert
            const alert = await alertController
                .create({
                    header: 'Error Alert',
                    subHeader: 'Error Signing In To Supabase',
                    message: error.message,
                    buttons: ['OK'],
                });
            await alert.present();
        } else {
            const alert = await alertController
                .create({
                    header: 'Success',
                    subHeader: 'User Logged In To Supabase',
                    buttons: ['OK'],
                });
            await alert.present();
            console.log(user);
    
            router.replace("/");
        }
    }
    </script>
    

    소스 코드



    github 저장소의 "Part-3"브랜치에 있는 이 코드


    아론크사운더스 / 이온 커패시터-nuxt-비디오-앱


    이온 커패시터 VueJS Nuxt3 스타터 템플릿





    이온 커패시터 VueJS Nuxt3 Supabase 스타터 템플릿


  • 블로그 게시물:
  • 비디오: https://youtu.be/tDYPZvjVTcc

  • 각 비디오의 코드


    시리즈의 각 비디오에 대해 별도의 분기가 있습니다.
  • 파트 1: https://github.com/aaronksaunders/ionic-capacitor-nuxt-video-app
  • 파트 2: https://github.com/aaronksaunders/ionic-capacitor-nuxt-video-app/tree/part-2
  • 파트 3: https://github.com/aaronksaunders/ionic-capacitor-nuxt-video-app/tree/part-3

  • 자세한 내용은 nuxt 3 documentation을 참조하십시오.

    설정


    종속 항목을 설치해야 합니다.
    # yarn
    yarn install
    
    # npm
    npm install
    
    # pnpm
    pnpm install --shamefully-hoist

    개발 서버


    http://localhost:3000에서 개발 서버 시작
    npm run dev

    생산


    프로덕션용 애플리케이션 빌드:
    npm run build

    프로덕션 빌드를 로컬에서 미리 보기:
    npm run preview

    자세한 내용은 deployment documentation을 확인하십시오.


    View on GitHub

    좋은 웹페이지 즐겨찾기