AutifyでSalesforceへの多要素認証ログインをテストする方法

※※この記事は「[Autifyアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/autify)」9日目の記事です。

はじめまして、Autify カスタマーサクセスマネージャーの中村です。今回はSalesforceの開発をAutityでテストする際に2023年2月1日以降必須となる**ログイン時のMFA突破の手順**をまとめましたのでぜひご参考ください。

## 背景と影響
2023年2月1日より、全Salesforce組織でログイン時に多要素認証を行うことが必須となり以下の影響があるため、現在AutifyでSalesforceをテストしている方もこちらの設定を行う必要がございます。
- 組織の信頼済みIPアドレスリストにAutityのIPアドレスを追加することでメールやSMSによる認証をスキップ出来なくなる
- 固定メールアドレスを用いてメールによる認証を通過出来なくなる

## 概要
Step 1. Autifyが用意するAuthenticator Appとテストを実行するSalesforceユーザを紐付ける為に1度だけ使用する「**準備用シナリオ**」を作成する
Step 2. Step 1で取得したキーを基に定期実行用の「**完成版シナリオ**」を作成する

## 手順
### Step 1. Autifyが用意するAuthenticator Appとテストを実行するSalesforceユーザを紐付ける為に1度だけ使用する「**準備用シナリオ**」を作成する
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/16db33b0-0a93-c35b-97a3-cd37da46cb07.png">

①シナリオを新規作成し、開始URLに「**SalesforceのログインページのURL**」を入力し「**レコーディングを開始**」をクリック
**※開始URLはテストする環境によって変わります**
本番環境：https://**login**.salesforce.com
Sandbox環境：https://**test**.salesforce.com

※シナリオ名は準備用シナリオとします
![開始URL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/fe03f46c-86d1-77c2-de32-7fa0da5ec7f2.png)

②テストを実行する「**ユーザ名**」と「**パスワード**」を入力し、「**ログイン**」をクリック
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/4e136b86-fd6e-73e6-6952-68164465476e.png">

③「**別の検証方法を選択**」をクリック
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.amazonaws.com/0/3018946/2b346991-92ba-d11c-8f19-1611b53b18fa.png">

④「**認証アプリケーションからの確認コードを使用**」をクリックし、「**次へ**」
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/76897f8c-16a3-3728-55b5-cd493c9f7f3e.png">

⑤「**QR コードをスキャンできません**」をクリック
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/62f36cdf-e1ba-e8c8-3624-8b196ecc3204.png">


⑥キーの上で「**右クリック**」し、Autify Recorderから「**JS ステップを追加する**」をクリック
※ここで表示されるキーは控える必要はございません
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/39b27a2c-58c3-e7c7-88e7-37d4d33519b1.png">


⑦確認コードに「**任意の6桁の数値**」を入力し、「**接続**」をクリック
※エラーが発生しログイン失敗しますがこの時点では問題ないです
<img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/aa577411-eb1a-0cd3-4517-e1ceb42986bf.png">


⑧**確認コードが無効です**のエラーが表示されたらAutify Recorderの「**保存**」をクリック
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/7afea633-4d0a-b722-c57e-9bf1bb0055f9.png">

⑨「**JavaScript のコードを実行する**」ステップをクリックし、以下のコードを入力する
このコードではAutifyがホスティングするAPIを用い、確認コードを生成します(<a href="https://help.autify.com/docs/ja/how-to-test-two-factor-authent?highlight=2fa">参考</a>)
- Step5で行った操作により右クリックした要素が element に代入されます
- 今後ログインする際に利用するキーを控えるために2行目でconsole.log(secret);を実行しています
```JavaScript:
var secret = element.textContent;
console.log(secret);
var url = "https://autify-jsstep-util-apis.herokuapp.com/totp";
var xhr = new XMLHttpRequest();
var otp = null;

xhr.onerror = function() {
　　throw new Error("Network Error");
};
xhr.onload = function() {
　　otp = xhr.response;
};

xhr.open("POST", url, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("key=" + secret);

return otp;
```


⑩ステップ10の「**000000と入力する**」「**値を指定**」「**他のステップから取得**」の順にクリックし、入力値が**JavaScript のコードを実行する**となっていることを確認する
![JS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/517c9282-9806-7ab8-273f-d30018d0b3fa.png)

⑪「**保存**」「**今すぐ実行 Chorome / Linux**」の順にクリックし、テストを実行する
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333031383934362f30323264333732642d613064352d666134382d396237332d6263333835316563633330362e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/30f15252-4ee9-f9ad-30bb-72510675da0b.png)


⑫「**テスト結果**」クリックし、準備用シナリオが成功していることを確認する。
![成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/4b76bdd1-434f-90c7-d63d-ff0686e29654.png)

準備用シナリオのテスト結果を開き、JavaScript のコードを実行するステップの「**Logs:1**」をクリックし、完成版シナリオで用いるキーを控える
![Logs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/5f0a228c-8f11-9cd8-7ff8-10a9f71b0bcc.png)
![key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/e5dbf6c6-73fb-7db9-bb0b-da2077472261.png)

### Step 2.Step. 1で取得したキーを基に定期実行用の「**完成版シナリオ**」を作成する
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/a26202f2-a06c-5b7d-ea74-07f3ad82fda1.png)

①Step. 1の①,②を行う
※シナリオ名は完成版シナリオとします

②確認コードに「**任意の6桁の数値**」を入力し、「**検証**」をクリックし、エラーが表示されることを確認した上で「保存」をクリック
![保存２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/ccc73377-07d4-bd28-e089-8c430f02d63d.png)

③000000と入力するステップの直前の+をクリックし、「ステップを挿入」「JSステップ」の順にクリックする
![挿入.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/fae711e3-1e47-045a-7495-3043e0f8223b.png)

④JavaScriptに「**以下のコード**」を入力する
※1行目のXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXはStep. 1で控えたキーに置き換えてください
```JavaScript:
var secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var url = "https://autify-jsstep-util-apis.herokuapp.com/totp";
var xhr = new XMLHttpRequest();
var otp = null;

xhr.onerror = function() {
　　throw new Error("Network Error");
};
xhr.onload = function() {
　　otp = xhr.response;
};

xhr.open("POST", url, false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("key=" + secret);

return otp;
```
⑤「**000000と入力する**」「**値を指定**」「**他のステップから取得**」の順にクリックし、入力値がJavaScript のコードを実行するとなっていることを確認する
![JS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/13169402-9693-632b-e42a-6e582919169e.png)

⑥「**保存**」「**今すぐ実行 Chorome / Linux**」の順にクリックし、テストを実行する

⑦テスト結果を確認し、成功していたら完成！
![スクリーンショット 2022-12-06 13.09.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018946/fc1befbb-dbda-7e09-e30f-986dc73b5623.png)

## おわりに
いかがでしたでしょうか？
MFAを用いたログインのテストを自動化するのは難しそうに感じてしまいますが、Autityでは簡単に出来てしまいます！
ぜひ皆様もSalesforce開発のテストにAutityをご活用ください。