Visualforce

VisualforceでreCAPTCHAを実装

  • 2019.04.21

概要 SalesforceのCommunityやSites等で外部へ公開するページをVisualforceで実装する場合にBotによる標準型攻撃を受けないようにするための対策としてGoogle社が提供するreCAPTCHA(リキャプチャ)を使用して認証を実装するサンプルコードと手順を紹介します。 Googleへサイトの登録とAPIキーを発行 まず、下記のURLからGoogleへサイトの登録とAPIキーの発行を行います。右上のAdmin Consoleから登録できます。https://www.google.com/recaptcha/intro/v3.html 現在、Google社が提供しているreCAPTCHAには最新のv3と旧のv2がありますが、v2も引き続き使用できるようですので、そちらを使用したいと思います。また、ドメインには、公開サイトとなるCommunityやSitesのドメインを指定するようにしてください。今回は、テストで動作確認するのみなので、force.comを指定しておきます。 ここまでの入力が完了すると、Public KeyとSecret Keyが発行されます。こちらを実装するときに使用します。 Salesforceでリモートサイトへ登録 Apexでサーバー側で認証する際に、Googleのサーバーへリクエストする必要があるので、SalesforceのリモートサイトへURLを登録しておく必要があります。 Visualforceの実装 Visualforceでの実装サンプルは下記の通りとなります。チェックボックスの押下により発行されたトークンをhiddenの項目に保持しておき、サーバー送信時にPostします。 サーバー側(Apex)の実装 サーバー側(Apex)の実装サンプルは下記の通りとなります。クライアントからポストされたトークンとSecret Keyをパラメーターにして、所定のGoogle社のURLへPOSTして認証を実施して、レスポンスで結果を確認します。 デモ 下記のようの動作となりました。 参考 Adding CAPTCHA to Force.com Siteshttps://developer.salesforce.com/index.php?title=Adding_CAPTCHA_to_Force.com_Sites&oldid=27283 reCAPTCHA v2https://developers.google.com/recaptcha/docs/display Verifying the user’s responsehttps://developers.google.com/recaptcha/docs/verify 最後に 下記に今回のサンプルコードは格納しておりますので、よければ参考にしてください。https://github.com/yhayashi30/reCAPTCHA-salesforce-visualforce

VisualforceでJavaScriptを共通化

  • 2019.02.26

VisualforceでJavaScriptを共通化 複数のVisualforceで同じようなJavaScriptでの処理を行いたい場合は、共通のVFページにJavaScriptを定義することで関数を共通化することができます。 呼び出しページでは、apex:includeタグのpageName属性で共通VFページを指定します。 サンプルコードは、以下となります。 呼び出しページ 共通ページ 参考 https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_include.htm

複数Visualforceページ間で値の引き継ぎ

  • 2019.02.25

複数Visualforceページ間で値の引き継ぎ Visualforceでページを遷移する際に値を引き継ぐ2つの方法をサンプルコードベースで説明します。 ビューステート 複数のVFで同一のコントローラを使用することで、PageReferenceにより遷移するとビューステートの項目を引き継ぐことができます。 サンプルコードでは、TransferController.clsのconfirmメソッドでTest_TransferToState.pageのPageReferenceを返して遷移している部分になります。 Getパラメータ 複数のVFでコントローラを分割する場合には、URLのGetパラメータを使用することで項目を引き継ぐことができます。 サンプルコードでは、TransferController.clsのnextメソッドでTest_TransferToParam.pageのPageReferenceにpr.getParameters().put(”,”)で値を設定し、遷移して受けるVFのコントローラ(TransferReceiveController.cls)でApexPages.currentPage().getParameters().get(”)により値を取得します。 サンプルコード 補足 こちらにもアップしてます。 https://github.com/yhayashi30/visualforce-transfer-sample.git

sforce.oneオブジェクトによるLightning Experienceでのページ遷移

  • 2019.02.23

sforce.oneオブジェクトによるLightning Experienceでのページ遷移 Visualforceページはページ遷移する際には通常、遷移先のVFページを指定したPageReferenceをApexから返すことで遷移先へリダイレクトして遷移をさせます。 場合によってはJavaScriptのロジックでページを遷移させる際には、location.hrefでVFページのURLを指定して遷移させる方法もあります。 Lightning Experienceに埋め込まれたVisualforceページでは、location.hrefを使用した遷移は下記の通り推奨されておらず、sforce.oneを使うように記載されております。 window.location を直接設定しない これだけ言えば大丈夫でしょうか。この理由は簡単です。Lightning Experience では、ページに設定する window.location がないためです。Visualforce の「コンテナ」や、iframe でラップされること、Lightning Experience が単一ページアプリケーション (SPA) であることなどはすでに説明しましたが、この点も追記しておく必要があります。Visualforce の iframe は window.location 値に直接アクセスできず、したがってこの値を設定することができません。コードがこの設定に依存している場合、そのコードは壊れます。つまり、window.location を設定してナビゲーションを起動するアクションによって、意図する移動先へのナビゲーションが停止します。 location.hrefは、現状Lightningでも動作しますが、いつサポートされなくなるかわからない点と、ブラウザの戻るを使った時の挙動が正しくならない可能性がある点等が考えられるので、Lightningで動作させるVFのページ遷移をJSで実装する際はsforce.oneオブジェクトを使用しましょう。 なお、sforceを使った遷移をいくつか動作検証したソースコードは下記になります。 https://github.com/yhayashi30/test-sforce-one 参考 sforce.one オブジェクトを使用したナビゲーションおよびメッセージ https://developer.salesforce.com/docs/atlas.ja-jp.salesforce1.meta/salesforce1/salesforce1_dev_jsapi_sforce_one.htm ナビゲーションの管理 https://trailhead.salesforce.com/ja/content/learn/modules/lex_dev_visualforce/lex_dev_visualforce_navigation

VisualforceでAjaxによるApex呼び出し後のJSでView Stateを参照する方法

  • 2019.02.18

VisualforceでAjaxによるApex呼び出し後のJSでView Stateを参照するサンプルコード View Stateとは、Apexコントローラの状態やVisualforceページの状態をサーバーリクエスト間も保持するための、Visualforceページ内に暗号化されたhiddenのinputフィールドのことです。このフィールドはapex:formタグがページ上にある場合のみ生成されます。 本サンプルコードでは、タイトルの通りAjaxによるApex呼び出し(apex:actionFunctionやapex:actionFunction等)のoncompleteでコールバックしてJSの関数を呼び出した際に、JS上でView Stateの値を参照したい場合のものになります。