2014-04-21

force.com Sitesにリバースプロキシを挟んで独自ドメインSSL対応させてみる。

force.com Sitesでは非SSLにおいて独自ドメインを設定できますが、SSLにおいては独自ドメインを適用できません。

force.com Sitesはポータル系のログイン画面やフォーム画面等で利用されることが多く

企業によっては「ドメインにforce.comとか入ってるのはダメ!」とか言われちゃったりします。

 

これ、リバースプロキシで出来るんじゃね?ということでちょっとやってみることに。

 

方法は簡単で、適当なWebサーバを用意してリバースプロキシの設定をするだけ。

以下はnginxの設定例

server {
    listen 443;
    server_name *******.com; #独自ドメイン

    ssl on;
    ssl_certificate server.crt;
    ssl_certificate_key server.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass https://****-developer-edition.na7.force.com/; #SitesのベースURL
    }
}

 

あとは設定したドメインにアクセスするだけ!

今回試したVFページ+Apexはこんな感じ

<apex:page controller="SitesTestPage" showHeader="true">
    <script type="text/javascript">
        var send = function() {
            Visualforce.remoting.Manager.invokeAction(
                '{!$RemoteAction.SitesTestPage.sendRA}', 
                function(result, event){
                    console.log(result);
                }, 
                {escape: true}
            );
        };
    </script>
    <apex:outputText value="{!display}" id="display"/>
    <apex:form >
        <apex:commandButton value="送信!" action="{!send}"/><br/>
        <apex:commandButton value="送信!(ajax)" action="{!send}" reRender="display"/><br/>
        username:<apex:inputText value="{!username}"/><br/>
        password:<apex:inputSecret value="{!password}"/><br/>
        <apex:commandButton value="login" action="{!login}"/>
    </apex:form>
</apex:page>

 

public with sharing class SitesTestPage {

    public String display { get; set; }
    public String username {get; set;}
    public String password {get; set;}
    
    public SitesTestPage() {
        this.display = 'Constructor!';
    }

    public PageReference send() {
        this.display = 'Send!';
        return null;
    }
    
    public PageReference login() {
        return Site.login(this.username, this.password, null);
    }
    
    @RemoteAction
    public static String sendRA() {
        return 'aaa';
    }
}

 

初期表示

sites-rp-init

うん、うまく表示されてます。JSエラーとかネットワークエラーも無し。

Sitesドメインと全く同じ表示になってます。

 

メソッド呼び出し

apex:commandButtonでメソッド呼び出してみます。

sites-rp-send

いい感じ。apex:commandButton+reRenderでajaxもOKでした。

 

JavaScript Remotingしてみます。

sites-rp-sendRA

 

これもOK。

 

じゃ、ログインしてみますか!

sites-rp-login

 

ダメでした。orz

 

POST先は独自ドメイン→Sitesドメインとフォワーディングしてくれてるんだけど

Site.loginはSitesのドメインのfrontdoor.jspが返却されるので

発行されるCookieはSitesドメインに対してなので楽勝でダメでした。そりゃそうだよねー。

 

っていうことで、ポータルへのログイン以外はなんとか機能しそうな感じです。

もちろん、絶対パスで指定しているようなajaxとかがあったら一発でアウトです。

ここらへんはSalesforceの仕様で簡単に変わるので、良い子は真似しないように!

 

ちなみに、Sitesのポータルへの接続を切るとこんな感じにCSSもちゃんと取ってこれてる様子がわかります。

sites-rp-header

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