OpenID Connectまとめ
概要
OpenID Connectは認証用のプロトコルである。 認可フローはOAuth 2.0そのままで、属性情報も渡せるようになる。 OpenID Connectを理解する上で、必要な用語は下記の通りある。
- OpenID Provider: ユーザーの認証を行う機能を持つ
- Relying Party ( Client ): SSO対象のアプリケーションサーバー
- ID Token: 認証と認可の情報を含むJWT形式のトークン
- Access Token: UserInfoエンドポイントにアクセスするためのトークン
- UserInfo: Access Tokenで取得できる
認証フロー
- Authorization Code Flow
- Implicit Flow
認証フローはHTTP requestのパラメータに追加することで指定することができる。
HTTP/1.1 302 Found Location: https://op.example.domain/authorize? response_type=code # <== ここ!!! &scope=openid%20profile%20email &client_id=XXXXXX &state=abcdefg123 &redirect_uri=https%3A%2F%2Frp.example.domain%2Fcallback
Authorization Code Flow
認証手順
- Client は必要なパラメータを含む Authentication Request を用意する.
- Client は Authorization Server にリクエストを送信する.
- Authorization Server は End-User を Authenticate する.
- Authorization Server は End-User の Consent/Authorization を得る.
- Authorization Server は Authorization Code を添えて End-User を Client に戻す.
- Client は Token Endpoint へ Authorization Code を送信する.
- Client は ID Token と Access Token をレスポンスボディに含むレスポンスを受け取る.
- Client は ID Token を検証し, End-User の Subject Identifier を取得する.
ResourceProviderからUserInfoにアクセスするのが Implicit Flowとの大きな違い。
Implicit Flow
認証手順
- Client は必要なパラメータを含む Authentication Request を用意する.
- Client は Authorization Server にリクエストを送信する.
- Authorization Server は End-User を Authenticate する.
- Authorization Server は End-User の Consent/Authorization を得る.
- Authorization Server は ID Token, および要求があれば Access Token を添えて End-User を Client に戻す.
- Client は ID Token を検証し, End-User の Subject Identifier を取得する.
Authorization Code Flowとの大きな違いは下記の通り
- ID TokenとAccess TokenがAuthorizationエンドポイントから返却される
- ID Tokenの受け渡しはブラウザ上で動作するClientで行う
- OpenID ProviderとRelying Partyの間で通信できない環境でも採用可能
http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#ImplicitFlowAuth
Implicit Flow は主にスクリプト言語を用いて実装されブラウザ上で動作する Client によって使用される. Access Token と ID Token は, Client に直接返却され, その Access Token と ID Token は, End-User と End-User の User Agent にアクセスするアプリケーションに露出する可能性がある. Authorization Server は Client Authentication を行わない.
ということで、SPAでやってるサービスなら、Implicit Flowを使う。
所感
OpenID Connectはユーザーに認証をさせる。 SAMLはサービスとIdPに認証をさせる。
OpenID Connectは、登録されるサービスの信頼性をIdPが確認しない。 自由に登録できるという点はメリットでもあり、デメリットでもある。
SAMLは登録するサービスをIdP側が完全に把握できる。 設定コストが高いという点ではデメリットでもある。