😽
ソーシャル認証と一般的なパスワード認証を組み合わせたサーバーサイドの設計
はじめに
パスワード認証とソーシャル認証を組み合わせたサーバー側の設計メモです。
※「一般的なユーザー名とパスワードを使った認証」を「パスワード認証」 と略しています。
flaskで実装したサンプル
ざっくり処理の流れ
アプリケーション全体で認証方式を意識したくないので認証後はサーバー側が認証情報(ユーザーの識別子を含むjwt)を発行する。
サーバーはリクエスト内に含まれるjwtを検証して認証済かどうかの判断を行う。
新規登録とログイン処理はパスワード認証用とソーシャル認証用で2つ作る必要あり。
ソーシャル認証時のアクセストークンとリフレッシュトークンは保持しない。使ったらすぐに破棄(こわいので)
table定義
users
ユーザーの基本情報
ソーシャル認証の場合はoauthプロバイダーから取得したユーザー情報が入る
id | name | |
---|---|---|
1 | 佐藤学 | satomanabu@manabun.com |
user_authentications
パスワード認証用の情報
id | user_id | username | password |
---|---|---|---|
1 | 1 | manabu | 51fd726f3d3f93f8d436b7e6c060... |
user_oauths
ソーシャル認証用の情報
id | user_id | provider | identity |
---|---|---|---|
1 | 1 | 10001 |
provider = oauthのプロバイダ名
identity = 認可されたプロバイダ側のユーザー識別子(user_idとか)
パスワード認証のフロー
新規登録
ログイン
ソーシャル認証のフロー
新規登録
ログイン
ログアウトのフロー
パスワード認証とソーシャル認証で共通
おわりに
多分これで問題ないと思うですけどどうなんでしょ・・・・
複数のoauthプロバイダーの処理を書くのが結構面倒でした。
お金無限マンならauth0でシュシュシュと実装しちゃいたいなあと思いました。
Discussion