sgcWebSockets 2022.3.0 から、外部の OAuth2 プロバイダーを使用してサーバーが受信するリクエストを認証できます。
OAuth2 Server Provider コンポーネントを使用すると、Azure AD、Google、Facebook などの外部 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 識別子です。
