ID フェデレーションとは?OAuth2.0 と OpenID Connect の関係

認証

ID フェデレーションについて調べたところ、以下の5点が頭の中でぐちゃぐちゃになったので、まとめることにしました。

  • ID フェデレーションって何?
  • ID フェデレーションと SSO の違いって何?
  • OAuth2.0 と OpenID Connect と SAML の違いって何?
  • トークン ID とアクセストークンの違いって何?
  • 結局どうやってフェデレーションするの?

ID フェデレーションとは

ID フェデレーションとは、ユーザーの認証結果を別のサイトで使い回せる技術です。

ID フェデレーションの例

ID フェデレーションを利用すると、上記のように Twitter や Google などの認証(ログイン)結果を自分のサイトでも利用することができます。

ID フェデレーションと SSO(シングルサインオン)の違い

ID フェデレーションは、4種類の SSO(シングルサインオン)を実現する方式のうち、フェデレーション方式を利用したものを指します。

フェデレーションとは、それぞれ個別に認証機能を持つクラウドやサイト間でのシングルサインオンのことです。

https://www.hpe.com/jp/ja/japan/icewall/federation/overview.html

SSO(シングルサインオン)を実現する方式は次の4種類があります。

  • ケルベロス認証方式: ケルベロス認証を利用する
  • エージェント方式: 認証を代行する「エージェント」モジュールを組み込む
  • リバースプロキシ方式: リバースプロキシサーバー + エージェント型
  • フェデレーション方式: ユーザ認証結果を他の認証基盤に渡す(ID フェデレーション)

なお、認証基盤には OpenLDAP や ActiveDirectory を利用します。

OpenLDAP の詳細については以下の記事をご覧ください。

ID フェデレーションで利用する技術

ID フェデレーションでユーザー認証結果を伝える方法は、次の2つの方法があります。

  • SAML(Security Assertion Markup Language): アサーションによってユーザ認証結果を伝える方式
    • オワコンと言われているが、いろんな企業が使ってる
    • XML ベース
    • 色々できる。(その分難しい)
  • OpenID Connect: IDトークンによってユーザ認証結果を伝える方式
    • 次世代の ID フェデレーションのスタンダード
    • OAuth2.0 ベース

なお、ユーザー認証結果を提供する側と利用する側にはそれぞれ以下の名前がついています。

  • Identity Provider (IdP): ユーザー認証結果を提供する側
  • Service Provider (SP): IdP から受け取ったユーザー認証結果を利用する側

OpenID Connect と OAuth2.0 とは

OpenID の種類には以下の2つがあります。

  • OpenID Authentication 2.0(OAuth 2.0)
  • OpenID Connect(OIDC)=認証 + OAuth2.0

OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.

https://openid.net/connect/

OAuth2.0 と OIDC の機能の比較は以下のとおりです。OIDC の拡張仕様は赤線で引いています。

OAuth2.0
(OpenID Authentication 2.0)
OIDC
(OpenID Connect)
目的Service Provider に権限を与えるService Provider に権限を与える
Service Provider に他の認証基盤で利用可能な認証結果を与える
機能認可(Authorization = AuthZ)認可(Authorization = AuthZ)
認証(Authentication = AuthN)
具体例
動作認可サーバーからアクセストークンを取得認可サーバーからアクセストークンを取得
Identity Provider からID トークンを取得

認可と認証の違い

  • 認証(Authentication):誰であるか確認します。所謂ログインです。
  • 認可(Authorization):権限を与えます。所謂ログイン後のマイページの閲覧権限です。

なお、OAuth2.0 は認可(Authorization)サーバーの役割を持ちますが、認証(Authentication)サーバーの役割は仕様範囲外です。

OAuth defines four roles:

  • resource owner
  • resource server
  • client
  • authorization server

The interaction between the authorization server and resource server is beyond the scope of this specification.

https://tools.ietf.org/html/rfc6749#section-1.1

ID トークンの中身

ID フェデレーションでは、ID トークンを利用してユーザーを認証します。

OIDC 標準に従った ID トークンの中身は以下の通りです。

Final: OpenID Connect Core 1.0 incorporating errata set 1
OpenID Connect Core 1.0 incorporating errata set 1

ID フェデレーションの実装

OIDC を利用して ID フェデレーションを実際に実装してみます。

  • ID トークンを利用して ID フェデレーションでログイン
  • ログインした後は、アクセストークンで指定した Federated Identity の権限を持つ

今回の例では、Cognito で作成したログイン画面で Amazon QuickSight に ID フェデレーションをします。

aws-samples/aws-cognito-quicksight-auth
A simple JavaScript frontend and SAM template to spin up a serverless backend, federating Cognito User Pools users to QuickSight as part of the blog post:

Github の説明でデプロイ方法がわからない人は、以下の記事がわかりやすいので参照してください。

CognitoのユーザーでQuickSightログインを試してみる | Developers.IO
aws-samplesにCognitoユーザーでQuickSightにログインするシステムのサンプルが公開されていたので試してみました。

ちなみに、S3 バケットポリシーのブロックパブリックが ON になってると CloudFormation でエラーがでたので注意してください。

デプロイ後の構成

  1. ログインし、Cognito ユーザープールから ID トークンを入手
  2. ID トークンを利用して Cognito ID Pool から IAM Role のアクセストークンを入手
  3. Signin Token を入手するために API Gateway にリクエストを送信
  4. getSigninTokenリクエストを送信
    • IAM Role のアクセストークンを渡す
  5. SigninToken を Service Provider(コールバック URL)に返却
  6. SigninToken を付与した login リクエストを送信
  7. QSにログイン成功
    • アクセストークンで指定した IAM Role の権限を持つ

参考資料

OAuth 2.0 + OpenID Connect をフルスクラッチした人の記事です。とてもわかりやすいので読みましょう。

一番分かりやすい OpenID Connect の説明 - Qiita
はじめに 過去三年間、技術者ではない方々に OpenID Connect(オープンアイディー・コネクト)の説明を繰り返してきました※1。 その結果、OpenID Connect をかなり分かりやすく説明することができるようにな...
一番分かりやすい OAuth の説明 - Qiita
はじめに 過去三年間、技術者ではない方々に OAuth(オーオース)の説明を繰り返してきました※1,※2。その結果、OAuth をかなり分かりやすく説明することができるようになりました。この記事では、その説明手順をご紹介します...
0

コメント