この機能の目的は、複数の分散クライアントアプリケーション間に認証/承認を実装し、その処理を一元化することです。
セキュリティ トークン サービス (STS) 標準を使用する典型的なシナリオでは、クライアントアプリケーション (A) から別のアプリケーション (B) のサービスを実行する必要がある場合などに、アプリケーション A からアプリケーション B へのアクセスがリクエストされます。アプリケーション A はセキュリティ トークン サービスにリダイレクトされ、このサービスにより、クライアントの認証とセキュリティトークンの付与が行われます。
その後、アプリケーション B によって提供されているリソースへのアクセスを得るために、クライアント A からこのアプリケーションにトークンが提示されます。このトークンは STS サーバーに照らして検証され、A に該当するリソースへのアクセス許可が与えられているかどうかが確認されます。問題なければ、A からリクエストされたサービスが実行されます。
使用例の 1 つとして AGESIC PDI が挙げられます。
このソリューションは OAuth プロトコルに基づいています。OAuth プロトコル用に実装した STS 標準を使用して、GAM サーバー ID プロバイダーとクライアントアプリケーションが対話するようにしているため、GAM を使用していない (つまり、GeneXus を使用していない) クライアントアプリケーションでは、STS ID プロバイダーとして GAM サービスを使用することが求められます。
GAM を使用して STS を設定する方法については、「セキュリティ トークン サービスを使用するように GAM を設定する方法」を参照してください。
このソリューションのアーキテクチャを理解するには、次の図を参照してください:
AppA から AppB のリソースにアクセスする必要があるものとします。ここで、GAM を使用する STS メカニズムの個々のステップについて説明します。一部のコンポーネントについては、(GAM を使用することなく) 手動で実装する必要がある場合があるため、HTTP リクエストで使用される HTTP ヘッダーの詳細とその他の詳細を具体的に取り上げます。
AppA から STS に対してアクセストークンがリクエストされます。このステップは GAM によって自動的に行われます。呼び出されるサービスは RequestTokenService です。
POST {ServerURL}/oauth/RequestTokenService HTTP/1.1
ヘッダー:
Content-Type: application/x-www-form-urlencoded
Authorization: Basic {ClientCredentials}
本文:
grant_type=client_credentials
scope={Scopes}
repository={RepositoryGUID}
入力値の説明
- {ServerURL}: 認証サービス URL (STS サーバー) です。
- {ClientCredentials}: STS サーバー上のアプリケーションの ClientID:UserPassword 文字列です。これは base64 で表されます。
- {Scopes}: 認証リクエストの適用範囲です。リクエストの対象となるリソースの範囲をプラス記号 (+) で区切って指定したリストです。トークンは複数のアプリケーションへのアクセスのためにリクエストされることもあるため、各アクセス許可は AppName.Permission 形式にする必要があります。AppName は、STS ID プロバイダーサーバー上のアプリケーションの名前に対応します。
- {RepositoryGUID}: サーバーにおけるリポジトリの GUID です。これはオプションです。トークンサーバーでマルチテナント GAM が使用されている場合にのみ必要です。
資格情報とすべての適用範囲が正しければ、次の応答が返されます。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token": "{Access Token}",
"token_type": "Bearer",
"expires_in": {Lifetime In Seconds},
"scope": "{Scopes}"
}
入力値の説明
- {Access Token}: リクエストに対して発行されたアクセストークンです。
- {Lifetime In Seconds}: トークンの有効期間 (秒) です。
- {Scopes}: アクセストークンに事実上付与された適用範囲です。
エラーが返された場合は、次のようになります:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"{detail}"
}
{detail} の内容は次のとおりです。
- {invalid_request}: リクエストにおいて、一部の必須パラメーターが欠落しているか、同じパラメーターが複数回使用されているか、所定の動詞以外が使用されているか、何らかの形式エラーがあるかのいずれかです。
- {invalid_client}: クライアント認証でエラーが発生しました。
- {unsupported_grant_type}: リクエストの認可方法が予期されたものと異なります。
- {unauthorized_client}: クライアントに指定の適用範囲に対する権限が与えられません。
AppA により、AppB のサービスを利用するために必要なトークンを使用して、該当するサービスが呼び出されます。
POST {ServerURL}/rest/{ServiceName} HTTP/1.1
ヘッダー:
Content-Type: application/x-www-form-urlencoded
GeneXus-Agent: STSOAuth Application
Authorization: {AccessToken}
本文:
client_id={ClientID}
repository={RepositoryGUID}
入力値の説明:
- {ServerURL}: AppB の URL です。
- {ServiceName}: 利用するサービスの名前です。
- {AccessToken}: STS サーバーから取得されたトークンです (ステップ 2)。
- {ClientID}: AppB におけるクライアントアプリケーションの ID です。
- {RepositoryGUID}: AppB におけるリポジトリの GUID です。これはオプションです。AppB でマルチテナント GAM が使用されている場合にのみ必要です。
AppB の REST サービスで POST を受信した時点で、受信したクライアント ID が GAM によって自動的に検証されます。それがローカル GAM に存在するかどうか、また STS が有効になっているかどうかが確認されます。
問題なければ、アクセストークンが検証されます。そのために、STS サーバーに対して HTTP POST が実行されます。
POST {ServerURL}/oauth/QueryAccessToken HTTP/1.1
ヘッダー:
Content-Type: application/x-www-form-urlencoded
OAUTH-TOKEN: {AccessToken}
本文:
grant_type= authorization_code
入力値の説明:
- {ServerURL}: STS サーバーの URL です。
- {AccessToken}: ヘッダーで受信したトークンです。
トークンが正しく、まだ有効であれば、次の応答が返されます:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"client_id": "{ClientID}",
"scope": "{Scopes}"
}
入力値の説明:
- {ClientID}: トークンをリクエストしたクライアントアプリケーションの ID です。
- {Scopes}: アクセストークンに事実上付与された適用範囲です。
エラーが返された場合は、次のようになります:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"error":"{Detalle}"
}
AppB リソースにより AppA に応答が返されます。
注:
AppB では、GAM により、該当するリモートトークンに対するリクエストがローカルデータベース内のセッション GAM テーブルに登録されます。
また、GeneXus ユーザーが GAMSession.Get メソッドを使用して GAMSession にアクセスできるように、ローカルトークンが生成され、受信したリモートトークンに関連付けた状態で保持されます。したがって、GeneXus ユーザーは、追加の検証が必要な場合にサービスの現在の利用者を特定できます。
STS を使用するように GAM を設定する方法については、「セキュリティ トークン サービスを使用するように GAM を設定する方法」を参照してください。
実装の詳細
設定ファイル (web.xml および web.config) では、フレンドリー URL を使用して、サービス RequestTokenService および QueryAccessToken を呼び出すことができます。
- /oauth/RequestTokenService --> artech.security.api.agamstsauthappgetacccesstoken を呼び出します。
- /oauth/QueryAccessToken --> artech.security.api.agamstsauthappvalidacccesstoken を呼び出します。
使用可能バージョン
GeneXus 16 Upgrade 4 以降で利用できます。
|