

WEBページにOAuth 2.0(OpenID Connect含まず）を利用したログイン機能を作成した場合に、  
・ユーザー情報が変化しても一意に特定できるのか？どのように行うのか？  
・仮に特定できないとした場合、変更前と同一ユーザーであることを確認する対処法があるのか？  
の2点を知りたいです。

OpenID Connect非利用時のOAuth2.0の認可を利用した認証について勉強しています。  
読んでいる本には、OAuth2.0を利用してメールアドレスやユーザーIDにアクセス認可を得られる人なら本人だろうから、認証・ログイン機能を作れる旨が書いてありました。  
しかし、メールアドレスやユーザーIDを変更可能な認可プロバイダもあり、本の内容そのままでは、ユーザー情報を変更されてしまうと別ユーザーとして扱われてしまうような気がしてなりません。  
変更された場合でも、変更前と同一ユーザーだと特定できるものなのですか？現実にはどのようにして行われているのでしょうか？  
また、仮に特定できないのであれば、実際に運用されているサービスでは、一体どのようにして変更前後のユーザーが同一であることを確認しているでしょうか？

未だ知識や能力がWEBサービスを作る段階に達していないものの、どうしても気になってしまいます。  
教えていただけないでしょうか、よろしくお願いします。


CC BY-SA 4.0
2021-03-03T14:42:40.353
74397
2021-03-03T23:29:25.667
44195
question
oauth
OAuth2.0の認可を利用したログイン機能は、ユーザー情報が変化しても同一ユーザーと識別できますか？


(回答順は前後しますが、)

> ・仮に特定できないとした場合、変更前と同一ユーザーであることを確認する対処法があるのか？

いわゆるソーシャルログイン機能を有していると自称している認可サーバ(兼リソースサーバ)であれば、何らかの不変なユーザ識別子の提供は行っているはずです。

> ・ユーザー情報が変化しても一意に特定できるのか？どのように行うのか？

これはspecで定義されているわけではないのでその認可サーバ(兼リソースサーバ)の実装に依ります。  
例えばTwitterサービスでは(※[OAuth1.0a](https://developer.twitter.com/ja/docs/authentication/oauth-1-0a)だそうですが)
メールアドレスともスクリーンネーム(注)とも異なる
[`user_id`](https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-
users/follow-search-get-users/api-reference/get-users-
show)という不変値でユーザを識別することになっているようです。  
(注: Twitterサービスではメールアドレスもスクリーンネームも変更可能なのでこれらをユーザ識別子として採用していない)

ざっくり言うと、このようなユーザ識別子([`sub`](https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06#72-sub-%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%A0))の提供義務をspecで謳っているのがOpenID
Connectです。

* * *

逆に言えば、上記のような不変なユーザ識別子を提供していない認可サーバ(兼リソースサーバ)を用いてのソーシャルログイン機能実現は、質問文中で疑問視されている通り、不可能です。


CC BY-SA 4.0
2021-03-03T18:18:56.540
74401
2021-03-03T23:29:25.667
2021-03-03T23:29:25.667
2808
2808
74397
answer