コンテンツにスキップ

OAuth@SSO

はじめに

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


01. OAuth

OAuthとは

oauth_architecture

SSOの一種である。

認証/認可フェーズ全体の中で、認可フェーズにOAuthプロトコルを使用したクライアントの照合方法を『OAuth』と呼ぶ。

クライアントアプリで認証フェーズのみでログインし、連携先のアプリには認可フェーズのみでログインする。

OAuthは認可フェーズのみで構成されているため、間違っても『OAuth認証』とは言わない。

認証フェーズと認可フェーズでは、3個の役割が定義されていることを説明したが、OAuthプロトコル2.0では、より具体的に4個の役割が定義されている。

要素 フェーズ 説明 補足
クライアントアプリ 認証 連携元アカウントを提供するアプリのこと。 OAuthの文脈では、ブラウザがクライアントと呼ばれないことに注意する。また、クライアントアプリとリソース間のデータ通信は、ブラウザを介したリダイレクトによって実装することに注意する。
リソースオーナー 認証 クライアントアプリを使用しているユーザーである。
認可サーバー 認可 アクセストークンを発行するサーバーのことoauth)) 認可サーバーがリダイレクト先のクライアントアプリケーションのURLをレスポンスに割り当てられるように、クライアントアプリケーションの開発者がURLを事前登録しておく必要がある。認可サーバーを利用する開発者用に、コンソール画面が用意されていることが多い。
https://qiita.com/TakahikoKawasaki/items/8567c80528da43c7e844
リソースサーバー 認可 連携先アカウントを提供するサーバーのこと。


OAuthの種類

OAuthには、仕組み別に『認可コードフロー』『インプリシットフロー』『リソースオーナー・パスワード・クレデンシャルズフロー』などがある。


02. 認可コードフロー

認可コードフローの仕組み

▼ アーキテクチャ

記入中...

oauth_authorization-code


▼ 全体像

Facebookで認証フェーズのみでログインし、連携先の免許証作成サイトには認可フェーズのみでログインする。

oauth_authorization-code_facebook

▼ ブラウザ ⇄ SSOでログインしたいWebサイト

(1)

ブラウザは、免許証作成サイトにログインしようとする。

免許証作成サイトは、Facebookアカウントを使用するかどうかをレスポンスする。

(2)

ブラウザは、Facebookアカウントを使用することをリクエストする。

免許証作成サイトはFacebookの認可サーバーに認可リクエストを送信する。

GET https://www.facebook.com/auth?<下表で説明>
---
HOST: authorization-server.com # 認可サーバーのホスト
クエリストリングの種類 必須/任意
response_type code 必須
client_id クライアントID 必須
redirect_uri リダイレクトURL 条件により必須
state 任意の文字列 推奨
scope 認可スコープ 任意
code_challenge チャレンジ 任意
code_challege_method メソッド 任意
(3)

ブラウザに認可画面 (Facebookが権限を求めています画面) をレスポンスする。

▼ ブラウザ ⇄ 認証フェーズの委譲先のWebサイト

(4)

ブラウザで、認可画面に情報を入力し、Facebookに送信する。

(5)

Facebookの認可サーバーは、認可コードを発行する。

Locationヘッダーにリダイレクト先のURL (免許証作成サイトURL) とパラメーターを割り当て、認可レスポンスをブラウザに送信する。

リダイレクト先として指定するURLは、『コールバックURL』ともいう。

302 Found
---
Location: https://www.免許証作成サイト.com/callback?code=<認可コード>&state=<任意の文字列>
クエリストリングのキーの種類 必須/任意
code 認可コード 必須
state 任意の文字列 認可リクエストのクエリストリングで、stateキーが使用されていれば必須

▼ ブラウザ ⇄ SSOでログインしたいWebサイト ⇄ 認証フェーズの委譲先のWebサイト

(6)

ブラウザでリダイレクトが発生し、免許証作成サイトに認可コードを送信する。

(7)

免許証作成サイトは、Facebookの認可サーバーに認可コードを送信する。

POST https://www.facebook.com/auth?
---
Host: authorization-server.com # 認可サーバーのホスト
Content-Type: application/x-www-form-urlencoded
---
# ボディ
# 下表で説明
ボディのキーの種類 必須/任意
grant_type authorization_code 必須
code 認可コード 必須
redirect_uri リダイレクトURL 認可リクエストのクエリストリングで、redirect_uriキーが使用されていれば必須
code_verifier ベリファイア 認可リクエストのクエリストリングで、code_verifierキーが使用されていれば必須
client_id クライアントID 条件により必須
client_secret シークレット値 条件により必須
(8)

Facebookの認可サーバーは、アクセストークンを免許証作成サイトに送信する。

(9)

免許証作成サイトはアクセストーンを受信し、Facebookの認可サーバーにアクセストークンを再度送信する。

HTTP/1.1 200 OK
---
# ヘッダー
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
---
# ボディ
{
  "access_token": "<アクセストークン>", # 必須
  "token_type": " <トークンタイプ>", # 必須
  "expires_in": <失効秒数>, # 任意
  "refresh_token": "<リフレッシュトークン>", # 任意
  "scope": "<認可スコープ>", # 要求したスコープ群と差異があれば必須
}
(10)

Facebookは認証を完了させ、Facebookのアカウント情報を送信する。

(11)

免許証作成サイトは認可を実施し、Facebookのアカウント情報の権限に応じた処理をクライアントに提供する。


03. 使用される認証スキーム

OAuthでは、認証スキーマとしてBearer認証が選択されることが多く、AWSやGitHubは、独自の認証スキームを使用している。

注意点として、認可サーバーによって発行されたBearerトークンは、Authorizationヘッダー、リクエストボディ、クエリパラメーターのいずれかに割り当てて送信できる。


04. 付与タイプ

認可サーバーによるOAuthのトークンの付与方法には種類がある。

付与タイプ名 説明 使用例
Authorization Code Grant アプリケーションが他のAPIに接続する場合に使用する。推奨である。
https://oauth.net/2/grant-types/authorization-code/
他のSNSアプリとのアカウント連携
Client Credentials Grant 推奨である。
https://oauth.net/2/grant-types/client-credentials/
Device Code 推奨である。
https://oauth.net/2/grant-types/device-code/
Implicit Grant 非推奨である。
https://oauth.net/2/grant-types/implicit/
Password Grant ユーザー名とパスワードを照合し、トークンを付与する。非推奨である。
https://oauth.net/2/grant-types/password/
https://developer.okta.com/blog/2018/06/29/what-is-the-oauth2-password-grant#the-oauth-20-password-grant
LaravelのPassword Grant Token機能は、Password Grantタイプを使用している。
https://readouble.com/laravel/8.x/ja/passport.html#password-grant-tokens