SalesforceにはSalesforceへの認証を任意の認証サーバが行えるようになる代理認証機能があります。

これによって、Salesforceのパスワードではなく独自で認証基盤を運用することが可能になります。

 

ということで、代理認証SSOをやってみます!

今回はJava + tomcat + axisな代理認証SOAPサーバを立ててみます。

 

参考URL:

Web サービスを開発する: 第 1 回 Axis2 を使用して、コード・ファースト手法とコントラクト・ファースト手法で Web サービスを開発する

 

1. tomcat、axis、antのセットアップ

tomcatをインストールしてaxis2をダウンロード。

Binary DistributionとWAR Distributionの両方をダウンロードしてください。

WARの方はzip展開してtomcatのwebappsディレクトリに入れてインストールは完了。

 

Binaryの方はSalesforceのwsdlからjavaに変換するために利用します。

antはaarファイルの作成に利用します。

 

2. wsdlからサーバースタブを作成

Salesforceから代理認証用のwsdlを取得(設定>開発>API)

download-auth-wsdl

 

任意のディレクトリで以下のコマンドを実行。

{AXIS2_HOME}にはBinary Distributionのaxis2のパスを入れてください。

 

これでサーバースタブが作成されます。

 

3. スケルトンクラスにロジックを追加

src\com\sforce\soap\authenticationディレクトリのSforceAuthenticationServiceSkeleton.java内の

ToDo: fill this with…のところにロジックを追加します。

今回はテキトーに認証してみます。

パラメータのAuthenticateEクラスからユーザ名とパスワードとログイン要求元IPアドレスを取得して

認証サーバ側(=tomcat+axis2)で認証処理をしてあげて

OKであればtrue、ダメだったらfalseを返してSFDC側はtrueを返された時に認証するようになります。

 

今回はユーザ名が”hoge@fuga.com”、パスワードが”abcdef”のときのみ認証するようにしてます。

 

4. aarにしてデプロイ

生成したスタブファイル群のルートディレクトリにディレクトリ移動して、以下のantコマンドを実行。

そうするとSforceAuthenticationService.aarが出来るのでaxis2にWebインターフェースからデプロイします。

 

まずは{デプロイするサーバのドメイン}/axis2/にアクセスしてAdministrationのリンクをクリック。

axis2-top

 

adminでログインする。(ユーザ名はadminで初期パスワードはaxis2)

axis2-adminlogin

 

adminトップ画面からUpload Serviceのリンクをクリック。

axis2-admin-top

 

aarファイルをアップロードする。

axis2-upload

 

Available Servicesのリンクをクリックしてサービスが正常にアップロードされたことを確認。

axis2-services

 

これでデプロイは完了。

上記のEPRがSOAPのエンドポイントになります。

 

5. Salesforce側のセットアップ

代理認証はSalesforceにお問い合わせして有効化してもらってください。DeveloperEditionでもやってもらえました。

有効化してもらったら 設定>セキュリティのコントロール>シングルサインオン設定 で以下のように編集します。

sfsetting-auth-proxy

代理ゲートウェイURLはEPRを入力、代理認証コールアウト強制実行はチェックを外してください。

 

あとは代理認証対象のプロファイルを選択してシングルサインオンの有効にチェックをつけます。

sfsetting-proxysso-profile

 

代理認証サーバが落ちているとログイン出来なくなってしまうので

システム管理者にはシングルサインオンの有効にチェックをつけない方が良いみたいです。

 

あとはこのプロファイルのユーザでログインしてみて

Salesforceから発行されたパスワードではなく代理認証サーバのロジックで認証されていればOKです。

 

これだけだと単に代理で認証しているだけなんですが

任意のアプリからSFDCにログインコール(SOAPのログインとかRESTのUsername-Passwordフローとか)

を行って認証自体は任意のアプリと連携された代理認証サーバで認証し、sessionIdをfrontdoor.jspに突っ込めば

代理認証機能でシングルサインオンができそうです。

 

あと、今回はtomcatとかaxis2とか結構大掛かりでしたが、結局SOAPで送られてくるデータって

こんな感じでシンプルなんで適当にパースして返してあげればライトな言語

ライトなWebフレームワークでも事足りそうです。