OAuth / OpenID Connect と SSO
ソーシャルログイン(SSO)を支える認可・認証プロトコル。_moc-web-infra
OAuth と OIDC の違い
- OAuth 2.0 は認可(リソースアクセスの委譲)のプロトコルであり、認証のためのものではない。
- OpenID Connect(OIDC)は OAuth に認証機能を足したもの。ユーザー情報を含む ID Token(JWT)を発行する。
- 本来は OIDC を使うべきだが、Twitter など未対応のProviderが多く、仕方なく OAuth 認可で得たユーザー情報をAPIサーバに送って認証とする実装が現実的。
用語
- OAuth Provider: 認可を提供する側(Google, Twitter 等)
- IDaaS: OAuth Provider 機能をサービス提供するもの(Auth0, AWS Cognito, firebase Auth)。Firebase Auth は1万ユーザーまで無料、その後 $0.06/user。
- ID Token: ユーザー情報をエンコードしたトークン。Google の場合
sub(一意),email,pictureを claim として得る。
OIDC による SSO フロー
- ユーザーがログインボタンを押す
- クライアントが OAuth Provider に認証要求 → ログインフォーム
- callback URL に認証情報が返る
- クライアントが ID Token(含むユーザー情報)を取得
- クライアントが ID Token をAPIサーバに POST
- APIサーバが ID Token を検証(Google API Client 等。
audienceに clientId を設定) - 妥当ならユーザーを作成/取得し、自前の JWT を返す
OIDC Provider の自前運用
IDaaS は高価なので OIDC Provider を自作する選択肢がある。Keycloak(Java製OSS, IDaaS)が定番。Realm/Client を作り、docker Compose で立て、Let’s Encrypt でHTTPS化、スティッキーセッションに注意。
関連
- jwt-token-auth / web-browser-security
- spring-framework Spring Security での実装