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)
任意のディレクトリで以下のコマンドを実行。
{AXIS2_HOME}にはBinary Distributionのaxis2のパスを入れてください。
$ {Binary Distributionのaxis2のパス}\bin\wsdl2java.bat \
-uri {wsdlへのパス}/AuthenticateService.wsdl -d adb -s -ss -sd -ssi -o .
これでサーバースタブが作成されます。
3. スケルトンクラスにロジックを追加
src\com\sforce\soap\authenticationディレクトリのSforceAuthenticationServiceSkeleton.java内のToDo: fill this with…のところにロジックを追加します。
今回はテキトーに認証してみます。
/**
* SforceAuthenticationServiceSkeleton.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: 1.6.2 Built on : Apr 17, 2012 (05:33:49 IST)
*/
package com.sforce.soap.authentication;
/**
* SforceAuthenticationServiceSkeleton java skeleton for the axisService
*/
public class SforceAuthenticationServiceSkeleton implements SforceAuthenticationServiceSkeletonInterface{
/**
* Auto generated method signature
* Are the supplied saleforce.com userId and password valid ?
* @param authenticate0
* @return authenticateResult1
*/
public com.sforce.soap.authentication.AuthenticateResultE authenticate(
com.sforce.soap.authentication.AuthenticateE authenticate0
) {
//TODO : fill this with the necessary business logic
AuthenticateResult result = new AuthenticateResult();
Authenticate auth = authenticate0.getAuthenticate();
Boolean isAuth =
auth.getUsername().equals("hoge@fuga.com") &&
auth.getPassword().equals("abcdef");
result.setAuthenticated(isAuth);
AuthenticateResultE resulte = new AuthenticateResultE();
resulte.setAuthenticateResult(result);
return resulte;
}
}
パラメータのAuthenticateEクラスからユーザ名とパスワードとログイン要求元IPアドレスを取得して
認証サーバ側(=tomcat+axis2)で認証処理をしてあげて
OKであればtrue、ダメだったらfalseを返してSFDC側はtrueを返された時に認証するようになります。
今回はユーザ名が”hoge@fuga.com”、パスワードが”abcdef”のときのみ認証するようにしてます。
4. aarにしてデプロイ
生成したスタブファイル群のルートディレクトリにディレクトリ移動して、以下のantコマンドを実行。$ ant jar.server
そうするとSforceAuthenticationService.aarが出来るのでaxis2にWebインターフェースからデプロイします。
まずは{デプロイするサーバのドメイン}/axis2/にアクセスしてAdministrationのリンクをクリック。
adminでログインする。(ユーザ名はadminで初期パスワードはaxis2)
adminトップ画面からUpload Serviceのリンクをクリック。
aarファイルをアップロードする。
Available Servicesのリンクをクリックしてサービスが正常にアップロードされたことを確認。
これでデプロイは完了。
上記のEPRがSOAPのエンドポイントになります。
5. Salesforce側のセットアップ
代理認証はSalesforceにお問い合わせして有効化してもらってください。DeveloperEditionでもやってもらえました。有効化してもらったら 設定>セキュリティのコントロール>シングルサインオン設定 で以下のように編集します。
代理ゲートウェイURLはEPRを入力、代理認証コールアウト強制実行はチェックを外してください。
あとは代理認証対象のプロファイルを選択してシングルサインオンの有効にチェックをつけます。
代理認証サーバが落ちているとログイン出来なくなってしまうので
システム管理者にはシングルサインオンの有効にチェックをつけない方が良いみたいです。
あとはこのプロファイルのユーザでログインしてみて
Salesforceから発行されたパスワードではなく代理認証サーバのロジックで認証されていればOKです。
これだけだと単に代理で認証しているだけなんですが
任意のアプリからSFDCにログインコール(SOAPのログインとかRESTのUsername-Passwordフローとか)
を行って認証自体は任意のアプリと連携された代理認証サーバで認証し、sessionIdをfrontdoor.jspに突っ込めば
代理認証機能でシングルサインオンができそうです。
あと、今回はtomcatとかaxis2とか結構大掛かりでしたが、結局SOAPで送られてくるデータって
<?xml version="1.0" encoding="UTF-8" ?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Authenticate xmlns="urn:authentication.soap.sforce.com">
<username>sampleuser@sample.org</username>
<password>myPassword99</password>
<sourceIp>1.2.3.4</sourceIp>
</Authenticate>
</soapenv:Body>
</soapenv:Envelope>
こんな感じでシンプルなんで適当にパースして返してあげればライトな言語
ライトなWebフレームワークでも事足りそうです。