OAuth2 サーバーの認可

· コンポーネント

sgcWebSockets 4.4.5 から、サーバーコンポーネントで OAuth2 プロトコルがサポートされています。

OAuth2 は、リソースオーナーに代わって、または第三者アプリケーション自身の権限で HTTP サービスへの限定的なアクセスを第三者アプリケーションに許可します。OAuth2 により、サービスプロバイダーとコンシューマーアプリケーションは安全な方法で相互にやり取りできます。

TsgcHTTP_OAuth2_Server

このコンポーネントは、サーバーサイドコンポーネントに OAuth2 プロトコルの実装を提供します。

サーバーコンポーネントには Authorization.OAuth.OAuth2 というプロパティがあり、TsgcHTTP_OAuth2_Server のインスタンスを割り当てることができます。認証が有効でかつ OAuth2 プロパティが OAuth2 サーバーコンポーネントに紐付けられている場合、WebSocket および HTTP リクエストの処理にはベアラートークンが必要です。トークンがない場合、接続は自動的に閉じられます。

Sample Example 

TsgcWebSocketHTTPServer を使用したシンプルな OAuth2 サーバーの例を試してみましょう。

まず、ポート 443 でリッスンし、sgc.pem ファイルの自己署名証明書を使用する新しい TsgcWebSocketHTTPServer を作成します。

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'sgc.pem';
oServer.SSLOptions.KeyFile := 'sgc.pem';
oServer.SSLOptions.RootCertFile := 'sgc.pem';
oServer.SSL := True; 

次に、TsgcHTTP_OAuth2_Server の新しいインスタンスを作成し、先ほど作成したサーバーに割り当てます。

以下の値で新しいアプリケーションを登録します。

Name: MyApp

RedirectURI: http://127.0.0.1:8080

ClientId: client-id

ClientSecret: client-secret

OAuth2 := TsgcHTTP_OAuth2_Server.Create(nil);
OAuth2.Apps.AddApp('MyApp', 'http://127.0.0.1:8080', 'client-id', 'client-secret');
oServer.Authentication.Enabled := True;
oServer.Authentication.OAuth.OAuth2 := OAuth2; 

次に、OAuth2 サーバーコンポーネントの OnOAuth2Authentication イベントを処理し、ユーザーのログイン方法を独自に実装します。ここでは "user/secret" のペアを使用してログインを承認します。

procedure OnAuth2Authentication(Connection: TsgcWSConnection; OAuth2: TsgcHTTPOAuth2Request; aUser, aPassword: string; var Authenticated: Boolean);
begin
  if ((aUser = 'user') and (aPassword = 'secret')) then
    Authenticated := True;
end; 

最後にサーバーを起動し、OAuth2 クライアントでログインします。例えば sgcWebSockets ライブラリに含まれている TsgcHTTP_OAuth2_Client を使用できます。

新しいアクセストークンをリクエストすると、新しい Web ブラウザーセッションが表示され、ユーザーは接続を許可してからログインする必要があります。


ログインが成功すると、新しいトークンがクライアントに返されます。以降のすべてのリクエストは HTTP ヘッダーにこのベアラートークンを含める必要があります。