メールアドレスをキーにしてID連携を行う設計の危うさ

ritou
·

ritouです。このしずかなインターネットにおける初投稿です。

おそらく、このしずかなインターネットのID連携では次のような設計になっていま「した」。問い合わせをさせていただき、対応いただきました。

これまでもQiitaなどで同様の実装例が紹介されていた際にはコメントさせていただいていたものですので、アンチパターンの紹介記事として読んでいただければと思います。

  • 「Googleアカウントでログイン」ではじめると、ユーザーが作成され、Googleから受け取ったメールアドレス([email protected])が設定される

  • 次回から「Googleアカウントでログイン」をすると、Googleから受け取ったメールアドレスでユーザーを参照

試しに、次のような流れで動作を確認してみます。

  1. 「Googleアカウントでログイン」でアカウント作成([email protected])

  2. 「メールアドレス変更」([email protected]) ※変更前に最初に設定されたメールアドレスでログインする必要あり

  3. ログアウト

  4. 「Googleアカウントでログイン」をしてもGoogleから受け取ったメールアドレス([email protected])ではユーザーを参照できない

  5. 設定中のメールアドレス([email protected])でログイン

  6. 「メールアドレス変更」にてGoogleアカウントのメールアドレスに戻す([email protected])

  7. 「Googleアカウントでログイン」をすると、Googleから受け取ったメールアドレス([email protected])でユーザーが引けるのでログイン成功

動作確認は以上です。4で出たエラーというのが次の画像です。

このGoogleアカウントはサービス内で利用されています。

これはどういうことなんでしょうかね。利用されているならログインさせてくれよという感じです。

Googleアカウントのメールアドレスを変更した場合は、古いメールアドレスでログインしたうえでメールアドレス変更の手続きを行う必要があります

どうやらしずかさん(誰?)はGoogleアカウント側のメールアドレスが変更されたせいで参照できなくなった説を唱えていますが、真相は逆ですよね。しずかさんに登録しているメールアドレスの方を変更したので参照できなくなったのです。

zennの記事でこんなことを書きました。

IdP側でメールアドレスを変えた時などに動かなくなるかもよ

IdPで確認後にそのメアドがリサイクルされて今の所有者とは変わってるかもよ

先ほどのエラー画面は前者を想定しているようにも見えます。しかし、Googleアカウントのメールアドレスが変わる時は、前のメールアドレスが使えなくなる可能性の方が高そうです。

Googleも、ドキュメント内でこのような設計はしないように言っています。

注: Google アカウントのメールアドレスは変更される可能性があるため、ユーザーの識別には使用しないでください。代わりに、クライアントで getBasicProfile().getId() を使用して取得できるアカウントの ID を使用し、バックエンドで ID トークンの sub クレームから取得します。

以上のように、この設計はアンチパターンです。次のような設計に修正していただきたいところです。

  • Googleから受け取ったユーザーIDとサービスのユーザーIDの紐付けを持ち、「Googleアカウントでログイン」ではそれを見る

  • 初期のメールアドレスとしての利用は良い

  • Googleから受け取ったメールアドレスと設定済みのメールアドレスが違ったら、Googleから受け取ったメールアドレスで上書きするか?とユーザーに聞いても良い

以上、初投稿でうるさいインターネットをしてしまい申し訳ございません。

ではまた。