Winter ‘16でカスタム接続アプリケーションハンドラなるものがリリースされたので、こちらの機能を試してみました。
この機能は接続アプリケーション(OAuth, SAML)の振る舞いを変更することができます。 具体的には以下の振る舞いを変更することができます。
- 「管理者が承認したユーザは事前承認済み」のポリシーにおけるauthorize処理
- refresh tokenによるrefresh処理
- userinfoやSAMLアサーションに利用されるカスタム属性の動的生成
authorizeの振る舞い変更
authorizeメソッドではOAuthのポリシーが「管理者が承認したユーザは事前承認済み」となっている接続アプリケーションに対してauthorizeの判定を変更することが出来ます。これまでは「管理者が承認したユーザは事前承認済み」の接続アプリケーションでは基本的にはプロファイルや権限セットで許可されたユーザのみ、OAuthによる認可処理を通ることができました。カスタム接続アプリケーションハンドラでは、この処理をApexを使ってより動的に判定を行うことができます。global override boolean authorize(Id userId, Id connectedAppId, boolean isAdminApproved) {
User u = [SELECT id, IsAllow__c FROM User WHERE id = :userId];
return u.IsAllow__c;
}
return値にtrueを返せば認可成功、falseで認可失敗となります。ユーザオブジェクトだけではなく、任意のオブジェクトの値を利用して認可処理判定することも可能です。
ちなみに当メソッド内でDMLを発行するとエラーにはならず、デバッグ上も正常終了したかのように見えますが、何も起こりません。
refreshの振る舞い変更
refreshの振る舞いの変更できる…らしいです。色々試してみましたが、現時点(2015/11/28)では、DMLも発行できないし、メール送信もエラーにはならないものの何も動かないし、refresh内で何をすべきなのかが不明です。authorizeのように判定結果をbooleanで返せるのであれば、authorizeのように利用するのだと思いますが、戻り値voidなんですよね…。サンプルではflowを動かしていますが、このflow内で何をやっているのかが謎です。flow内でのDML発行もやはりエラーになります。ちなみにExceptionを投げてもエラーにはなりませんでした(デバッグでthrowしたログは残るもの、ユーザ側では正常に取得できる)
カスタム属性の動的生成
customAttributesメソッドでは適切なマップ値を返すことでuserinfoやSAMLアサーションに利用されるカスタム属性を動的に生成することが出来ます。以下のコードだとfoo, hoge属性がcustom_attributesとして返されることになります。global override Map<String,String> customAttributes(Id userId, Map<String,String> formulaDefinedAttributes) {
formulaDefinedAttributes.put('hoge', 'fuga');
formulaDefinedAttributes.put('foo', [SELECT Name FROM Account LIMIT 1].Name);
return formulaDefinedAttributes;
}
今までもカスタム属性をUI上から定義できましたが、属性のキーが固定で、値も特定のオブジェクトや設定値しか利用できませんでした。 カスタム接続アプリケーションハンドラを利用すれば、属性のキー自体も動的に出来ますし、値も任意のオブジェクトに対してクエリを書けた結果を入れられるので、比較的柔軟に値を設定できます。
こちらもauthorizeと同様にDMLを発行しても意味がありません。
userinfoエンドポイントを叩いた時のレスポンスはこんな感じになります。
{
"sub": "https://login.salesforce.com/id/00D***************/005***************",
...
"is_app_installed": true,
"custom_attributes": {
"foo": "bar",
"hoge": "fuga"
}
}