L08084のブログ

技術記事の執筆は、祈りに近い

アカウント登録メールの実装をしています

f:id:l08084:20181110163634p:plain
アカウント登録メールの例

はじめに

Webサービスで会員登録の情報を入力した後に、メールアドレス確認のメールが飛んでくるサービスよくありますよね。
あれの実装をいま仕事でしています。よくある機能だと思うので、実装方針を備忘録として記録しました。

作成しているシステムについて

アカウント登録機能のあるWebアプリケーションで、採用している言語・ミドルウェアは下記の一覧を参照

  • Java
  • Angular
  • Ionic
  • PostgreSQL
  • AWS

メールの具体的な仕様

今回実装しているアカウント登録メールの大まかな仕様

  1. ユーザーが仮登録(メールアドレスなどを入力)を完了する
  2. 本登録画面へのURLリンクを含んだメールをユーザーに送信する
  3. URLリンクをクリックしたユーザーを認証して問題なければ、本登録画面に遷移させる

この記事では、URLリンクをクリックしたアカウントの認証(というか特定)方法に絞って解説します。
HTMLメールのレイアウトなどについては、こちらの記事をご参照ください。

アカウント登録のためのURLリンクを作成する

アカウント登録メールでは、アカウント本登録画面に遷移するURLだけではく、クリックしたユーザーを特定する情報が必要になります。

本システムでは、メールを送信する前の画面で入力させる情報がメールアドレスしかなかったため、URLのパラメーターにメールアドレスを含めることでアカウントを特定することにしました。

メールに載せるURLのイメージとしてはこんな感じです。
https://[システムのドメイン]/[アカウント本登録画面のパス]/[暗号化したメールアドレス]

メールアドレス暗号化の手順

URLに生のメールアドレスをそのまま載せるのはセキュリティ的にアレだよね...ってなったので暗号化することにしました。

  1. サーバサイド(Java)でAWS Key Management Service (KMS)を利用してメールアドレスを暗号化する
  2. 暗号化したテキストをBase64エンコードする
  3. 2.のテキストをURLエンコードする

3.URLエンコードを最初忘れていたせいで、暗号化したテキストにURLに使用できない文字が混じって認証に失敗したりしました。

ユーザーがURLリンクをクリックした時の動作としては、URLから本登録画面に遷移した後、WebAPIを呼び出して暗号化したテキストをデコードして元のメールアドレスに戻し、DBを参照してアカウントを特定するという流れにしています。

言いたいこと

完全に霊感で作ったので、その実装ヤバくね?みたいなやつがあったらコソッと教えてください。まだ間に合います