ConfirmUserRegistrationHandler インターフェース
名前空間
使用方法
サードパーティ ID プロバイダーを使用するように SSO を設定するときは、Auth.RegistrationHandler インターフェースを使用して、登録ハンドラーを実装するクラスを作成します。このクラスは、ユーザーの作成および更新プロセスを管理します。アップグレードプロセスでユーザー情報の確認が必要な高度な使用事例では、クラスに Auth.ConfirmUserRegistrationHandler インターフェースを実装します。このインターフェースは、Auth.RegistrationHandler に加えて実装する必要があります。
Auth.ConfirmUserRegistrationHandler インターフェースを使用すると、Salesforce とサードパーティの間でユーザーが正しく対応付けられていることを確認できます。認証プロバイダーを使用してすでにログインしているユーザーが再ログインする場合、受信ユーザーデータがユーザーのサードパーティ識別子と一致していることを確認できます。一致していない場合、どのユーザーがログインすることになっているかを識別できます。
Auth.ConfirmUserRegistrationHandler インターフェースを使用して、複数のレコードを持つユーザーのコンテキストを切り替えることもできます。たとえば、あるユーザーが管理ユーザーと標準ユーザーの 2 つのレコードを持っているとします。ユーザーがログインするとき、サードパーティ ID プロバイダーは、ログインに使用されたアカウントを確認し、UserInfo エンドポイント経由で Salesforce に応答を送信します。この情報を使用して、ユーザーを管理ユーザーと標準ユーザーのいずれでログインさせるかを決定できます。
ConfirmUserRegistrationHandler のメソッド
ConfirmUserRegistrationHandler のメソッドは次のとおりです。
confirmUser(userId, tpalId, portalId, userdata)
署名
public Id confirmUser(Id userId, Id tpalId, Id portalId, Auth.UserData userdata)
パラメーター
- userId
- 型: Id
- サードパーティアカウントリンクを介してサードパーティ識別子に対応付けられているユーザーの ID。
- tpalId
- 型: Id
- サードパーティ識別子に対応するサードパーティアカウントリンク。
- portalId
- 型: Id
- ユーザーがログインしているポータル ID。ポータルが設定されていない場合は、この値を null にします。
- userData
- 型: Auth.UserData
- サードパーティ ID プロバイダーからのユーザー情報を指定します。
ConfirmUserRegistrationHandler の実装例
この例では、ユーザー更新プロセスで Auth.ConfirmUserRegistrationHandler インターフェースを実装し、メールアドレスと姓に基づいて正しいユーザーがログインしていることを確認します。
1global class StandardUserRegistrationHandler implements Auth.RegistrationHandler, Auth.ConfirmUserRegistrationHandler {
2 global User createUser(Id portalId, Auth.UserData data){
3 User u = new User();
4 Profile p = [SELECT Id FROM profile WHERE name='Standard User'];
5 u.username = data.username + '@salesforce.com';
6 u.email = data.email;
7 u.lastName = data.lastName;
8 u.firstName = data.firstName;
9 String alias = data.username;
10 if(alias.length() > 8) {
11 alias = alias.substring(0, 8);
12 }
13 u.alias = alias;
14 u.languagelocalekey = data.attributeMap.get('language');
15 u.localesidkey = data.locale;
16 u.emailEncodingKey = 'UTF-8';
17 u.timeZoneSidKey = 'America/Los_Angeles';
18 u.profileId = p.Id;
19 return u;
20 }
21
22 global void updateUser(Id userId, Id portalId, Auth.UserData data) {
23 User u = new User(id=userId);
24 u.username = data.username + '@salesforce.com';
25 u.email = data.email;
26 u.lastName = data.lastName;
27 u.firstName = data.firstName;
28 String alias = data.username;
29 if(alias.length() > 8) {
30 alias = alias.substring(0, 8);
31 }
32 u.alias = alias;
33 u.languagelocalekey = data.attributeMap.get('language');
34 u.localesidkey = data.locale;
35 update(u);
36 }
37
38 global Id confirmUser(Id userId, Id tpalId, Id portalId, Auth.UserData data) {
39 if (data.email.contains(data.lastName)) { // looks genuine
40 return userId;
41 } else { // find the right user
42 User confirmedUser = [SELECT id FROM user WHERE email=:data.email];
43 return confirmedUser.Id;
44 }
45 }
46}次の例では、実装をテストしています。
1@isTest
2public class StandardUserRegistrationHandlerTest {
3 static testMethod void testConfirmUser() {
4 StandardUserRegistrationHandler handler = new StandardUserRegistrationHandler();
5 Auth.UserData sampleData = new Auth.UserData('idA', 'firstName', 'A',
6 'firstName A', 'userA@example.org', null, 'usernameA', 'en_US', 'facebook',
7 null, new Map<String, String>{'language' => 'en_US'});
8 User u = handler.createUser(null, sampleData);
9 insert(u);
10 String uid = u.id;
11
12 sampleData = new Auth.UserData('idB', 'firstName', 'B',
13 'firstName B', 'userA@example.org', null, 'usernameB', 'en_US', 'facebook',
14 null, new Map<String, String>{}); // note that user B is using userA's email
15 Id confirmedUserId = handler.confirmUser(uid, '060xx0000004Eh6', null, sampleData);
16 System.assertEquals(uid, confirmedUserId); // we should see userA's id
17 }
18}