コンテンツにスキップ

認可@認証/認可

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. SSO:Single Sign On

SSOとは

Webサイトごとに認証フェーズと認可フェーズを行うのではなく、認証フェーズは他のWebサイトに統一的に委譲し、認可フェーズだけはWebサイトごとに実施する。

セキュリティ強度の向上というよりは、利便性の向上のために使用することが多い。

そのため別途、SSOと二要素認証などを組み合わせて、セキュリティ強度を向上させた方が良い。

二要素認証とSSOを組み合わせる場合、認証フェーズの委譲先で二要素認証を追加することになる (例:GitHubアカウントを用いたSSO時に、ワンタイムパスワードの入力も要求される) 。


SSOの仕組み

sso

(1)

APIクライアント (あるいは認証プロキシ) が、HTTPリクエストにIDとパスワードを設定し、IPプロバイダーにリクエストを送信する。

(2)

IDプロバイダーが、クライアントを『認証』し、クライアント側にトークン (例:アクセストークン、IDトークンなど) を発行する。

(3)

クライアントが、HTTPリクエストのヘッダーにトークンを設定してリクエストする。

(4)

トークンが『認可』されれば、API側がデータをレスポンスする。

SSOには、認証フェーズと認可フェーズがあり、3個の役割が定義されている。

役割 説明
APIクライアント APIに対して、リクエストを送信したいサーバーのこと。 Ouath認証の仕組みにおけるクライアント。
IDプロバイダー トークン (例:アクセストークン、IDトークンなど) を作成するサーバーのこと。 Ouath認証の仕組みにおける認可サーバー。
APIサーバー クライアントに対して、リソースのレスポンスを返信するサーバーのこと。 Ouath認証の仕組みにおけるリソースサーバー。


APIクライアント

▼ IDプロバイダーとの通信

APIクライアントは、IDプロバイダーに認証情報 (例:クライアントID、クライアントシークレットなど) を送信する必要がある。

これらの認証情報はIDプロバイダーで事前に発行しておく。

ただし、APIクライアントからIDプロバイダーにこれらを直接するする代わりに、OAuthプロキシ (例:OAuth2 Proxyなど) やSSOプロキシ(例:Dexなど) に送信しても良い。

その場合、APIクライアントが認証プロキシにリクエストを送信した後、認証プロキシはIDプロバイダーからトークン (例:アクセストークン、IDトークンなど) を取得し、APIクライアントを認証する。

▼ ステータスコードの選定

認証フェーズにて、誤ったトークン (例:アクセストークン、IDトークンなど) が発行されたことを表現したい場合、401ステータスを使用する。

認可フェーズにて、正しいトークンが発行されたが、トークンの所有者に参照権限がないことを表現したい場合、403ステータスを使用する。


IDプロバイダー

▼ IDプロバイダーの種類

  • Auth0
  • Facebook
  • Keycloak
  • AWS Cognito
  • Google Cloud Auth

auth0_sso