2013-12-31

salesforceでfacebook, google, salesforceを認証プロバイダにしてSSOしてみる。

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

 

facebook

1. facebookアプリを登録
  1. セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成

  2.  2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定

([Facebookでログインが可能なウェブサイト]の[サイトURL]に設定する。)

 

以下、設定例

facebook

facebook-app

 

google

1. Google Developers ConsoleにアクセスしてProjectを作成し、Google+APIを有効化
  1. セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成

  2. 2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定

(APIs & auth > CredentialsのOAuthセクションでRedirect URIsを設定)

 

以下、設定例

google

途切れているユーザ情報エンドポイントURLはhttps://www.googleapis.com/plus/v1/people/me/openIdConnect です。

google-project

 

Salesforce

1. 別組織のSalesforceの作成>アプリケーションにアクセスして、接続アプリケーション(OAuth)を作成
  1. セキュリティのコントロール>認証プロバイダ で新規認証プロバイダを作成

  2. 2でコールバックURLが自動生成されるので、1のアプリにコールバックURLを設定

 

以下、設定例

salesforce

salesforce-app

 

 

補足

・基本的には各サービスの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', 'プロバイダタイプ名')

で取ってこれる。

このエントリーをはてなブックマークに追加