はじめに
Webサービスで会員登録の情報を入力した後に、メールアドレス確認のメールが飛んでくるサービスよくありますよね。
あれの実装をいま仕事でしています。よくある機能だと思うので、実装方針を備忘録として記録しました。
作成しているシステムについて
アカウント登録機能のあるWebアプリケーションで、採用している言語・ミドルウェアは下記の一覧を参照
- Java
- Angular
- Ionic
- PostgreSQL
- AWS
メールの具体的な仕様
今回実装しているアカウント登録メールの大まかな仕様
- ユーザーが仮登録(メールアドレスなどを入力)を完了する
- 本登録画面へのURLリンクを含んだメールをユーザーに送信する
- URLリンクをクリックしたユーザーを認証して問題なければ、本登録画面に遷移させる
この記事では、URLリンクをクリックしたアカウントの認証(というか特定)方法に絞って解説します。
HTMLメールのレイアウトなどについては、こちらの記事をご参照ください。
アカウント登録のためのURLリンクを作成する
アカウント登録メールでは、アカウント本登録画面に遷移するURLだけではく、クリックしたユーザーを特定する情報が必要になります。
本システムでは、メールを送信する前の画面で入力させる情報がメールアドレスしかなかったため、URLのパラメーターにメールアドレスを含めることでアカウントを特定することにしました。
メールに載せるURLのイメージとしてはこんな感じです。
https://[システムのドメイン]/[アカウント本登録画面のパス]/[暗号化したメールアドレス]
メールアドレス暗号化の手順
URLに生のメールアドレスをそのまま載せるのはセキュリティ的にアレだよね...ってなったので暗号化することにしました。
- サーバサイド(Java)でAWS Key Management Service (KMS)を利用してメールアドレスを暗号化する
- 暗号化したテキストをBase64エンコードする
2.
のテキストをURLエンコードする
3.
のURLエンコードを最初忘れていたせいで、暗号化したテキストにURLに使用できない文字が混じって認証に失敗したりしました。
ユーザーがURLリンクをクリックした時の動作としては、URLから本登録画面に遷移した後、WebAPIを呼び出して暗号化したテキストをデコードして元のメールアドレスに戻し、DBを参照してアカウントを特定するという流れにしています。
言いたいこと
完全に霊感で作ったので、その実装ヤバくね?みたいなやつがあったらコソッと教えてください。まだ間に合います