🔥
Next.js × Firebase で Google Login 実装 #2
前回の記事でログインができるようになったので、次のステップへ
useContext で認証情報をアプリ内全体で受け取れるようにする
まずは認証情報を export
src/service/firebase.js
export const auth = firebase.auth();
以下、表題を実現するコードとその説明
-
AuthProviders.jsxを作成し -
authはその中でimport -
createContextをAuthContextへ代入 -
useEffectによりコンポーネントのマウント時にauthのonAuthStateChangedを発火 -
onAuthStateChangedはsetCurrentUserでユーザー情報を 初期値のnullに上書きする形でcurrentUserに保持 -
returnされるのは ユーザー情報であるcurrentUserをvalueとして持っているAuthContext.Provider - 引数
propsとして渡された要素をAuthContext.Providerの 子要素childrenとして受け取るので、結果として子要素にユーザー情報が渡される
と自分は理解しています
src/providers/AuthProviders.jsx
import { useState, useEffect, createContext } from "react";
import { auth } from "../service/firebase";
export const AuthContext = createContext();
export const AuthProvider = (props) => {
const [currentUser, setCurrentUser] = useState(null);
useEffect(() => {
auth.onAuthStateChanged(setCurrentUser);
}, []);
return (
<AuthContext.Provider value={{ currentUser }}>
{props.children}
</AuthContext.Provider>
);
};
_App で AuthProvider を import
_App の <props.Component {...props.pageProps} /> を AuthProvider でラップすることで、 グローバルに AuthProvider が保持している認証情報を読み込めるようにする
余談ですが、私はいくつかの理由により、named import、 Arrow function、 明示的な props表記が好きなので、コードはそのようになっています
_App.jsx
import "../src/service/firebase";
import { AuthProvider } from "../src/providers/AuthProviders";
const MyApp = (props) => {
return (
<AuthProvider>
<props.Component {...props.pageProps} />
</AuthProvider>
);
};
export default MyApp;
うまくいったか確認 👀
とりあえず Header.jsx component で import して console.log に表示させてみる
src/components/Header.jsx
import { useContext } from "react";
import { signInWithGoogle } from "../service/firebase";
import { AuthContext } from "../providers/AuthProviders";
export const Header = () => {
const currentUser = useContext(AuthContext);
console.log(currentUser)
return (
<div>
<button onClick={signInWithGoogle}>Login</button>
</div>
);
};
無事 User 情報を取得
喜びの瞬間ですね✨

Login 実装完了!
Discussion