外部 OAuth2 プロバイダーを使用した認可

· コンポーネント

sgcWebSockets 2022.3.0 から、外部の OAuth2 プロバイダーを使用してサーバーが受信するリクエストを認証できます。

OAuth2 Server Provider コンポーネントを使用すると、Azure ADGoogleFacebook などの外部 OAuth2 プロバイダーをサーバーコンポーネント(HTTP サーバーなど)に統合できます。これにより、ユーザーが Azure AD の認証情報でログインし、認証が成功すれば、HTTP サーバーは保護されたリソースへのアクセスを提供できます。

OAuth2 Server Provider フロー

OAuth2 Provider Server コンポーネントを使用すると、外部 OAuth2 プロバイダー(Azure AD・Google など)を使用して認証し、サーバーの保護されたリソースにアクセスできます。例: HTTP サーバーを設定して Azure の認証情報でのログインを許可することができ、ログインが成功した場合、これらのユーザーはサーバーの保護されたリソースへのアクセスが許可されます。

認証プロセスはサーバー側で行われ、OAuth2 トークンはクライアントと共有されません。つまり、ユーザーが Azure を使用してログインした場合、認証が成功すると Azure はユーザープロファイル・メールなどの情報(スコープに応じて)を Azure サーバーに送信するためのアクセストークンを返します。このアクセストークンはクライアントと共有されません(例:Web ブラウザ)。クライアントにアクセストークンを返す代わりに、サーバーはアクセストークンと内部で紐付けられたランダム ID を作成します。クライアント(Web ブラウザ)が OAuth2 サーバーへの呼び出しを行う際には、この公開 ID を使用し、サーバーはこの ID を使用して OAuth2 アクセストークンを取得し HTTP リクエストをプロキシします。

以下は OAuth2 認証の動作例です。この例では次のリンクで説明されている Azure AD 設定を使用します:OAuth2 Provider Azure AD

サーバーの起動

サーバーは localhost のポート 443 でリッスンを開始します。sgcWebSockets HTTP サーバーは OAuth2 Server Provider コンポーネントにリンクされ、Authentication プロパティが有効化されています。

サーバーが起動する前に、以下のメソッド呼び出しで Azure OAuth2 プロバイダーを登録します。

RegisterProvider(
'azure',
'90945b8d-f6b7-4b97-b2bd-21c3c90b5f3x',
'PN67Q~5m06c-~X_GMyMf9zMntmm5l2dt~3jVq',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token',
'user.read',
'/login',
'https://localhost/callback'
);

ユーザーログイン

ユーザーは新しい Web ブラウザを開き、'/login' エンドポイントにアクセスします。

サーバーは '/login' エンドポイントが Azure プロバイダーを使用したログインに使用されていることを検出し、以下にリダイレクトします。

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize

OAuth2 認証フローが開始されます。

OAuth2 認証

ユーザーは OAuth2 サーバー認証エンドポイントにリダイレクトされ、認証情報でログインして OAuth2 アプリケーションの条件に同意する必要があります。

認証が成功した場合、Azure AD は以下の URL にコードを送信します。

https://localhost/callback

OAuth2 コードの検証

サーバーは Azure からコードを受信し、このトークンが正しいことを確認するために Azure への内部接続(サーバー間)を行います(サーバーへのハッキング試行を防止するため)。

サーバーは以下に接続します。

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token

受信したコードやクライアントシークレットなどのパラメーターを渡し、検証が成功した場合、Azure はプロファイルやメールなどの Azure 保護リソースへのアクセスに使用できるアクセストークンを返します。

アクセストークンの取得成功

サーバーがアクセストークンの取得に成功すると、OnOAuth2ProviderTokenValid イベントが呼び出されます。ここで、パラメータークラス TsgcHTTPOAuth2ProviderToken にアクセスして AccessToken の保存方法(保存する場合)を設定できます。

AccesToken: Azure から返される OAuth2 トークン

ID: Cookie として保存される公開識別子。

このイベントで認証成功後の動作を設定できます。例:ユーザーをプライベート URL にリダイレクトしたい場合は以下を使用します。

Response.Redirect.URL := 'https://localhost/private';

Azure へのリクエスト送信

Cookie として保存された公開 ID を使用して Azure サーバーにリクエストを送信できます。

例:プロファイルデータを読み取りたい場合は以下のメソッドを使用します。

Get('ID', 'https://graph.microsoft.com/v1.0/me');

ここで ID は公開 ID 識別子です。

Windows 向けコンパイル済み OAuth2 Azure AD デモのダウンロード