最近のアクセス:
GAM - イベントのサブスクリプション

GAM イベントのサブスクリプションの目的は、GAM イベントの実行時に追加 (外部) コードを自動的にトリガーすることです。つまり、GAM イベントを実行した後 (GAM ユーザーの作成など) に、カスタムイベントを自動的に実行できるようにします。
Users テーブルがあり、ユーザー情報が GAM の Users テーブルと重複している例について考えます。
Users テーブルは最新の状態に保つ必要があります。つまり、GAM ユーザーが更新 (作成または削除) された場合は、それに合わせて Users テーブルを更新する必要があります。
このような場合、次の疑似コードを使用します: 
&GAMUser.Save()
//Users テーブルに必要な変更を加えるプロシージャーを呼び出す。
GAM ユーザーを更新するすべての部分にこのコードを検討しなくてもよいように、GAM ユーザーの更新直後にこのコードを自動的にトリガーできます。
実行を宣言したコードを自動的にトリガーするイベントは、GAM ユーザーの挿入、更新、削除と考えます。
言い換えると、いくつかのイベントにサブスクライブし、これらのイベントの実行時に (外部) コードをトリガーできるようにします。

サブスクライブできるイベント:

  • User_Insert: GAM ユーザーの挿入
  • User_Update: GAM ユーザーの更新
  • User_Delete: GAM ユーザーの削除
  • User_UpdateRoles: ユーザーリストのロールの変更
  • User_GetCustomInfo: このイベントを使用すると、ID プロバイダーがクライアントに送信する情報をカスタマイズすることができ、ユーザーが認証されるとき (SSO Web) またはトークン (OAuth 2.0) を要求したときに実行されます。このため、プロシージャーの出力は JSON を返す必要があります。共有する情報の構造を持つ SDT を使用することが推奨されます。 
  • User_SaveCustomInfo: このイベントは、GAM リモートログインまたはリモート REST 認証タイプ (OAuth 2.0) のログインが正常に終了したときにクライアントで実行されます。
  • Role_Insert: ロールの挿入
  • Role_Update: ロールの更新
  • Role_Delete: ロールの削除
  • Repository_Login: GAM ユーザーのログイン (任意の認証タイプをサポート)
  • Repository_LoginFailed: ユーザーログインの失敗 (GAM エラー 11 または GAM エラー 18)
  • Repository_Logout: GAM のログアウト
  • Application_CheckPermissionFail: アクセス許可の検証の失敗
  • User_OneTimePasswordValidUser。OTP コードを要求したユーザーに使用を許可するかどうかを確認します。
  • User_OneTimePasswordGenerateCode。OTP コードを生成するための開発者イベントです。
  • User_OneTimePasswordSendCode。OTP コードを送信するための開発者イベントです。
  • User_OneTimePasswordValidateCode。OTP コードを検証するための開発者イベントです。

イベントをサブスクライブするプログラムの要件

イベントをサブスクライブするには、イベントの実行時にトリガーされるプログラムを設定します。設定は GAM API(1) または Web Backoffice(2) を使用して行うことができます。詳細については後述します。
GAM イベントを監視するプログラムは、GeneXus で開発されていても、開発されていなくてもかまいませんが、いくつかの要件を満たしている必要があります。
まず、プログラムの署名が次のようになっている必要があります:
(in Character &EventName, in Character &jsonIn, out Character &jsonOut)
入力値の説明: 
  • &EventName: GAMEvents ドメインに属します。
  • &jsonIN: JSON 文字列で、その書式はプログラムがサブスクライブする GAM イベントによって異なります (詳細は下表を参照)。
  • &jsonOUTGAM トレース (有効になっている場合) への情報の出力に使用する JSON 文字列です。
[ Main program ] プロパティTrue になっている必要があります。
次に、&jsonIN の書式を検討します:
イベント パラメーターを受け取る GAM オブジェクト
User_Insert GAMUser (jsonIN 書式は GAMUser オブジェクトから派生)
User_Update GAMUser
User_Delete GAMUser
User_UpdateRoles ロールが変更されたユーザーのリストを表す GAMGUID コレクション
User_GetCustomInfo  GAMSession
User_SaveCustomInfo (自由形式)
Role_Insert GAMRole (jsonIN の書式は GAMRole オブジェクトから派生)
Role_Update GAMRole
Role_Delete GAMRole
Repository_Login GAMSession (jsonIN の書式は GAMSession オブジェクトから派生)
Repository_Logout GAMSession
Repository_LoginFailed GAMSession
Application_CheckPermissionFail GAMSessionLogCheckPermissionFail
User_OneTimePasswordValidUser GAMOTPEventSubscription
User_OneTimePasswordGenerateCode GAMOTPEventSubscription
User_OneTimePasswordSendCode GAMOTPEventSubscription
User_OneTimePasswordValidateCode GAMOTPEventSubscription

例 I

次の例では、User_Insert イベントをサブスクライブしています。
Web Backoffice(2) で、 [ 設定 ] > [ イベントのサブスクリプション ] の順に選択し、次の図に示すようにイベントを定義します。

.NET の設定

イメージ:54312.png
 
Java の設定 (この例では、Java のパッケージ名 = com.gameventssubscription)
イメージ:54313.png
ステータス [ サブスクライブ済み ] 、 [ サブスクライブ解除済み ] のいずれかです。イベント実行時にプロシージャーをトリガーするためには、「サブスクライブ済み」にしておく必要があります。
イベント 任意のイベントを選択できるコンボボックスです。
イメージ:37139.png
ファイル名 イベント実行を監視する .dll ファイルまたは .class ファイルの名前です。
クラス名 パッケージが含まれるプログラムの名前です。
メソッドの名前 GeneXus におけるプログラムのメソッドは常に「execute」です。
notifyuserinsert プロシージャーのコードは以下のとおりです:
Rules: Parm(in:&EventName, in:&jsonIN, out:&jsonOUT);
&GAMUser.FromJsonString(&jsonIN)

&MyUser.Load(&GAMUser.GUID)  //&Myuser は BC に基づく
If &MyUser.Fail()
    &MyUser = new()    
Endif
&MyUser.MyUserGUID    =&GAMUser.GUID
&MyUser.MyUserEmail    = &GAMUser.EMail
&MyUser.MyUserName    = &GAMUser.FirstName.Trim() +" "+ &GAMUser.LastName.Trim()
&MyUser.Save()
If &MyUser.Success()
    //Ok
Else
    //エラーに関する情報を指定して &jsonOUT パラメーターをロード。
Endif

例 II

User_GetCustomInfo イベントや User_SaveCustomInfo イベントの例については、「GAM の ID プロバイダーからユーザーの追加情報を取得する方法」を参照してください。

例 III

プロシージャーがサブスクライブしたログインイベントがログイン時にトリガーされる場合、ログインがローカルで行われるかどうかにかかわらず、
そのプロシージャーで追加のコントロールを作成し、ログインをキャンセルしてセッションが生成されないようにすることができます。
たとえば、次のコードをログイン時にトリガーします:
&GAMSession.FromJsonString(&JsonIN)
For each
    Where  CustomerGUID = &GAMSession.User.GUID
    Where  CustomerActiveSubscription = True

         //OK
     When none
      &GAMError.Code        = GAMErrorMessages.UserInactive
      &GAMError.Message    = "The user's subscription is not valid."
      &JsonOUT = &GAMError.ToJsonString()
Endfor
JsonOut の形式は GAMError である必要があります。JsonOut が空の場合に限り、ログインはキャンセルされません。
内部では、セッションが生成され、直ちに破棄されます。

(1)   GAM API を使用してイベントをサブスクライブする方法

イベントのサブスクリプションは、次の例に示すように定義できます:
&GAMEventSubscription = new()    // &GAMEventSubscription は GAMEventSubscription データタイプ
&GAMEventSubscription.Description =  "Inspecting the User Login"
&GAMEventSubscription.Event       =  GAMEvents.Repository_Login
&GAMEventSubscription.FileName    = "aNotifyUserLogin.dll"
&GAMEventSubscription.ClassName   = "GeneXus.Programs.anotifyuserlogin"
&GAMEventSubscription.MethodName  =  "execute"
&GAMEventSubscription.Save()
If &GAMEventSubscription.Success()
  Commit
  // サブスクリプションのアクティベーション:
  &isOK = GAMRepository.SubscribeEvent(&GAMEventSubscription.Id, &GAMErrors)
  If &isOK
     Commit
  Endif
Endif
イベント実行時にトリガーするプログラムを複数定義することもできます。
サブスクリプションは、GAMRepository の SubscribeEvent メソッドを使用して有効にする必要があります。

論理トランザクションに関する考慮事項

ケース 1: プログラムが GeneXus で開発されている場合 

イベントをサブスクライブしているプログラムをイベントの同じ LUW (論理作業単位) に含めるためには、イベントをトリガーするコード (&GAMUser.save() または &GAMRole.save()) の後に Commit コマンドを含めます。
これに対して、プログラムを同じ LUW に含めない場合は、プログラムの [ Execute in new LUW ] プロパティを True に設定します。
Repository_Login メソッドと Repository_Logout メソッドでは、コミットが暗示的に実行されるので、明示的な実行は必要ありません。

ケース 2: プログラムが GeneXus で開発されていない場合

同じ LUW 内に含められません。 

 

サブページ
Created: 17/05/30 19:03 by Admin Last update: 24/04/07 19:09 by Admin
カテゴリ
Powered by GXwiki 3.0