빠른 요약 ↬ 이 튜토리얼에서는 Vue.js 및 Firebase를 사용하여 기능적 설문조사 앱을 빌드하기 위한 단계별 가이드를 안내합니다. Vuelidate를 통한 사용자 데이터 검증부터 인증, 사용자 데이터 저장, 경로 보호, Firebase 서버로 데이터 전송까지. 튜토리얼에 사용된 모든 단계는 실용적이며 사용자 정의 백엔드가 있는 경우에도 실제 프로젝트에서 재현할 수 있습니다.
이 튜토리얼에서는 사용자 양식 데이터를 검증하고, Vue에서 인증을 구현하고, Vue 및 Firebase(BaaS 플랫폼)를 사용하여 설문조사 데이터를 수신할 수 있는 방법을 배울 설문조사 앱을 빌드합니다.
이 앱을 빌드하면서 사용자가 가입 중에 양식을 제출하기 전에도 백엔드에 연락하여 이메일이 이미 수신되었는지 확인하는 것을 포함하여 다양한 종류의 데이터에 대한 양식 유효성 검사를 처리하는 방법을 배웁니다.
또한 앱은 restful API를 사용하여 사용자의 로그인을 처리합니다. Vue 라우터의 Authguard를 사용하여 로그인하지 않은 사용자가 설문 조사 양식에 액세스하는 것을 방지하고 로그인한 사용자의 설문 데이터를 안전한 데이터베이스로 성공적으로 보냅니다.
같은 페이지에 있으므로 Firebase가 무엇이며 이 튜토리얼에서 무엇을 할 것인지 명확히 합시다. Firebase는 "앱 구축, 개선 및 성장"을 위한 도구 모음으로, 개발자가 일반적으로 스스로 구축해야 하지만 실제로 구축하고 싶지 않은 서비스의 상당 부분에 대한 액세스를 제공합니다. 앱 경험 자체에 집중하세요. 여기에는 분석, 인증, 데이터베이스, 파일 스토리지 등이 포함되며 목록은 계속됩니다.
이는 일반적으로 프론트엔드 및 백엔드 소프트웨어를 모두 작성하는 기존 앱 개발과 다릅니다. 프론트엔드 코드는 백엔드에 의해 노출된 API 끝점을 호출하고 백엔드 코드는 실제로 작업을 수행합니다. 그러나 Firebase 제품을 사용하면 기존 백엔드를 우회하여 작업을 클라이언트에 맡깁니다. 이것은 기술적으로 나 같은 프론트엔드 엔지니어가 프론트엔드 코드만 작성하는 풀 스택 애플리케이션을 구축할 수 있도록 합니다.
점프 후 더!아래에서 계속 읽기 ↓
결론은 Firebase가 인증 및 데이터베이스 요구 사항을 모두 처리하는 데 필요한 API 엔드포인트를 제공하여 이 프로젝트에서 백엔드 역할을 한다는 것입니다. 결국 Vue+ Firebase를 사용하여 기능 설문조사 앱을 구축하게 됩니다. 그런 다음 사용자 지정 백엔드를 포함하여 동일한 프로세스를 사용하여 원하는 웹 앱을 빌드할 수 있습니다.
따라 하려면 컴퓨터에 Node 및 npm/yarn이 설치되어 있어야 합니다. 아직 수행하지 않았다면 이 빠른 가이드에 따라 컴퓨터에 yarn 또는 npm을 설치하십시오. 또한 이 튜토리얼에서는 Vue, Vuex 및 Vue 라우터 구문에 대한 기본적인 이해가 필요합니다.
이 튜토리얼의 시작 파일이 바로 여기에 있으며 여기에는 이 프로젝트의 기본 파일이 포함되어 있으며 완성된 데모의 리포지토리가 있습니다. 저장소를 복제하거나 다운로드하고 터미널에서 npm install 을 실행할 수 있습니다.
스타터 파일을 설치하면 가입 및 로그인 옵션이 있는 시작 페이지가 표시됩니다. 로그인하면 설문조사에 액세스할 수 있습니다.
이것은 설문 조사 앱이 어떻게 작동하는지 설명합니다. (큰 미리보기)
이 프로젝트를 완전히 독자적으로 구축하려는 경우 자유롭게 새 프로젝트를 생성하십시오. Vue 프로젝트에 Vuex, Vue 라우터, Vuelidate 및 axios를 설치해야 합니다. 그럼 바로 들어가 보겠습니다.
먼저 이 프로젝트를 설정하려면 Firebase 계정이 필요합니다. 이는 앱용 컨테이너를 생성하고 데이터베이스, 다양한 인증 수단, 호스팅 등에 대한 액세스 권한을 제공하는 것과 매우 유사합니다. 일단 설정하면 간단합니다. Firebase 사이트에 있습니다.
가입하고 Firebase 여정을 시작할 수 있는 방문 페이지입니다. (큰 미리보기) Firebase 프로젝트 만들기(큰 미리보기)
이제 프로젝트가 생겼으므로 Firebase에서 인증 시스템과 데이터베이스(실시간 데이터베이스)를 모두 설정해야 합니다.
"인증"옵션을 클릭하십시오.
우리가 원하는 "로그인 방법"(이 경우 이메일/비밀번호)을 설정합니다.
프로젝트에 대한 이메일/비밀번호 인증 방법을 설정합니다. (큰 미리보기)
"데이터베이스"를 클릭하십시오.
"실시간 데이터베이스"를 선택하고 맨 위에 있는 이 링크를 복사하십시오.
Firebase 데이터베이스에 데이터를 보낼 때 API 엔드포인트로 매우 유용합니다.
이 API를 데이터베이스 API라고 합니다. 그것을 사용하려면 보낼 때 선택한 데이터베이스의 이름을 추가해야 합니다. 예를 들어, user라는 데이터베이스에 전송합니다. 끝에 user.json 을 추가하기만 하면 됩니다.
{databaseAPI}/user.json
데이터베이스 자체 위의 API를 사용하여 데이터베이스에 데이터를 보냅니다. (큰 미리보기)
그런 다음 Firebase auth rest API 문서로 이동하여 가입 및 로그인 API 엔드포인트를 얻습니다. 이러한 끝점 내에는 프로젝트 설정에서 찾을 수 있는 프로젝트의 API 키가 필요합니다.
확인
코드로 돌아가서 사용자가 적절한 정보를 보내고 있는지 확인하기 위해 서버로 보내기 전에 가입 데이터의 유효성 검사가 있습니다. Vue에서 유효성 검사를 더 쉽게 해주는 멋진 라이브러리인 Vuelidate를 사용할 것입니다. 먼저 Vuelidate를 프로젝트에 설치합니다.
npm i vuelidate
src/components/auth/signup.vue 로 이동하고 스크립트 태그 내에서 vuelidate 및 아래 표시된 대로 라이브러리에서 필요한 모든 필요한 이벤트를 가져옵니다.
참고 : 라이브러리 및 사용 가능한 모든 이벤트에 대한 전체 개요는 문서를 확인할 수 있습니다.
또한 서버에 HTTP 요청을 보낼 수 있도록 [`axios`](https://github.com/axios/axios) 가져오기:
import axios from 'axios'
계속하기 전에 아래와 같이 이메일 유효성을 검사할 수 있도록 데이터베이스에 몇 가지 규칙을 추가해야 합니다. 데이터베이스 규칙은 특정 시점에 데이터베이스에 액세스할 수 있는지 여부를 결정하는 데 도움이 됩니다. (큰 미리보기)
"read" = "true"
클라이언트 측에서 아무런 방해 없이 데이터베이스를 읽을 수 있음을 의미합니다.
"write" = "auth" !== null
인증된 사용자가 아니면 데이터베이스에 쓸 수 없습니다.
"Users" = { "onIndex" : ["email"] }
이를 통해 '이메일' 인덱스로 '사용자' 문서를 쿼리할 수 있습니다. 즉, 고유한 이메일에 대해 말 그대로 데이터베이스를 필터링할 수 있습니다. 그런 다음 메서드, 계산 등이 있는 것처럼 '검증'이라는 이름의 사용자 지정 계산 속성을 추가합니다. '검증' 아래에는 필수 데이터이고 분명히 이메일이어야 하는 '이메일'부터 시작하여 필요한 데이터의 유효성을 검사하는 메서드가 있습니다. . 또한 사용자가 사용자 지정 유효성 검사기 내에서 모두 비동기 유효성 검사기라고 하는 것을 사용하여 입력한 후 데이터베이스를 확인하여 다른 사람이 이미 이메일을 가져갔을 때 사용자에게 알릴 수 있기를 원하며 이 모든 것이 [vuelidate. ](https://vuelidate.js.org/#sub-asynchronous-validation)
사용자에게 이메일을 가져갔다고 알리려면 'v-if'를 사용하여 'unique'가 true인지 false인지 확인합니다. true이면 반환된 Object의 길이가 0이고 이메일을 계속 사용할 수 있으며 그 반대의 경우도 마찬가지입니다. 같은 방법으로 'v-if'를 사용하여 사용자 입력이 실제 이메일인지 확인할 수 있습니다. 그리고 개별 입력의 모든 주변 div에 대해 해당 입력에 오류가 발생하면 활성화되는 잘못된 클래스를 추가합니다. 유효성 검사 이벤트를 HTML의 각 입력에 바인딩하기 위해 `email ` 아래.
<div class="input" :class="{invalid: $v.email.$error}"> <h6 v-if="!$v.email.email">Please provide a valid email address.</h6> <h6 v-if="!$v.email.unique">This email address has been taken.</h6> <input type="email" placeholder="Email" @blur="$v.email.$touch()" v-model="email"> </div>
`Age`, `password` 및 `confirmPassword`는 `email`과 유사한 방식으로 HTML 입력에 바인딩됩니다. 그리고 입력에 오류가 있는 경우 '제출' 버튼을 비활성화합니다.
다음은 이 vuelidate 섹션에 대한 전체 [CodePen 예제](https://codepen.io/atanda1/pen/Yzyqrjv)입니다. Vuelidate는 여기에서 데이터베이스로 전송된 데이터의 종류를 결정하는 데 사용됩니다. (큰 미리보기) ## 인증 이 앱은 SPA이며 기존 사이트처럼 다시 로드되지 않으므로 앱의 모든 구성 요소가 일반 인증 상태를 인식할 수 있도록 하는 단일 "진실의 출처"로 Vuex를 사용할 것입니다. 스토어 파일로 이동하여 작업 내에서 로그인/가입 방법을 모두 생성합니다. 사용자 데이터를 보낼 때 받은 응답(`token` 및 `userId`)은 우리 상태에 저장됩니다. 이는 토큰이 앱 내 어느 지점에서나 여전히 로그인되어 있는지 여부를 확인하는 데 사용되기 때문에 중요합니다. 초기값이 null인 상태에서 `token`, `userId`, user가 생성됩니다. 우리는 훨씬 나중에 사용자에게 다가갈 것이지만 지금은 처음 두 가지에 집중할 것입니다.
그러나 여기에 까다로운 부분이 있습니다. 특히 등록 작업으로 수행할 작업은 인증 데이터베이스에 등록할 이메일과 비밀번호만 보내는 것입니다. 실제로 우리는 이 인증 데이터베이스의 데이터를 사용할 권한이 없으며 이메일/비밀번호 외에 가입 데이터를 보내지 않았습니다. 따라서 우리가 할 일은 완전한 등록 데이터를 다른 데이터베이스로 보내는 또 다른 작업을 만드는 것입니다. 이 별도의 데이터베이스 문서에서 우리는 거기에 저장하기로 선택한 모든 정보에 완전히 액세스할 수 있습니다. 이 새 작업을 'storeUser'라고 부를 것입니다. 그런 다음 가입 작업으로 이동하여 가입 데이터가 포함된 전체 개체를 'storeUser'를 통해 액세스할 수 있는 데이터베이스에 전달합니다. **참고:** 보안상의 이유로 'storeUser'가 포함된 사용자 비밀번호를 데이터베이스에 전송하지 않을 수 있습니다.
`storeUser`는 데이터베이스에 게시하는 동안 새로 얻은 토큰과 데이터베이스 API를 사용하여 쿼리를 추가합니다. 이는 우리가 증명(토큰)으로 인증되지 않는 한 데이터베이스에 쓸 수 없기 때문입니다. 그것이 우리가 처음에 Firebase에 부여한 규칙입니다. 기억하시나요?
“write” = “auth” !== null
가입/로그인 작업에 대한 전체 코드는 [여기](https://codepen.io/atanda1/pen/mdePKqj)에 있습니다. 그런 다음 'onSubmit' 메서드 내의 구성 요소에서 등록 및 로그인을 모두 저장소의 해당 작업으로 전달합니다.
이 모든 작업은 상태에 토큰이 있는지 확인하는 것입니다. 토큰이 있는 경우 대시보드에 대한 액세스 권한을 부여하고 그 반대의 경우도 마찬가지입니다. ## LogOut 로그아웃 옵션을 생성하기 위해 우리는 `token`과 `userId`를 모두 `null`로 설정하는 `mutations`에서 이전에 생성한 `clearAuth`를 사용할 것입니다. 이제 `clearAuth`를 커밋하고 로컬 스토리지를 삭제하고 `router.replace('/')`를 추가하여 사용자를 완전히 리디렉션하는 새로운 `logout` `action`을 생성합니다.
그런 다음 [여기](https://codepen.io/atanda1/pen/jObqKNd)에서 볼 수 있듯이 `onLogout` 메서드를 실행하는 버튼에 `@click`을 추가합니다.
<ul @click="onLogout">Log Out</ul>
## UI_State 이제 대시보드에 대한 조건부 액세스 권한을 부여했으므로 다음 단계는 인증된 사용자만 볼 수 있도록 탐색 모음에서 대시보드를 제거하는 것입니다. 그렇게 하기 위해, 우리는 우리 상태 내의 토큰이 null인지 확인하는 `ifAuthenticated`라는 `getters` 아래에 새로운 메소드를 추가할 것입니다. 토큰이 있으면 사용자가 인증되었음을 나타내며 탐색 모음에서 설문 조사 대시보드 옵션을 볼 수 있습니다.
그런 다음 헤더 구성 요소로 돌아가서 계산 아래에 'auth' 메서드를 생성합니다. 이 메서드는 상점에서 방금 생성한 'getters' 내의 'isAuthenticated'에 전달합니다. 이것이 하는 일은 토큰이 없으면 `isAuthenticated`가 false를 반환한다는 것입니다. 즉, `auth`도 null이고 그 반대도 마찬가지입니다.
그런 다음 App.vue로 이동하여 created 메서드를 작성합니다. 이 메서드는 앱이 로드될 때마다 스토어에서 autoLogin 을 전달합니다.
created () { this.$store.dispatch('AutoLogin') }
Fetch_User_Data
사용자 이름을 표시하여 대시보드에서 사용자를 환영하고 싶습니다. 따라서 fetchUser 라는 또 다른 작업이 생성되어 평소와 같이 토큰이 있는지 먼저 확인합니다. 그런 다음, 로컬 저장소에서 이메일을 가져오고 이메일 유효성 검사에서 이전에 수행한 것처럼 데이터베이스를 쿼리합니다.
이것은 가입 중에 처음 제출된 사용자 데이터를 포함하는 개체를 반환합니다. 그런 다음 이 객체를 배열로 변환하고 처음에 생성된 storeUser 변형에 커밋합니다.