【メモ】 認証について(OAuth2.0/OpenID Connect)
OAuth2.0
RFC6749は4つの認可フロー(=アクセストークン発行手順)を定義している
認可コード
一時的に発行される認可コードをアクセストークンと交換
インプリシット
認可エンドポイントからアクセストークンが直接発行される
リソースオーナー・パスワード・クレデンシャルズ
ユーザのidとpasswordをクライアントアプリに渡す
クライアント・クレデンシャルズ
ユーザ認証なし。クライアントアプリの認証のみ必要
リソースサーバ
User情報を持っている
認可サーバ
アクセストークンを生成
クライアントに対して発行
クライアント
アクセストークンを元にリソースサーバーにリクエスト
OpenID Connect
Open Id プロバイダー
Idトークンを発行
クライアントアプリ
OpenID ConnectはOAuth2.0の上に作られたレイヤーなので似ている。
OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol.
OAuth2.0と似ているため、OpenIDプロバイダ 兼 認可サーバとすることが可能。
その場合はクライアントはIDトークンとアクセストークンをサーバに送る。
JWS
RFC 7515 JSON Web Signature
A.2. Example using response_type=id_token
ピリオドが2つあり、3つに分かれている
ヘッダ・・・黄色
ペイロード・・・緑
署名(バイナリデータ)・・・ピンク
各部分はbase64urlでエンコードされている。
上記のidトークンをbase64urlでデコードするとJSONになる
eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ→{"kid":"1e9gdk7","alg":"RS256"}
alg → RS256(署名アルゴリズム)
他のkeyについてはRFC 7515仕様書を参考
RFC 7515(JWS)自体はペイロードがJSONでなくても良い。任意のバイナリデータ。
JWE
RFC7516 JSON Web Encryption
JWSと違いピリオドが4つあり5つに分かれている。
ヘッダー
暗号化キー
Encrypted Key → 暗号化されたキー
共有鍵を非対称鍵で暗号化する、二段階でキーを暗号処理しているため。
初期ベクター
暗号文
認証タグ
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
RFC 7516: JSON Web Encryption (JWE)
暗号化する側
公開鍵を持っている。
1.平文の暗号
公開鍵から共有鍵をランダムに生成し、平文を暗号化する。
2.共有鍵の暗号
公開鍵を暗号化して共有鍵を生成する。
複合化する側
秘密鍵を持っている。
暗号化する側から1,2を受け取る。
それぞれ複合化して平文を取得する。
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ をデコード → {"alg":"RSA-OAEP","enc":"A256GCM"}になる。
共有鍵の暗号アルゴリズムと平文の暗号アルゴリズムの2つがヘッダに入っている。
JWK
RFC7517 JSON Web Key
JWA
RFC7518 JSON Web Algorithms
JWT
RFC7519 JSON Web Token
JWS,JWEから拡張したもの。JWSのペイロード部分をJSONにすること。
OpenID ConnectはJWTをさらに拡張してIDトークンを定義。
JSON形式で表現されたclaim(クレーム)の集合をJWSもしくはJWEに埋め込んだもの。
(クレーム=key, valueの組みのこと)
JWS形式のJWT
ヘッダー、ペイロード、署名
JWE形式のJWT
ヘッダー、暗号化されたキー、初期ベクター、暗号文、認証タグ
署名したい場合はJWSを使い、暗号化したい場合はJWEを使う。
署名も暗号化もしたい場合は、JWSをJWEでくるむ(または逆)=Nested JWTと呼ぶ。
ID トークン
JWTの一種。
クレームの種類が仕様書に定義されている。
OpenID Connect は ID トークン を発行するための仕様。
fensiではリフレッシュトークンをやっていない
ユーザーはJWTから1日経っていたら、新しくJWTを発行している。