facebook, google, salesforceを認証プロバイダにしてシングルサインオンが簡単にできるみたいなので試してみた。
(facebookとかにログインすると自動的にsalesforceにログインする的な感じ)
salesforceを認証プロバイダにする場合は別salesforce環境を用意する必要があります。
salesforceを認証プロバイダってなんだそりゃ?って思いましたが
多分、お客さんがSalesforce環境をすでに使っていて
カスタマーコミュニティとかでそのお客さんを管理する場合に利用するものなんだと思います。
以下、参考URL↓
http://www.slideshare.net/DeveloperForceJapan/webinar-13324430
http://tyoshikawa1106.hatenablog.com/entry/2013/06/02/212452
https://help.salesforce.com/HTViewHelpDoc?id=sso_provider_facebook.htm&language=ja
https://developers.google.com/accounts/docs/OpenID?hl=ja
セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成
2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定
([Facebookでログインが可能なウェブサイト]の[サイトURL]に設定する。)
以下、設定例
セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成
2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定
(APIs & auth > CredentialsのOAuthセクションでRedirect URIsを設定)
以下、設定例
途切れているユーザ情報エンドポイントURLはhttps://www.googleapis.com/plus/v1/people/me/openIdConnect です。
Salesforce
1. 別組織のSalesforceの作成>アプリケーションにアクセスして、接続アプリケーション(OAuth)を作成セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成
2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定
以下、設定例
補足
・基本的には各サービスのOAuth, Open IDアプリと認証プロバイダを設定するだけでOK。
・登録ハンドラは既存ユーザをリンクするURLで既存ユーザをリンクしたり(ユーザのupdate)、
シングルサインオン初期化URLで新規ユーザを作成するとき(ユーザのinsert)の処理のハンドラクラスを登録する。
以下、サンプル
global class StandardUserRegistrationHandler implements Auth.RegistrationHandler{
global User createUser(Id portalId, Auth.UserData data){
User u = new User();
Profile p = [SELECT Id FROM profile WHERE name='Platform'];
u.username = data.username + '@salesforce.com';
u.email = data.email;
u.lastName = data.lastName;
u.firstName = data.firstName;
String alias = data.username;
if(alias.length() > 8) {
alias = alias.substring(0, 8);
}
u.alias = alias;
u.languagelocalekey = 'ja';
u.localesidkey = data.locale;
u.emailEncodingKey = 'UTF-8';
u.timeZoneSidKey = 'Asia/Tokyo';
u.profileId = p.Id;
u.UserPermissionsInteractionUser = false;
u.UserPermissionsChatterAnswersUser = false;
u.UserPermissionsKnowledgeUser = false;
u.UserPermissionsMarketingUser = false;
u.UserPermissionsMobileUser = false;
u.UserPermissionsOfflineUser = false;
u.UserPermissionsSFContentUser = false;
u.UserPermissionsSiteforceContributorUser = false;
u.UserPermissionsSiteforcePublisherUser = false;
u.UserPermissionsSupportUser = false;
system.debug(u);
return u;
}
global void updateUser(Id userId, Id portalId, Auth.UserData data){
/*
User u = new User(id=userId);
u.username = data.username + '@salesforce.com';
u.email = data.email;
u.lastName = data.lastName;
u.firstName = data.firstName;
String alias = data.username;
if(alias.length() > 8) {
alias = alias.substring(0, 8);
}
u.alias = alias;
u.languagelocalekey = 'ja';
u.localesidkey = data.locale;
update(u);
*/
}
}
・認証プロバイダを使って既存ユーザとリンクしたりすると、
ユーザの関連リスト「サードパーティ取引先のリンク」に対象認証プロバイダの情報が追加される。
・認証プロバイダを使ってログインすると、ログイン履歴には種別「サードパーティの SSO」が残る。
・apex内でaccess tokenを取得したい場合は
Auth.AuthToken.getAccessToken(‘認証プロバイダID’, ‘プロバイダタイプ名’)
Auth.AuthToken.getAccessTokenMap(‘認証プロバイダID’, ‘プロバイダタイプ名’)
で取ってこれる。