GAMRemote 認証タイプを使用する際には、ID プロバイダーからユーザーに関する追加情報を取得する必要がある場合があります。たとえば、ログインしたユーザーの勤務先や給与を取得します。この情報は ID プロバイダーに属しているため、場合によってはログイン後にクライアントに転送する必要があります。
ユーザーの動的な項目属性 (または拡張項目属性) は、「
GAM リモート認証の ID プロバイダー設定」で説明されているように、"gam_user_additional_data" を使用して管理します。ただし、シナリオによっては、ユーザーの拡張項目属性に加えて、何らかの情報をクライアントに転送する必要がある場合があります。
そのような場合は、
GAM イベントのサブスクリプションを使用して対応します。
ここでは、それについて詳しく説明します。
ID プロバイダーからクライアントに渡す情報は、"servereventsubscription" のような名前のプロシージャーを使用してロードされます。
このプロシージャーは、ID プロバイダーの GAM の
User_GetCustomInfo イベントをサブスクライブするために使用されます。このイベントは、ログインが実行されたときに自動的にトリガーされます。
プロシージャーには特定のインターフェースが必要です:
parm(in:&EventName,in:&JsonIn,out:&JsonOut);
入力値の説明
EventName: GAMEvents ドメインに属します。
JsonIn:
GAMsession オブジェクトと同じ構造を持つ json 文字列です。
JsonOut: 自由形式の json 文字列です。ここで、目的の情報を任意の形式で返します。
GAM の ID プロバイダーにログインしたユーザーの給与とインセンティブの情報を、ID プロバイダーのクライアントアプリケーションが取得する必要がある場合について考えます。
このためには、クライアントの設定で、定義済みのリモート認証タイプに対象を追加します。このケースでは、salary と salary_incentive を '+' で区切って追加します。ほかにも対象 (gam_user_additional_data など) が必要な場合は、さらに '+' で区切って追加します。
最初に、JSON 形式の文字列パラメーターとして渡された GAMSession から、ログイン中の GAMUser を取得できるものと仮定して、目的の情報を取得するために ID プロバイダーで実行するプロシージャーをプログラミングします。
対象も、渡された GAMSession から取得されます。対象を '+' で区切った文字列が該当します。この文字列を解析して、必要な対象を検索します。次の例では、"salary" と "salary incentive" の各対象を検索しています。プロシージャーでこれらの対象を取得できなかった場合、戻り値は空の文字列になります。
コードは次のようになります:
parm(in:&EventName,in:&JsonIn,out:&JsonOut);
&GAMSession.FromJsonString(&jsonIN) //入力パラメーターに基づいて GAMSession を取得する
&UserGUID = &GAMSession.User.GUID //取得済みの GAMSession から GAMUser を取得する
&Scopes = &GAMSession.Scope.SplitRegEx(!"\+") //GAMSession から対象を読み取る
&i = 1
Do while &i <= &Scopes.Count
&ScopeReceived = &Scopes.Item(&i)
If &ScopeReceived = !"salary"
do "GetSalary"
else
if &ScopeReceived = !"salary_incentive"
do "GetSalaryIncentive"
endif
endif
&i = &i + 1
EndDo
&jsonOUT = &SDT_UserCustomInfo.ToJson()
//ユーザーの給与を検索する
sub "GetSalary"
for each Users
where UserGUID = &UserGUID
&SDT_UserCustomInfoItem = new()
&SDT_UserCustomInfoItem.Id =
"salary"
&SDT_UserCustomInfoItem.Value = userSalary.ToString()
&SDT_UserCustomInfo.Add(&SDT_UserCustomInfoItem)
endfor
endsub
sub "GetSalaryIncentive"
for each Users
where UserGUID = &UserGUID
&SDT_UserCustomInfoItem = new()
&SDT_UserCustomInfoItem.Id = "salary_incentive"
&SDT_UserCustomInfoItem.Value = userSalaryIncentive.ToString()
&SDT_UserCustomInfo.Add(&SDT_UserCustomInfoItem)
endfor
endsub
前述のとおり、出力は自由形式です。ここでは、取得する情報を格納する SDT (名前は UserCustomInfoItem) を次のように定義しています。
この例では、特定のユーザーについて次のような文字列が返されます: [ {"Value":"1000000","Id":"salary"},{"Value":"1000","Id":"salary_incentive"} ]
クライアントでは、ログインが実行されたときに自動的にトリガーされる User_SaveCustomInfo イベントをサブスクライブします。この例では、"clienteventsubscription" というプロシージャーを使用しています。
該当するイベントのサブスクリプションに使用するプロシージャーには、ID プロバイダーから返された情報 (この例では、給与とインセンティブ) を使用して実行するすべての手順をプログラミングします。
このプロシージャーのインターフェースは常に次のようになります:
Parm(in:&EventName, in:&jsonIN, out:&jsonout);
入力値の説明
EventName: GAMEvents ドメインに属します。
JsonIn: 自由形式の json 文字列です。この文字列を使用して、ID プロバイダーからクライアントに情報が渡されます。
JsonOut: 自由形式の json 文字列です。エラー処理に使用できます。
コードの例を次に示します:
&SDT_UserCustomInfo.FromJson(&JsonIn) //SDT_UserCustomInfo は、UserCustomInfoItem SDT に基づく for &SDT_UserCustomInfoItem in &SDT_UserCustomInfo //データを保存する: &SDT_UserCustomInfoItem.id
//データを保存する: &SDT_UserCustomInfoItem .value endfor
GAM イベントのサブスクリプションを使用すること、クライアントの設定で追加の対象を適切に指定することが重要です。