1. ホーム
  2. architecture

[解決済み] 複数のユーザーアカウントを統合するためのアーキテクチャ

2022-04-20 11:24:41

質問

さて、登録とログインができるウェブサイトを用意しました。また、FacebookやTwitter、Linkedinのアカウントでログインすることもできます。

ユーザーが登録するアカウントは1つだけであることが重要です。そこで、どうにかして、ユーザーが異なる方法でログインした場合、そのアカウントを統合したいのです。これを解決するための最良の方法は何でしょうか?

例えば、ユーザーがFacebookのアカウントでログインした場合。そのデータを使って、自動的に彼のアカウントを登録します。この場合、ユーザー名とパスワードを記載したメールを送るべきでしょうか?(Facebookのポリシーで問題ない場合)。ユーザー名とパスワードを入力する2つ目の画面を表示させた方がいいのか?しかし、これはFacebookのアカウントでログインするためのものではありません。参加するための手続きを簡素化する必要があります。

また、ユーザーが当ウェブサイトでユーザー登録を行い、次回からはtwitterのアカウントでログインする可能性もあります。この2つのアカウントを1つに統合するにはどうしたらよいでしょうか?何か良い方法はありますか?

つまり、基本的に私の質問は、ユーザーが私たちのウェブサイトのメンバーになるための4つの異なる方法があります。ユーザーが複数の方法を使用することを決定した場合、これらの4つの方法すべてが1つのアカウントを作成するだけであることを確認するにはどうすればよいですか?また、ユーザー自身が面倒にならないようにするためには、どのような流れが良いでしょうか?


編集する

この質問をしてから3年、私自身がその答えを連載で述べています。 https://www.peternijssen.nl/social-network-authentication-setup/

https://www.peternijssen.nl/social-network-authentication-google/

https://www.peternijssen.nl/social-network-authentication-merging-accounts/

https://www.peternijssen.nl/social-network-authentication-twitter-facebook/

解決方法は?

私も今、全く同じ課題に直面しています。 私が考え出したデザインは、かなりシンプルですが、うまく機能しています。

核となるアイデアは、ローカルサイトのアイデンティティとサードパーティサイトのアイデンティティのモデルを分離しておき、後でリンクさせるというものです。 つまり、サイトにログインするすべてのユーザーは、任意の数のサードパーティーサイトIDにマッピングされたローカルIDを持っているのです。

ローカルIDレコードには、最小限の情報、つまり単一のフィールド、単なる主キーが含まれます。 (私のアプリケーションでは、ユーザーの電子メール、名前、生年月日などは気にしません。ただ、このアカウントにずっとログインしている人であることが知りたいだけです)。

サードパーティのIDには、サードパーティとの認証にのみ関連する情報が含まれています。 OAuth の場合、これは一般にユーザー識別子 (ID、メールアドレス、ユーザー名など) とサービス識別子 (どのサイトやサービスで認証されたかを示す) を意味します。 アプリケーションの他の部分、つまりデータベース以外の部分では、 このサービス識別子と、そのサービスから関連するユーザ識別子を取得するためのメソッドが対になっており、 それが認証を行う方法となります。 OpenID についても同じアプローチを採用していますが、認証の方法はより一般化されています (ほとんど常にまったく同じプロトコルを実行できるためです。異なる ID URL を使用し、それがサービス識別子となることを除けば、です)。

最後に、どのサードパーティーのIDが、どのローカルIDと対になっているかを記録しておきます。 この記録を作成するには、以下のような流れになります。

  • ユーザーが初めて第三者のIDを使用してログインする。 ローカル ID レコードが作成され、次にサードパーティ ID レコードが作成され、それらがペアリングされる。
  • コントロールパネルで、サードパーティーのサービスにログインしてアカウントをリンクする機会がユーザーに提供されます。 (この仕組みはかなりわかりやすい)。
  • ユーザーが知らず知らずのうちに複数のアカウントを作ってしまうというシナリオの場合、解決方法はとてもシンプルです。 ユーザーが1つのアカウントでログインしている間に、以前サイトにログインするために使用した別のアカウントにログインする(上記のコントロールパネル機能による)。 ウェブサービスはこの衝突(ログインしたユーザーのローカルIDが、先ほどログインした第三者のIDにリンクされているローカルIDと異なること)を検出し、ユーザーはアカウントの統合を促される。

アカウントのマージは、ローカル ID の各フィールドをマージし(これはアプリケーションによって異なり、ローカル ID レコードに 2 つのフィールドしかない場合は簡単です)、次にリンクされたサードパーティ ID が結果のローカル ID にリンクされるようにすることです。