完璧じゃなくてもとりあえず終わらせるブログ

主にSalesforceの悪夢を記録しています

Apexでログイン処理を行う

Salesforceは原則ログインして使用するものですが、エンドユーザーに「Salesforceにログインした」と思わせないようにしたいということがよくあります。
エンドユーザーが社内ユーザではなく、サービス提供相手の場合はまずもってこの要件がありますよね。
だったらそもそもSFACRMをメインにおいてるSalesforceなんか使うなよって思いますけど日本企業というのはそのあたりうるさいのが常です。
要するに、Salesforceだとわからないように独自のログイン画面を用意して、認証し、SalesforceだとわからないようにしたApplicationを使わせたいわけです。
そのログインの話。

Site.login()を使用して独自画面で認証させる

Siteクラスにメソッドが用意されているので容易に実現できます。

公式:Apex開発者ガイド > Siteクラス
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_sites.htm

  1. Visualforceで独自画面(ID、PW入力欄)を作成し、Force.comに設定する(設定)
  2. サイトゲストユーザでアクセスしてきたユーザにID、PWを入力してもらう(VF)
  3. 入力値を元にSite.login()を使用して認証後、任意のページにリダイレクトさせる(Apex)

というのが大きな流れで、よくあるケースです。
もちろん認証させるにあたり、

  • ユーザの用意
  • 本来のSalesforceIdに変換するためにID入力値にsuffixを付与(@XXX.comのような)

など細かい作業は多数ありますが、とにかくSite.login()を使用しさえすれば実装できます。

Site.login()メソッドの細かい挙動に関しては、こちらが詳しいです(丸投げ)。
https://blog.freedom-man.com/sitelogin-salesforce


自動ログインも(やろうと思えば)できる

でもこのメソッドを使用すれば、極端な話エンドユーザー誰でも受け入れることが可能だと思うんです。
上の例でいうと、トップページとなるVFに「次へ」ボタンでも配置しておいて、押下されたらApex側で、Site.login()の引数であるusernameとpasswordをどこかから取得して(定数でもいいし、カスタム表示ラベルでもいいし)、認証させてしまう。

いや、もはやVFの「次へ」ボタンすらいらないですね。ページ表示と同時にapex:actionFunctionでApexメソッドをCallしてしまえばアクションなしで認証までできます。


と言いつつも、こんな大きなセキュリティホールを作ってなにが嬉しいのかさっぱりわからないので実装することはまずないでしょう。


これならあり?

可能性として、以下のような仕様ならありかもしれない。

会員登録していないユーザに一時的にSFDC内部の情報を見せたい、という前提で

  1. ユーザにキー情報を暗号化して渡す(メールとかで)
  2. トップページでキー情報を複合化し、内部データと一致するか確認する(ユーザの一部情報は内部に保存済み)
  3. (さらにMFAでユーザの本人確認を行う(SMS飛ばしたりして))
  4. 自動ログインさせて情報の一部だけ開示する

 ※このとき、実際のログインユーザは使いまわしも可能
  Salesforce上のユーザアカウント1つをアクセスしてきたエンドユーザ全員の自動ログイン用ユーザとする
  つまり
   サイトゲストユーザでアクセス → 自動ログイン専用のユーザでログインする
  ということ

まぁ、でもやっぱりそんなことするぐらいならコンテンツ配信機能とかでエンドユーザーに情報渡せばいいんじゃないでしょうか。
SMS飛ばすなんて簡単にできるのかしら? Marketing CloudならSMS飛ばせるとかなんとか……。

それにそもそも論として、ログイン前提のSalesforceをログインさせずに使わせよう、なんていうのが虫のいい話で、ソリューション選定から間違ってるといわれれば言い訳できない。
やはり、Site.login()メソッドはポータルログイン時に使用することを想定して作られたものなんでしょうか。



よし、とりあえず終わらせたぞ(?)