2014-07-13

Salesforceの代理認証SSOやってみる

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のパスを入れてください。

$ {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のリンクをクリック。

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で送られてくるデータって

<?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フレームワークでも事足りそうです。

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