Vuetify + Firebase UI で簡単にログイン機能を追加とナビゲーションメニュー
1.ナビゲーションメニュー
Vue Routerを導入して画面遷移ができるようになったのだが、Vue CLI で作成したトップページのままだと、スマホ(サイズ)で表示した場合に、右上のメニューが隠れてしまうため、ハンバーガーメニューを、 以下を参考に導入。
<template> <v-app> <v-navigation-drawer fixed clipped app v-model="navBar"> <v-list dense class="pt-0"> <router-link to="/"> <v-list-tile> <v-list-tile-action> <v-icon>home</v-icon> </v-list-tile-action> <v-list-tile-content>HOME</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/entry"> <v-list-tile> <v-list-tile-action> <v-icon>edit</v-icon> </v-list-tile-action> <v-list-tile-content>ENTRY</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/login"> <v-list-tile> <v-list-tile-action> <v-icon>account_box</v-icon> </v-list-tile-action> <v-list-tile-content>LOG IN</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/about"> <v-list-tile> <v-list-tile-action> <v-icon>settings</v-icon> </v-list-tile-action> <v-list-tile-content>ABOUT</v-list-tile-content> </v-list-tile> </router-link> </v-list> </v-navigation-drawer> <v-toolbar clipped-left fixed app> <v-toolbar-side-icon @click.stop="navBar = !navBar"></v-toolbar-side-icon> <v-toolbar-title>FavoPhrase</v-toolbar-title> <v-spacer></v-spacer> <v-toolbar-items class="hidden-sm-and-down"> <v-btn flat to="/">Home</v-btn> <v-btn flat to="/entry">Entry</v-btn> <v-btn flat to="/login">Login</v-btn> <v-btn flat to="/about">About</v-btn> </v-toolbar-items> </v-toolbar> <v-content> <v-container fluid fill-height> <v-fade-transition mode="out-in"> <router-view></router-view> </v-fade-transition> </v-container> </v-content> </v-app> </template> <script> export default { name: 'App', data() { return { navBar: null } } } </script> <style> a { text-decoration: none; } </style>
ブラウザサイズ。
スマホサイズ。
ハンバーガーメニュー。
うん。わるくない。
2.Firebase を使って簡単にログイン機能を実現
以下のサイトを参考に実装。
https://firebase.google.com/docs/auth/web/firebaseui?hl=ja
https://qiita.com/okdyy75/items/24e78fdd0f12742b9e82
/main.js
上記サイトを参考に、routes の meta に、認証が必要かどうかをbool で設定し、router.beforeEach で、遷移前ログイン状態を確認し、ログインされていなければ、Loginページに遷移させる。
import Vue from 'vue' import VueRouter from 'vue-router' import '@/plugins/vuetify' import firebase from '@/plugins/firebase' import 'firebase/auth'; import App from '@/App.vue' import Home from '@/components/Home' import Entry from '@/components/Entry' import Login from '@/components/Login' import About from '@/components/About' Vue.config.productionTip = false Vue.use(VueRouter) const routes = [ { name:'Home', path: '/', component: Home, meta: { requiredAuth: false } }, { name:'Entry', path: '/entry', component: Entry, meta: { requiredAuth: true } }, { name:'Login', path: '/login', component: Login, meta: { requiredAuth: false } }, { name:'About', path: '/about', component: About, meta: { requiredAuth: false } } ] const router = new VueRouter({ routes }) router.beforeEach((to, from, next) =>{ if (to.matched.some(record => record.meta.requiredAuth)) { if (firebase.auth().currentUser) { console.log(firebase.auth().currentUser); next(); return; } firebase.auth().onAuthStateChanged(user => { if (user) { next(); } else { next({name: 'Login'}) } }) } next(); }) new Vue({ render: h => h(App), router:router }).$mount('#app')
/plugins/firebase.js
Firebaseを導入する。
https://firebase.google.com/docs/web/setup?hl=ja
import firebase from 'firebase/app' var config = { apiKey: "XXXXXXXXXXXXXxXXXXXXXXXXXXXXXXXX", authDomain: "xxxxxxxxxxxx.com", databaseURL: "https://xxxxxxxxxxxxxx.com", projectId: "favophrase", storageBucket: "xxxxxxxxxxxxxxxxxxx.com", messagingSenderId: "99999999999999999" } firebase.initializeApp(config) export default firebase
/components/Login.vue コンポーネント
FIrebase UI の最低限の実装。これだけで、ログイン機能が実現される。
<template> <v-container> <div> <v-btn @click="logout">LOGOUT</v-btn> </div> <div id="firebaseui-auth-container"></div> </v-container> </template> <script> import firebase from 'firebase/app'; import firebaseui from 'firebaseui-ja'; export default { mounted() { var ui = firebaseui.auth.AuthUI.getInstance() || new firebaseui.auth.AuthUI(firebase.auth()); ui.start('#firebaseui-auth-container',{ signInOptions: [ firebase.auth.EmailAuthProvider.PROVIDER_ID, firebase.auth.FacebookAuthProvider.PROVIDER_ID, firebase.auth.TwitterAuthProvider.PROVIDER_ID, firebase.auth.GoogleAuthProvider.PROVIDER_ID, ], }); }, methods: { logout: function() { firebase.auth().signOut().then( () => console.log("Sign out.") ); } } } </Script>
Firebase UI の画面。
うーん、これだけのコード記述だけで、認証機能が実現できるのはかなりうれしい。
本筋の機能実装に専念できるってことだなー。
Baas万歳。
上記で認証を利用するためには、各SNSの開発者ページに設定が必要。
Firebase https://console.firebase.google.com/u/1/
Facebook Developer https://developers.facebook.com/apps
Twitter Developer https://developer.twitter.com/en/apps