freedom-man.com

ブログは俺のセーブポイント

force.comポータルでOAuth2.0

以前の記事でforce.comでREST APIを使用する際のドメイン名に関して取り上げたけど

ポータルへのOAuth認証(Sites利用)は

普通のSalesforceユーザへのOAuthの設定方法よりやや面倒な感じになる。

ということで、今回はポータル+Sites+OAuthについて書いてみる。

 

【ポータルOAuthの事前準備】

ポータルユーザに対してREST APIを利用したい場合は、対象ポータルに紐付けたSitesを設定する必要がある

※ポータルユーザに対してREST APIのOAuthリクエストをする際のドメインは、Sitesのドメインになる。

 

【ポータルOAuthの仕様・注意点】

1. SitesドメインのOAuthエンドポイントに対してAuthorizationCodeをリクエストするときに

ポータルユーザのセッションIDが切れていた場合は401のエラーページに遷移するので

当ページでログイン処理を行う必要がある。

2. 401のエラーページではSite.Loginメソッドを使ってセッションを発行し

return値(PageReference)をクライアントに返す必要がある。

3. 2のreturn値によってfrontdoor.jspにリダイレクトされることで

セッションIDがCookieにセットされ、OAuthのリダイレクトURLに遷移する。

※2-3の詳細はこの記事を参照。

 

401のエラーページっていうのはSitesの設定の以下の部分。

SitesErrorPage

 

普通のSalesforceユーザに対するOAuth認証と異なるのは1-2の工程。

Sitesを使ってポータルユーザへのOAuthを行う場合には

401のエラーページのVF画面でSite.Loginメソッドを使って認証させる必要があります。

逆に、普通のSalesforceユーザではOAuthログイン画面の自由なカスタマイズが出来ないのに対して

ポータルユーザへのログインはフロントにSitesを利用しているため自由なカスタマイズが出来るということです。

 

また、注意しておかないといけない点としては

認証ページはVF画面(UnAuthorized)を使用できるので自由にカスタマイズできるが

認可の画面はカスタマイズできず、以下のような固定画面になること。

OAuthLoginPage

 

ポータル案件ではデザイン性が要求されるため

カスタマイズできない画面があるというのは、十分留意しておく必要があります。

 

コミュニティはここらへんどうなんだろう…?


6 Comments

  1. こんにちは。小堀と申しますm(__)m
    ポータル+Sites+OAuthについて教えていただけますでしょうか?

    現在Overage Authenticated WebsiteユーザをポータルのOauth認証を介して、別のURLに飛ばすしくみで考えております。
    SF内に接続アプリケーションを作成し、コールバック URLに別のURLを設定し、飛ばすようにしています。

    forceのユーザでしたら、SFにログイン後URLに飛びますが、Overage Authenticated Websiteユーザの場合、ポータルにログインしたままコールバックURLには飛んでくれません。
    どのように設定すればいいでしょうか?
    上記の401エラーもでません。

    どうかご教授のほどよろしくお願いいたします。

    • freedom-man

      2016年3月20日 at 12:14 AM

      Overage〜は利用したことがないのですが、以下の環境で試したところ問題なくコールバックURLにcodeパラメータ付きで遷移しました。

      環境:Developer環境
      ユーザライセンス、プロファイル:Authenticated Website
      構成:Sites + カスタマーポータル

      ログイン処理のApexは

      String startUrl = System.currentPageReference().getParameters().get(‘startURL’);
      PageReference loginPr = Site.login(username, password, startUrl);
      return loginPr;

      となっております。
      startUrlの指定はされておりますでしょうか?

      • 返信ありがとうございます。
        返信に気が付かず大変遅くなってしまい申し訳ありませんm(__)m

        やってみたのですが、画面遷移が失敗してしまいます。
        認証は成功しますので、もう少し時間かけます。

        が、別のところ(SalesforceのSCIM叩いてみた)にコメントをしてしまったのですが、その際ユーザ情報をCookieに落としたいと考えますが、失敗してしまいます。

        Site.loginの際に
        String sessionId = UserInfo.getSessionId();
        String userEmail= UserInfo.getUserId();

        return Site.login(username, password, ‘/home/home.jsp?sid=’+ sessionId +’&email=’+userEmail+’&retURL=’+ Label.Site_StartURL_Utest);

        などとするのは違っていますでしょうか??
        大変お手数をおかけしますがご教授いただきますようお願いします。

        • freedom-man

          2016年4月18日 at 12:11 AM

          Site.login時にUserInfo.getSessionId()を叩いておりますが、ログイン前のユーザコンテキストはサイトゲストユーザですので、取得できるセッションIDはサイトゲストユーザのものになっているような気がします(別ユーザでログインしているのであれば、そのユーザコンテキストになります)

          実現したいフローをまだ完全に把握しきれていないのですが、OpenID Connectでポータル(コミュニティ)をOPとして、ユーザ情報をRP側で利用する場合は、フロー内で取得できるaccess_tokenを利用して、UserInfoエンドポイントを叩けばユーザ情報を取得できます。id_token内のJWT内にもメールアドレスやユーザ名などの情報が含まれていると思います。取得した情報を使ってRP側でCookieを発行すれば、「Cookieに落としこむ」用途も達成できると思います。

          また、SCIMを利用しなくてもUserInfoエンドポイントとして以下が用意されています。
          https://login.salesforce.com/services/oauth2/userinfo
          参考URL-> https://help.salesforce.com/apex/HTViewHelpDoc?id=remoteaccess_using_userinfo_endpoint.htm&language=ja

          • 早速の返信ありがとうございます。
            一度試してみます。
            ありがとうございます!!!!

          • こんばんは
            UserInfoエンドポイントで情報取得できました。
            メールアドレスなど取得できたのですが、プロファイルはとれませんか?
            profileにはユーザのIDが入っています。

            また画面遷移はやはり失敗してしまいます。
            サイトの開始URL、接続アプリケーションのリダイレクトURLをどちらも外部のhttps://*****/index.html
            とし、

            String startUrl = System.currentPageReference().getParameters().get(‘startURL’);
            PageReference loginPr = Site.login(username, password, startUrl);
            return loginPr;
            にしても

            return Site.login(username, password, ‘/secur/frontdoor.jsp?retURL=https://*******/index.html’);

            としてみても、どちらも1度目はSFのポータルサイトのTOPになってしまいます。

            甘えてばかりで申し訳ございません(>_<)

コメントを残す

Your email address will not be published.

© 2017 freedom-man.com

Theme by Anders NorenUp ↑