RegistrationHandler インターフェース
名前空間
RegistrationHandler のメソッド
RegistrationHandler のメソッドは次のとおりです。
createUser(portalId, userData)
署名
public User createUser(ID portalId, Auth.UserData userData)
パラメータ
- portalId
- 型: ID
- userData
- 型: Auth.UserData
戻り値
型: User
updateUser(userId, portalId, userData)
署名
public Void updateUser(ID userId, ID portalId, Auth.UserData userData)
パラメータ
- userId
- 型: ID
- portalId
- 型: ID
- userData
- 型: Auth.UserData
戻り値
型: Void
ユーザ情報の保存とアクセストークンの取得
Auth.UserData クラスは、Auth.RegistrationHandler のユーザ情報を保存するために使用されます。サードパーティ認証プロバイダは、ユーザ名、メールアドレス、ロケールなど、ユーザに関する多くのデータを返送できます。頻繁に使用されるデータは、Auth.UserData クラスで共通の形式に変換され、登録ハンドラに送信されます。
登録ハンドラが残りのデータを使用する場合のために、Auth.UserData クラスには attributeMap 変数が用意されています。属性の対応付けは、サードパーティからの全データの未加工値に対する文字列 (Map<String, String>) の対応付けです。対応付けは <String, String> であるため、サードパーティが返す文字列以外の値 (URL の配列や対応付けなど) は、適切な文字列表現に変換されます。対応付けには、サードパーティ認証プロバイダから返されたすべてデータが含まれます。これには、自動的に共通形式に変換されたデータも含まれます。
1Auth.UserData(String identifier,
2 String firstName,
3 String lastName,
4 String fullName,
5 String email,
6 String link,
7 String userName,
8 String locale,
9 String provider,
10 String siteLoginUrl,
11 Map<String, String> attributeMap)Auth.UserData プロパティについての詳細は、「Auth.UserData Class」を参照してください。
Janrain 以外のすべての認証プロバイダでは、ユーザがプロバイダを使用して認証されたら、Auth.AuthToken Apex クラスを使用して、そのプロバイダに関連付けられたこのユーザ用のアクセストークンを Apex で取得できます。Auth.AuthToken には、アクセストークンを取得する 2 つのメソッドが含まれています。1 つは単一のアクセストークンを取得する getAccessToken です。ユーザ ID が単一のサードパーティユーザに対応付けられている場合は、このメソッドを使用します。ユーザ ID が複数のサードパーティユーザに対応付けられている場合は、サードパーティユーザごとにアクセストークンの対応付けを返す getAccessTokenMap を使用します。認証プロバイダについての詳細は、Salesforce オンラインヘルプの「外部認証プロバイダ」を参照してください。
認証プロバイダとして Janrain を使用する場合、Janrain accessCredentials 辞書の値を使用してアクセストークンまたは同等の項目を取得する必要があります。Janrain でサポートされている一部のプロバイダのみがアクセストークンを提供し、その他のプロバイダは他の項目を使用します。Janrain accessCredentials の項目は、Auth.UserData クラスの attributeMap 変数で返されます。accessCredentials についての詳細は、Janrain auth_info のドキュメントを参照してください。
Auth.AuthToken メソッドについての詳細は、「Auth.AuthToken Class」を参照してください。
Auth.RegistrationHandler の実装例
この例では、認証プロバイダが提供するデータに基づいて標準ユーザを作成および更新する Auth.RegistrationHandler インターフェースを実装します。ここでは、例を単純化するためにエラーチェックを省略しています。
1global class StandardUserRegistrationHandler implements Auth.RegistrationHandler{
2global 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
22global 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}次の例では、上記のコードをテストします。
1@isTest
2private class StandardUserRegistrationHandlerTest {
3static testMethod void testCreateAndUpdateUser() {
4 StandardUserRegistrationHandler handler = new StandardUserRegistrationHandler();
5 Auth.UserData sampleData = new Auth.UserData('testId', 'testFirst', 'testLast',
6 'testFirst testLast', 'testuser@example.org', null, 'testuserlong', 'en_US', 'facebook',
7 null, new Map<String, String>{'language' => 'en_US'});
8 User u = handler.createUser(null, sampleData);
9 System.assertEquals('testuserlong@salesforce.com', u.userName);
10 System.assertEquals('testuser@example.org', u.email);
11 System.assertEquals('testLast', u.lastName);
12 System.assertEquals('testFirst', u.firstName);
13 System.assertEquals('testuser', u.alias);
14 insert(u);
15 String uid = u.id;
16
17 sampleData = new Auth.UserData('testNewId', 'testNewFirst', 'testNewLast',
18 'testNewFirst testNewLast', 'testnewuser@example.org', null, 'testnewuserlong', 'en_US', 'facebook',
19 null, new Map<String, String>{});
20 handler.updateUser(uid, null, sampleData);
21
22 User updatedUser = [SELECT userName, email, firstName, lastName, alias FROM user WHERE id=:uid];
23 System.assertEquals('testnewuserlong@salesforce.com', updatedUser.userName);
24 System.assertEquals('testnewuser@example.org', updatedUser.email);
25 System.assertEquals('testNewLast', updatedUser.lastName);
26 System.assertEquals('testNewFirst', updatedUser.firstName);
27 System.assertEquals('testnewu', updatedUser.alias);
28}
29}Auth.RegistrationHandler のエラー例
この例では、カスタム例外に限定するために一部のコードが省略されています。
1global class RegHandler implements Auth.RegistrationHandler {
2
3 class RegHandlerException extends Exception {}
4
5 global User createUser(Id portalId, Auth.UserData data){
6 List<Profile> profiles = [SELECT Id, Name, UserType FROM Profile WHERE Name = 'Power User'];
7 Profile profile = profiles.isEmpty() ? null : profiles[0];
8 if(profile==null)
9 throw new RegHandlerException('Cannot find the profile. For help, contact your administrator.');
10...
11 }
12
13 global void updateUser(Id userId, Id portalId, Auth.UserData data){
14 User u = new User(id=userId);
15 u.lastName = data.lastName;
16 u.firstName = data.firstName;
17 update(u);
18 }
19}