この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

RegistrationHandler インターフェース

Salesforce では、Salesforce へのシングルサインオンに Facebook©、Janrain© などの認証プロバイダを使用する機能を提供します。

名前空間

Auth

使用方法

シングルサインオンを設定するには、Auth.RegistrationHandler を実装するクラスを作成する必要があります。Auth.RegistrationHandler インターフェースを実装するクラスは、認証プロバイダ定義に [登録ハンドラ] として指定され、Facebook などのサードパーティのサービスから Salesforce ポータルと組織へのシングルサインオンを有効にします。 クラスは、認証プロバイダの情報を使用して、関連付けられた取引先レコードと取引先責任者レコードも含めて、ユーザデータの作成と更新のロジックを必要に応じて実���する必要があります。

RegistrationHandler のメソッド

RegistrationHandler のメソッドは次のとおりです。

createUser(portalId, userData)

指定のポータル ID およびユーザ名、メールアドレスなどのサードパーティのユーザ情報を使用して User オブジェクトを返します。User オブジェクトはサードパーティのユーザ情報に対応し、データベースに挿入されていない新規ユーザまたはデータベース内の既存のユーザを表す可能性があります。

署名

public User createUser(ID portalId, Auth.UserData userData)

パラメータ

portalId
型: ID
userData
型: Auth.UserData

戻り値

型: User

使用方法

このプロバイダにポータルが設定されていない場合は、portalID 値が NULL または空のキーになる場合があります。

updateUser(userId, portalId, userData)

指定のユーザの情報を更新します。ユーザが以前この認証プロバイダを使用してログインしたことがあり、再度ログインする場合、このメソッドがコールされます。

署名

public Void updateUser(ID userId, ID portalId, Auth.UserData userData)

パラメータ

userId
型: ID
portalId
型: ID
userData
型: Auth.UserData

戻り値

型: Void

使用方法

このプロバイダにポータルが設定されていない場合は、portalID 値が NULL または空のキーになる場合があります。

ユーザ情報の保存とアクセストークンの取得

Auth.UserData クラスは、Auth.RegistrationHandler のユーザ情報を保存するために使用されます。サードパーティ認証プロバイダは、ユーザ名、メールアドレス、ロケールなど、ユーザに関する多くのデータを返送できます。頻繁に使用されるデータは、Auth.UserData クラスで共通の形式に変換され、登録ハンドラに送信されます。

登録ハンドラが残りのデータを使用する場合のために、Auth.UserData クラスには attributeMap 変数が用意されています。属性の対応付けは、サードパーティからの全データの未加工値に対する文字列 (Map<String, String>) の対応付けです。対応付けは <String, String> であるため、サードパーティが返す文字列以外の値 (URL の配列や対応付けなど) は、適切な文字列表現に変換されます。対応付けには、サードパーティ認証プロバイダから返されたすべてデータが含まれます。これには、自動的に共通形式に変換されたデータも含まれます。

Auth.UserData のコンストラクタの構文は次のとおりです。
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」を参照してください。

その他の sObject に対する DML オペレーションは、特定の状況で User オブジェクトと同じトランザクションでのみ実行できます。詳細は、「DML 操作で同時に使用できない sObject」を参照してください。

メモ

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 のドキュメントを参照してください。

すべての Janrain のアカウントの種類が accessCredentials を返すとは限りません。情報を受信するのに、アカウントの種類の変更が必要な場合があります。

メモ

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 のエラー例

この例は、Auth.RegistrationHandler インターフェースを実装し、カスタム例外を使用してページ上にユーザへのエラーメッセージを表示する方法を示しています。カスタム例外を使用しない場合は、エラーコードと説明 (設定されている場合) が URL に表示され、エラー説明 (設定されている場合) がこのページに表示されます。

この例では、カスタム例外に限定するために一部のコードが省略されています。

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}