目標:すぐに思い出せるようにざっくり解説する。
Firebaseのプロジェクト作成
0:Firebaseとは?
iOS/AndroidアプリやWebアプリケーションの開発に活用できるプラットフォームです。
利用できるサービスはデータベース、分析、認証、メッセージ送信機能など、様々です。主に認証機能を利用します。
1:プロジェクトの作成
https://firebase.google.com/?hl=ja
↑で公式サイトにアクセスします。
新規登録をして、使ってみるをクリックします。
プロジェクトを新規作成します。
2:NuxtとFirebaseのプロジェクトを関連づけ
</>
↑のようなアイコンをクリックします。
アプリ名を入れ、
FirebaseのHostingにチェックを入れ、
アプリを登録をクリックします。
3:Firebase CLIのインストール
frontディレクトリで以下のコマンドをします。
npm install -g firebase-tools
4:Firebase SDKのインストール
npm install firebase
5:設定ファイルの作成
front/pluginsのディレクトリの中にfirebase.jsという新規ファイルを作成し、
以下のように記述します。
front/plugins/firebase.js
import firebase from "firebase/compat/app"
import "firebase/compat/auth"
const fbConfig = {
apiKey: process.env.API_KEY,
authDomain: process.env.AUTH_DOMAIN,
projectId: process.env.PROJECT_ID,
};
firebase.initializeApp(fbConfig)
export default firebase
firebase.initializeApp(fbConfig)で各種設定を引数にしてFirebase アプリオブジェクトを作成しています。
それをexportすることによって、
このnuxtのプロジェクト内からFirebaseへアクセスできるようになります。
それぞれの設定の情報は外部から見えないよう.env
ファイルに定義します。
FireBaseの歯車のアイコンからプロジェクトの設定
下にスクロールすることで設定情報がわかるので
.env
に記述します””の間にコピペする。
API_ENDPOINT="http://localhost:3000" API_KEY="*************************" AUTH_DOMAIN="*********************" PROJECT_ID="**********************"
6:設定が反映できているかを確認
front/pages/index.vue
に以下の記述をします。
export default { components: { AddTodo, TodoList, }, data() { return { todos: [], }; }, // 追加 created() { console.log("API_KEY:", process.env.API_KEY); }, methods: { async addTodo(title) { await axios.post("/v1/todos", { title }) this.todos.push({ title }); }, }, };
サーバーを立ち上げて確認します。
npm run dev
↑にアクセスして検証ツールでapikeyが出力されていればOKです!
7:Firebaseの機能を用いた新規登録機能の実装
Firebase Authenticationとは
Firebase Authenticationとはユーザー認証の機能を提供してくれて、
ユーザの情報をFirebase上に保存してくれるサービスです。
メールアドレスとパスワードを使った認証方法を使用していきます。
8:Firebase Authenticationのメールアドレス認証方式をオンにする
Firebase→作成したプロジェクトを選択
左側のナビゲーションペインからAuthenticationを選択し、始めるをクリックします。
Sign-in methodをクリックして、次にメール/パス…となっている部分をクリックします。
有効にするのチェックをONにした後で保存を押します。
9:新規登録した際にFirebaseの認証を行い、RailsAPIのDBにもユーザーのレコードが保存されるようにする。
新規登録画面の作成
新規登録の画面を作成します。
front/pagesの配下に、signup.vue作成して、フロント部分を記述します
front/pages/signup.vue
<v-btn class="mr-4" @click="signup">submit</v-btn>
const res = await firebase
.auth()
.createUserWithEmailAndPassword(this.email, this.password)
↑新規登録用の情報を入力してsubmitボタンを押したとき、async signup()が発火します。これにより、メールアドレスとパスワードを使用して、Authenticationの機能を利用できます。
.catch(error => {
this.error = (code => {
switch (code) {
case "auth/email-already-in-use":
return "既にそのメールアドレスは使われています";
case "auth/wrong-password":
return "※パスワードが正しくありません";
case "auth/weak-password":
return "※パスワードは最低6文字以上にしてください";
default:
return "※メールアドレスとパスワードをご確認ください";
}
})(error.code);
});
.catchは、エラーがあった際の実装です。各種エラーに対してメッセージを設定し、
<p v-if="error" class="errors">{{ error }}</p>
で表示をしています。
v-if
に関しては、指定している値が存在しているときにのみ、
タグで囲んでいる部分が描画されます。
エラーが発生した場合、data()で定義されているerrorプロパティの値が入るので、
この部分が描画されるという訳です。
エラーがない場合はもちろん、表示はされません。
const user = {
email: res.user.email,
name: this.name,
uid: res.user.uid
};
await axios
.post("/v1/users", {
user
})
.catch(err => {
console.log({
err
});
});
Firebase側の処理が終わったら、const user =の部分でFirebaseから帰ってきた値を元に、userのオブジェクト情報を作成しています。
その後、await axiosを使用して、作成したユーザー情報をもとに、
APIへpostのリクエストを行なっています。
/v1/usersへのPOSTリクエストはどのアクションに対応しているか調べてみると、UsersControllerのcreateアクションに対応していることがわかります。
def create
user = User.new(user_params)
if user.save
render json: user
else
render json: user.errors
end
end
# 中略
private
def user_params
params.require(:user).permit(:name, :email, :uid)
end
Userクラスのインスタンスを、ストロングパラメータで受け取った引数を元に作成し、保存しています。
これでバックエンド側でもユーザーが作成され、DBに保存されます。
Submitをクリックしたら、ブラウザはTODO一覧の画面に移動できます。
こちらは、async signup()の処理の最後にあるthis.$router.push(“/”);の部分が実行されるからです。