この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

サードパーティの SMS ベースの 2 要素認証のリリース

2 要素認証 (2FA) は、ユーザの ID を検証するときのセキュリティを強化し、Salesforce 組織へのアクセスを保護します。SMS ベースの 2FA では、パスワードに加え、モバイルデバイスで受信したワンタイムパスワード (OTP) コードの入力がユーザに要求されます。

2FA を実装するには、Twilio や TeleSign のような、サードパーティの SMS または音声配信サービスを Salesforce ログインフローと一緒に利用できます。

SMS ベースの 2FA プロセスを詳しく見ていきましょう。

  1. ユーザがログインすると、ログインフローがランダムな OTP を生成し、音声またはテキストメッセージを介してユーザの携帯電話に送信します。
  2. ユーザがその OTP を Salesforce アプリケーションに入力します。
  3. Salesforce がそのコードを検証します。
  4. コードが有効な場合、Salesforce はユーザのアクセスを許可します。

ログインフローには 4 つのステップがあります。

SMS 2FA プロセス
  1. レコードの検索— ユーザレコードを照会して携帯電話番号を取得します。
  2. SMS プラグイン — OTP を生成し、サードパーティの SMS 配信サービスを使用してその OTP をユーザのモバイルデバイスに送信する Apex クラス。
  3. 画面— ユーザに受信した OTP を入力するように促します。
  4. 決定 — フローで生成された OTP をユーザが入力した OTP と比較します。等しければ、フローは完了し、ユーザはアプリケーションにリダイレクトされます。等しくなければ、フローは別のコードを生成し、ユーザに再検証を要求します。

フローの設定

この例では、Twilio Apex SDK を使用して SMS 配信操作を実行します。他のクラウドベースの SMS または音声ベンダーでも、サービスにアクセスするための公開 API があれば使用できます。

  1. Salesforce でクラウドフローデザイナに移動し、フローを作成します。
  2. LoginFlow_UserId 入力テキスト変数を作成します。この変数には、ログインイベント中にユーザ ID が入力されます。

    LoginFlow_UserId 変数の作成

  3. テキスト変数を作成します。
    • Mobile (モバイル) — ユーザの携帯番号
    • VerificationCode (確認コード) — Apex プラグインで生成された OTP
    • Code (コード) — ユーザから収集された OTP
    • Status (状況) — プラグイン実行時に返された状況
  4. ユーザ ID に基づいて UserObject を照会し、携帯番号をMobile 入力変数に保存するレコードの検索を作成します。

    レコードの検索の作成

  5. https://github.com/twilio/twilio-salesforce から Twilio Apex SDK をインストールします。
  6. SMS プラグインに Twilio Web サービスへのアウトバウンド API コールの実行を許可するには、Salesforce で https://api.twilio.com をリモートサイトとして設定します。[設定] で、[クイック検索] ボックスに「リモートサイトの設定」と入力し、[リモートサイトの設定] を選択して Twilio Web サービスの URL を追加します。

    サードパーティの Web サービス URL をリモートサイトとして追加

  7. Apex クラスを作成します。
    101    global class SMSPlugin implements Process.Plugin {
    202     
    303    global Process.PluginDescribeResult describe() {
    404     
    505        Process.PluginDescribeResult result = new Process.PluginDescribeResult();
    606        result.tag='Identity';
    707        result.name='SMS Plugin';
    808        result.description='Two factor authentication with SMS';
    909         
    1010        result.inputParameters = new List<Process.PluginDescribeResult.InputParameter> {
    1111            new Process.PluginDescribeResult.InputParameter('AccountSid', Process.PluginDescribeResult.ParameterType.STRING, true),
    12  
    1312            new Process.PluginDescribeResult.InputParameter('Token', Process.PluginDescribeResult.ParameterType.STRING, true),
    1413            new Process.PluginDescribeResult.InputParameter('To', Process.PluginDescribeResult.ParameterType.STRING, true),
    1514            new Process.PluginDescribeResult.InputParameter('From', Process.PluginDescribeResult.ParameterType.STRING, true),
    1615            new Process.PluginDescribeResult.InputParameter('Message', Process.PluginDescribeResult.ParameterType.STRING, true)
    1716        };
    1817       
    1918        result.outputParameters = new List<Process.PluginDescribeResult.OutputParameter> {
    2019            new Process.PluginDescribeResult.OutputParameter('Status', Process.PluginDescribeResult.ParameterType.STRING),
    2120            new Process.PluginDescribeResult.OutputParameter('VerificationCode', Process.PluginDescribeResult.ParameterType.STRING)
    2221        };
    2322         
    2423        return result;
    2524     
    2625    }
    2726     
    2827     
    2928    global Process.PluginResult invoke(Process.PluginRequest request) {  
    3029     
    3130        Map<String, Object> result = new Map<String, Object>(); 
    3231        String AccountSid = (String)request.inputParameters.get('AccountSid');
    3332        String token = (String)request.inputParameters.get('Token');
    3433        String To = (String)request.inputParameters.get('To');
    3534        String From_a = (String)request.inputParameters.get('From');
    3635        String Message = (String)request.inputParameters.get('Message');
    3736        if (Message == null) Message = 'Your verification code is: ';
    3837         
    3938        TwilioRestClient client = new TwilioRestClient(AccountSid, Token);
    4039        TwilioSMS sms;
    4140         
    4241        Integer rand = Math.round(Math.random()*100000);
    4342        String VerificationCode = string.valueOf(rand);
    4443        String Body = Message + VerificationCode;
    4544         
    4645        Map<String,String> params = new Map<String,String> {
    4746            'To'  => To,
    4847            'From' => From_a,
    4948            'Body' => Body
    5049        };
    5150      
    5251        try {
    5352            sms = client.getAccount().getSMSMessages().create(params);
    5453            result.put('Status', sms.getStatus());
    5554        } catch(Exception ex) {
    5655            result.put('Status', 'Failure');
    5756        }
    5857            result.put('VerificationCode', VerificationCode);
    5958           return new Process.PluginResult(result);
    6059      }
    6160    }
  8. OTP コードを生成して SMS 経由でユーザの携帯番号に送信する SMS プラグインを作成します。このプラグインは、次の入力を取り込みます。
    • AccountSid (アカウント SID) — Twilio アカウント SID (Twilio アカウントのユーザ名)
    • Token (トークン) — Twilio 認証トークン (Twilio アカウントのパスワード)
    • From (送信者) — SMS の送信者番号
    • Message (メッセージ) — 確認コードと一緒にユーザに送信されるメッセージ
    • To (送信先) — ユーザの携帯電話番号

    SMS プラグインの作成

    このプラグインは、2 つの値を返します。
    • Status (状況) — SMS 配信操作の状況
    • VerificationCode (確認コード) — 生成されてユーザに送信される確認コード

      このプラグインは 2 つの出力を返す

  9. 受信した確認コードの入力を促す画面要素を作成します。

    画面要素の作成

  10. 2 つの結果を持つ決定要素を作成します。
    • Valid (有効) — 確認コードはユーザが入力したコードと同じです。
    • Invalid (無効) — 有効となる条件が満たされないため、結果は無効です。

    決定要素の作成

  11. フローを保存して有効化します。
  12. ログインフローをユーザプロファイルに接続します

    フローをプロファイルに接続

  13. ログアウトし、テストプロファイルに接続されたテストユーザとしてログインします。

    ようこそ画面のサンプル

フローの拡張

本番リリースでは、この基本フローを拡張することがよくあります。たとえば、次のようなカスタマイズ、検証、ポリシーを追加できます。
  • ブランド — 会社のロゴとメッセージを検証画面に追加します。
  • 検証 — ユーザレコードに電話番号が含まれているかどうかを検証します。含まれていなければ、ユーザに入力を促します。
  • 再試行回数 — ユーザが入力した OTP コードが誤りの場合、ログインフローは新しい OTP コードを生成してユーザに送信します。一般的に、再試行回数を制限したり、検証の試行が複数回失敗したらユーザのログインを一時的にブロックしたりします。
  • ポリシー — ユーザが携帯電話番号ではなく固定電話を登録している場合、SMS ではなく音声で OTP を送信します。または、Salesforce にユーザの電話番号が登録されていない場合、メールで OTP コードを送信します。別の方法として、ユーザに 2 つ目の認証要素 (Salesforce の時間ベースの OTP や、YubiKey のようなハードウェアベースの OTP など) の入力を要求することもできます。