概要
OAuthでログインする方法は検索すれば出てきますが、そのあとのログイン管理をどうしたら良いのだろうかと考えてみました。
ログインとログイン後の流れ
-
ログイン時にユーザー情報を得る。
OAuthは以下を参考に行えばユーザー情報を得ることは可能という前提とします。
http://oauth2-client.thephpleague.com/providers/league/ -
ユーザー情報を元にアプリケーション側に通常ユーザーを作る。(アプリケーション側に該当ユーザーが存在しなければ)
-
ユーザーが既に存在している場合はgoogle_idやfacebook_idが未登録であれば登録する。(これで通常ログインもソーシャルログインも対応できる)
-
アプリケーション側の通常ユーザーと同様にアプリケーション側のユーザーIDで振る舞いを行う。アプリ内ではアプリのユーザーIDで管理する。
ユーザーテーブル設計例
id | display_id | google_id | facebook_id | mailadress | name | password | その他アプリに必要だと思われる情報 password_update_datetime (パスワード有効期限判定)、 lastlogin_datetime (アクティブユーザー) 等 |
create_datetime | update_datetime | delete_datetime | delete_flag | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
型 | INT | VARCHAR(255) | VARCHAR(255) | VARCHAR(255) | VARCHAR(255) | VARCHAR(255) | VARCHAR(255) | DATETIME | DATETIME | DATETIME | TINYINT(1) | |
初期値 | NULL | NULL | CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | NULL | 0 | ||||||
その他 | AUTO_INCREMENT UNSIGNED NOT NULL |
NOT NULL | NOT NULL | NOT NULL | NOT NULL | NOT NULL |
idでPRIMARY KEY
display_idでUNIQUE 表示用ID uniqid()等で作る
facebook_idでUNIQUE
google_idでUNIQUE
password パスワードハッシュ null許可 password_hash()で作成
mailadressでUNIQUE(mailadressをキーにする)
初回ログイン時には名前は登録させる。
- 名前は取得してきた情報により本名になってしまうかもしれないので改めて登録させる
- ソーシャルログインの場合はパスワードは不要(取得したgoogle_idやfacebook_idが既に登録されているかでログイン処理を行う。idで登録されていなければemailメールアドレスで判定し登録済みならgoogle_idやfacebook_idを登録する)
保存する(保存しても良い)情報等の扱いは利用するサービスの規約に従ってください
海外のサービスには個人情報についての取り扱い等の記述は見当たりませんでしたが、
Oauthでの認可は個人情報を渡すことの許可にあたるそうなので許可が出れば保存しても問題なさそうです。
アクセストークンの保持について
アクセストークンをDB等に保存して期限切れまで再利用する際は可逆暗号化すべきとのことです。また、保存するかしないかはアプリ側に委ねられているそうです。
危ういものは持ちたくないということで私は毎回トークンを取得しに行く方法でも良いかと感じました。
参考
アクセストークン
https://developers.facebook.com/docs/facebook-login/access-tokens#errors
有効期限切れのトークンを処理する最善の方法は、APIによるエラーメッセージを取り込むことです。エラーが発生するごとに、APIはHTTP 400ステータスコード、コード、サブコードを、エラーの特徴を説明するJSON本体に含めて返します
https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling#errors
無効なアクセストークンの際は401
https://cloud.google.com/docs/authentication#error_handling