Firebaseに作成したReactのアプリにメールアドレスとパスワードでサインアップする処理にフォーカスを当てて解説します。
※ ソースはこちら:Github
※ アプリはこちら:「Firebaseに認証するだけのアプリ」
※ パッケージのバージョン:”firebase”: “^9.22.1″、”react”: “^18.2.0″ (詳細はGithubのpackage.jsonを参照してください。)
※ Firebaseの認証周り全般の解説はこちらを参照してください。
サインアップ画面の処理
当該ページ(SignUpコンポーネント)を表示するのは、URLに”~/signup”を指定するか、Login画面から「ユーザー登録はこちらから」をクリックした場合になります。
SignUpコンポーネント
SignUp.js
import { mailRegistration } from "../service/firebase/registration";
import { useAuthContext } from "../context/AuthContext";
import { useNavigate } from "react-router-dom";
import Title from "./Title";
import { Button, Input } from "@mui/material";
import AppRegistrationIcon from "@mui/icons-material/AppRegistration";
import SendIcon from "@mui/icons-material/Send";
const SignUp = () => {
const { user } = useAuthContext();
const navigate = useNavigate();
const handleSubmit = (e) => { // こちらの関数を下記に解説しています。
e.preventDefault();
const [email, password] = e.target.elements;
mailRegistration(email.value, password.value).then(
(ret) => ret && navigate("/")
);
};
return (
<div>
<Title />
<h2>ユーザー登録 {user && user.email}</h2>
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="email">メールアドレス: </label>
<Input
id="email"
name="email"
placeholder="email"
type="email"
/>
</div>
<div>
<label htmlFor="password">パスワード: </label>
<Input
id="password"
name="password"
placeholder="password"
type="password"
/>
<p>パスワードは6文字以上にしてください。</p>
</div>
<div>
<Button variant="outlined" startIcon={<AppRegistrationIcon />} type="submit">
登録
</Button> // こちらの<Button>コンポーネントを下記に解説しています。
</div>
</form>
<Button
variant="outlined"
onClick={() => navigate("/login")}
style={{ margin: "0 20px" }}
endIcon={<SendIcon />}
>
Login画面へ
</Button>
</div>
);
};
export default SignUp;
“<Button ~~~ type=”submit”>登録</Button>”
“<Button ~~~ type=”submit”>登録</Button>”がメールアドレスとパスワードを登録するボタン。
ボタンをクリックすると<form onSubmit={handleSubmit}>が発火し、handleSubmitがコールされます。
<Button>コンポーネントは、MUIのコンポーネントです。
MUIについては、以下の記事で解説しています。
const handleSubmit ~
handleSubmitの「e.preventDefault()」は、ページがリロードされないようにするため必要。
リロードされると入力情報がなくなってしまいます。
そして、Firebaseのアプリにログインするために、入力されたメールアドレスとパスワードを入力として、mailRegistration()をコールします。
mailRegistration()は、promisを返しますので、thenで受けます。
登録が成功すれば、ルート(ホーム)画面を表示します。
mailRegistration() (ユーザーを登録するための関数)
registration.js
import { createUserWithEmailAndPassword, sendEmailVerification } from "firebase/auth";
import { auth } from "./firebase"
import { issueMsg } from "../common/issueMsg";
const mailRegistration = async (email, password) => {
try {
await createUserWithEmailAndPassword( // この関数を下記に解説しています。
auth,
email,
password
);
await sendEmailVerification(auth.currentUser); // この関数を下記に解説しています。
issueMsg("認証のためのメールを送信しました。メールのURLをクリックして当該メールを認証してください。");
return true;
} catch (error) {
if (error.code === 'auth/invalid-email') {
issueMsg("正しいメールアドレスの形式で入力してください。");
} else if (error.code === 'auth/weak-password') {
issueMsg("パスワードは6文字以上を設定する必要があります。");
} else if (error.code === 'auth/email-already-in-use') {
issueMsg("そのメールアドレスは登録済みです。");
} else {
issueMsg(`登録時にエラーが発生しました。${error.code}`);
}
console.error(error);
return false;
}
}
export { mailRegistration } ;
createUserWithEmailAndPassword()
createUserWithEmailAndPassword()はFirebaseの関数。
createUserWithEmailAndPassword()に、メールアドレスとパスワードを指定すれば、ユーザー登録ができます。(authはFirebaseの情報です。詳細は、こちらの記事を参照してください。)
sendEmailVerification()
そして、ユーザー登録が成功したら、Firebaseの関数のsendEmailVerification()をコールして、登録したメールアドレスに認証のためのメールを送信します。
このメールのリンクをクリックすると、
メール認証が終了したウインドウが出力し、正式にメールアドレスとパスワードが登録されます。
Firebase ConsoleのAuthenticationから登録できたかを確認できます。
catch 以降
createUserWithEmailAndPassword(),sendEmailVerification()がエラーになると、catch以降に正業が渡ります。
エラーコードを解析して、エラーメッセージを出力しています。
どんなエラーコードがあるかはこちらで確認することができます。
最後に
以下が、当該Reactのプロジェクトのsrc配下のファイル構造です。
SRC
│ App.css
│ App.js
│ App.test.js
│ index.css
│ index.js
│ reportWebVitals.js
│ service-worker.js
│ serviceWorkerRegistration.js
│ setupTests.js
│
├─components
│ │ Home.js
│ │ HomeChild.js
│ │ Login.js
│ │ PrivateRoute.js
│ │ PublicRoute.js
│ │ SignUp.js
│ │ Title.js
│ │
│ └─styles
│ portal.css
│
├─context
│ AuthContext.js
│
└─service
├─authenticationProcess
│ changePassword.js
│ delUser.js
│
├─common
│ issueMsg.js
│
└─firebase
firebase.js
getCredential.js
loginFirebase.js
registration.js
sendEmailLink.js
submitPasswordResetEmail.js
この記事では、
の解説をしました。
Firebaseに作成したアプリにメールアドレスとパスワードでサインアップする設定はこちらを参照してください。
このブログに掲載されているコードは、著作権者(私)に帰属します。コードを自由に使用、複製、改変、配布、販売、サブライセンスできます。また、コードを使用した結果、何らかの損害が発生した場合でも、著作権者は一切責任を負いません。