OAuth2.0 と OpenID Connect
いつも違いがわからなくなるのでメモ
OAuth2.0 は認可のフロー、OpenID Connect は OAuth2.0 を拡張した認証のフロー
OAuth2.0 とは互換性があるらしい
ざっくりとした違い
OpenID Connect は OAuth2.0 でクライアントが認可サーバから アクセストークンを取得するさいに、同時にユーザの情報が含まれた ID トークンも取得できる
ID トークンは署名付き JWT であるため、クライアントはその ID トークンの信頼性を検証できる
OpenID Connect はユーザ情報を取得できる user info エンドポイントがあったり、それらエンドポイントや各種パラメータを取得できる共通エンドポイント (/.well-known/openid-configuration)が規定されていて便利になっている
名前もことなる
OAuth2.0 における client は PR (Relying Party) と呼ばれる
なぜ ID token を別途用意したか?なぜ OAuth2.0 は認証には使えないのか?
OAuth2.0 は認可の仕組み、とよく言うが、具体的にどういうことなのか?なぜ認可の仕組みは認証の仕組み転用はできないのか?
「ある人が権限があるトークンを取得できる」=「ある人が認証されている」と考えることはできるかもしれないが、実は問題がたくさんある
例えばユーザ A があるクライアント X に OAuth2.0 を通してリソース R への権限を意図して付与した場合、そのクライアント X は与えられた権限(つまりリソース R へのアクセス)すること以上のことはできない
ここで認証も実現しようとして「リソール R へアクセスできるならユーザ A である」というルールを追加すると、あるクライアント X の運営者は、別のクライアント Y に、クライアント X が取得したトークンを用いてユーザ A として認証できてしまう
これはクライアント X が与えられた権限以上のことをできてしまっている
これを防ぐためには、あるトークンが、いつどういう目的で作られたのかという情報が必要
例えば LINE の ID token は ↓ いうふうになっており、確かに確認ができる
code:json
{
"aud": "channel_id", // つまりクライアントの ID で、誰のために発行かわかる
"exp": 1726305312, // 有効期限がわかる
"iat": 1726301712, // トークン生成時刻がわかる
"sub": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // ユーザ ID, LINE だと LINE ユーザ ID
"name": "user_name" // ユーザ情報が色々わかる
}
参考