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

Newer Version Available

This content describes an older version of this product. View Latest

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)

指定のユーザの情報を更新します。ユーザが以前この認証プロバイダを使用してログインしたことがあり、再度ログインする場合、またはアプリケーションが [既存ユーザをリンクする URL] を使用している場合、このメソッドがコールされます。この URL は、認証プロバイダを定義すると生成されます。

署名

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 プロパティについての詳細は、UserData クラスを参照してください。

その他の 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 メソッドについての詳細は、AuthToken クラスを参照してください。

Auth.RegistrationHandler の実装例

この例では、認証プロバイダが提供するデータに基づいて標準ユーザを作成および更新する Auth.RegistrationHandler インターフェースを実装します。ここでは、例を単純化するためにエラーチェックを省略しています。

1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17global class StandardUserRegistrationHandler implements Auth.RegistrationHandler{
18global User createUser(Id portalId, Auth.UserData data){
19    User u = new User();
20    Profile p = [SELECT Id FROM profile WHERE name='Standard User'];
21    u.username = data.username + '@salesforce.com';
22    u.email = data.email;
23    u.lastName = data.lastName;
24    u.firstName = data.firstName;
25    String alias = data.username;
26    if(alias.length() > 8) {
27        alias = alias.substring(0, 8);
28    }
29    u.alias = alias;
30    u.languagelocalekey = data.attributeMap.get('language');
31    u.localesidkey = data.locale;
32    u.emailEncodingKey = 'UTF-8';
33    u.timeZoneSidKey = 'America/Los_Angeles';
34    u.profileId = p.Id;
35    return u;
36}
37
38global void updateUser(Id userId, Id portalId, Auth.UserData data){
39    User u = new User(id=userId);
40    u.username = data.username + '@salesforce.com';
41    u.email = data.email;
42    u.lastName = data.lastName;
43    u.firstName = data.firstName;
44    String alias = data.username;
45    if(alias.length() > 8) {
46        alias = alias.substring(0, 8);
47    }
48    u.alias = alias;
49    u.languagelocalekey = data.attributeMap.get('language');
50    u.localesidkey = data.locale;
51    update(u);
52}
53}

次の例では、上記のコードをテストします。

1swfobject.registerObject("clippy.codeblock-2", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17@isTest
18private class StandardUserRegistrationHandlerTest {
19static testMethod void testCreateAndUpdateUser() {
20    StandardUserRegistrationHandler handler = new StandardUserRegistrationHandler();
21    Auth.UserData sampleData = new Auth.UserData('testId', 'testFirst', 'testLast',
22        'testFirst testLast', 'testuser@example.org', null, 'testuserlong', 'en_US', 'facebook',
23        null, new Map<String, String>{'language' => 'en_US'});
24    User u = handler.createUser(null, sampleData);
25    System.assertEquals('testuserlong@salesforce.com', u.userName);
26    System.assertEquals('testuser@example.org', u.email);
27    System.assertEquals('testLast', u.lastName);
28    System.assertEquals('testFirst', u.firstName);
29    System.assertEquals('testuser', u.alias);
30    insert(u);
31    String uid = u.id;
32    
33    sampleData = new Auth.UserData('testNewId', 'testNewFirst', 'testNewLast',
34        'testNewFirst testNewLast', 'testnewuser@example.org', null, 'testnewuserlong', 'en_US', 'facebook',
35        null, new Map<String, String>{});
36    handler.updateUser(uid, null, sampleData);
37    
38    User updatedUser = [SELECT userName, email, firstName, lastName, alias FROM user WHERE id=:uid];
39    System.assertEquals('testnewuserlong@salesforce.com', updatedUser.userName);
40    System.assertEquals('testnewuser@example.org', updatedUser.email);
41    System.assertEquals('testNewLast', updatedUser.lastName);
42    System.assertEquals('testNewFirst', updatedUser.firstName);
43    System.assertEquals('testnewu', updatedUser.alias);
44}
45}