OAuth2
OAuth2とは?
- サードパーティアプリに限定的なアクセス権限を与える認可フレームワーク
- 最新版は2.0でRFCで標準化されている
認証
- ユーザが誰であるのかを証明すること
認可
- ユーザができる権限を管理すること
OAuthがない世界
想定リスク
- ID/Password漏洩リスク
- 過剰な権限が与えられるリスク
- 権限管理のリスク
OAuthがある世界
OAuthの特徴
- ID/Passwordは第三者に教えない
- 必要な権限のみ与えられる
- 簡単に権限を剥奪できる
主要なコンポーネント
リソースオーナー
- リソースの所有者
- クライアントに対して権限を委譲する
リソースサーバー
- データ提供するサーバー
- Web APIを提供し、クライアントにデータを提供する
クライアント
- リソースオーナーから権限委譲を得てリソースサーバにアクセスするアプリ
- バックエンドアプリ、スマホアプリなど様々
認可サーバー
- アクセストークンをクライアントに発行するサーバー
- リソースオーナーの認証と認可が必要
OAuth2の仕組み
アクセストークン
- ユーザーが特定の情報やサービスにアクセスする許可証のようなもの
認可グラントタイプ
- アクセストークンとリフレッシュトークの両方を取得するために用いられ、コンフィデンシャルクライアントに最適化されている
スコープ
- クライアントが認可サーバー要求するアクセストークンの権限範囲を通知するもの
認可コード
- クライアントアプリケーションがアクセストークンを取得するための、一時的で使い捨てのパスワードのようなもの
クライアントの種類
コンフィデンシャル(Confidential)
- クレデンシャル情報を安全に保持することができるクライアント
パブリック(Public)
- クレデンシャル情報を安全に保持することができないクライアント
インプリシットグラント
- パブリッククライアントで使われるグラントタイプ
- 認可コードは使わず、リダイレクトを通じて直接アクセストークンを受け渡す
認可コードグラント
- アクセストークンとリフレッシュトークの両方を取得するために用いられ、コンフィデンシャルクライアントに最適化されている
- パブリッククライアントでも『認可コードグラント』は利用可能だが、PKCEを併用することが推奨される
リフレッシュトークン
- 新しいアクセストークンを取得するために使用されるトークン
- 発行は任意で、オプションであり、認可サーバーの判断に委ねられる
OpenID Connect(OIDC)
OpenID Connectとは?
- インターネット上でユーザーのログインと認証をシンプルにする仕組み
- OAuth2.0の拡張仕様であり、OpenID Foundationによって作成されている
OAuth2とOpenID Connectの違い
OAuth2.0 | OpenIDConnect | |
---|---|---|
目的 | 認可 | 認証 |
トークンタイプ | アクセストークン | IDトークン アクセストークン |
ユーザ認証 | No | Yes |
主な用途 | サードパーティの ユーザデータアクセス権の委譲 |
シングルサインオン(SSO) ユーザログイン |
その他 | - | OAuth2.0と同時に実施可能 |
OAuth2.0 | OpenIDConnect |
---|---|
リソースオーナー | エンドユーザー |
クライアント | リライングパーティー |
認可サーバー | OpenIDプロバイダー |
リソースサーバー | UserInfoエンドポイント |
アクセストークンとIDトークンの違い
- アクセストークン: 手に入れたら誰でも使える鍵
- IDトークン: 誰であるかを特定できる身分証明書
アクセストークン | IDトークン | |
---|---|---|
目的 | リソースへのアクセスを許可 | ユーザーのアイデンティティを提供 |
発行元 | 認可サーバー | OpenIDプロバイダ |
使用先 | リソースサーバー | リライングパーティー |
形式 | 特に決まりなし | Json Web Token(JWT) |
検証 | リソースサーバーが実施 | リライングパーティーが実施 |
クライアントとの紐付け | なし | あり(aud項目) |