AzureADを使って二要素認証をNext.jsに組み込む

##背景と実施したこと
■はじめに
Azure Active Directory B2C(以下、AADB2C)を使ってNext.jsのアプリにユーザ認証を組み込んだ。
以下の記事を参考にして進めたのみであるが、記載の手順に加えて、認証画面の日本語化と二要素認証を行ってみた。
本記事では下記の参考記事に記載していない部分を補足的に記しておく。
[参考：React & Next.js に Azure Active Directory B2C (AADB2C) で超手軽に認証機能を実装しよう](https://fwywd.com/tech/nextjs-azure-ad-b2c"React & Next.js に Azure Active Directory B2C (AADB2C) で超手軽に認証機能を実装しよう")

■取り組んでみた所感
認証周りの実装の選択肢はAWSやfirebaseもあるが、Azureの場合複数のアプリでも同じ認証を使い回せるという点が個人的には一番大きな違いのように思える。(これはAWSもできるかも... 詳しい方いればコメントください。)
Azureのメリットの詳細は以下の記事参照。
[参考：IDaaS がこれからは必須！認証・認可は Azure Active Directory B2C (AADB2C) がおすすめ](https://fwywd.com/tech/why-adopt-idaas"IDaaS がこれからは必須！認証・認可は Azure Active Directory B2C (AADB2C) がおすすめ")


##概要
+ 認証の細かい設定周りは管理コンソール上のGUIで完結できる
+ Nex.jsに組み込む際は、ライブラリが提供されているのでそれらを使って実装を「少しだけ」行う
+ 二要素認証の設定もボタン1つでできて超簡単


##実際の設定作業について
Azureのアカウントを作ってからアプリに組み込むまでの手順は
[参考：React & Next.js に Azure Active Directory B2C (AADB2C) で超手軽に認証機能を実装しよう](https://fwywd.com/tech/nextjs-azure-ad-b2c"React & Next.js に Azure Active Directory B2C (AADB2C) で超手軽に認証機能を実装しよう")
こちらにかなり丁寧に記載されているため、この記事では細かい部分まで記載しない。

簡単に作業手順だけ記載しておくと

1. MSアカウントを作ってリソースグループを作る
1. 「Azure Active Directory B2C」のテナントを作る
1. テナントにアプリを登録する
1. ユーザ認証のための「ユーザフロー」を作成する
1. 作成したユーザフローをアプリに組み込む

の5stepで整理できる。

最後のアプリに組み込む部分では
「"@azure/msal-browser"」「"@azure/msal-react"」というライブラリを使っているがこの実装部分のみ補足しておく。
コーディングの部分で以下のようにconfig.tsを実装する箇所があるが、このauthorityのURIをどのように設定するのかが自分は少しわかりづらかった。

```jsx:config.ts
import { Configuration } from '@azure/msal-browser';

export const msalConfig: Configuration = {
  auth: {
    clientId: '65504e93-6516-476e-9ab4-86fa3ad17810',
    authority: 'https://xxxxxxkapp.b2clogin.com/hogehoge/B2C_1_signin', //hogehogeの部分はテナント名でもテナントIDでもOK
    knownAuthorities: ['xxxxxxapp.b2clogin.com'],
    redirectUri: '/',
    postLogoutRedirectUri: '/',
  },
  cache: {
    cacheLocation: 'localStorage',
  },
};

export const loginRequest = {
  scopes: ['openid', 'offline_access'],
};

```

[MSの導入ガイド](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/tutorial-v2-react)や[github上のドキュメント](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/initialization.md#optional-configure-authority"github上のドキュメント")をみても
{Instance_Id}/{Tenant_ID}じゃないの？　と思ったがどうやら最後にユーザフローの名称を入れる必要があるらしい。
ユーザフローの部分を削ると

>Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints

とエラーが出る。
そして実際に作ったユーザフローの情報を見てみると「well-known/openid-configuration」のあとにパラメータが付与されているので
このパラメータ部分（以下の例だとB2C_1signin）を付け足す必要があるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/e927179a-dc9b-4281-c318-e084b9a02e52.png)


##補足で行った作業について
[こちら](https://fwywd.com/tech/nextjs-azure-ad-b2c)に記載されていないが、実際のサービスに組み込むにあたってさらに追加で設定した方がよさそうな部分が3点あった。

+ UI部分の日本語化
+ 二要素認証の有効化
+ ユーザ自信でのパスワードリセット機能の有効化
の３つだ。

###UI部分の日本語化

デフォルトだとおそらく以下のように英語になっているはずだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/75106d2d-df99-b977-7d27-45174546a7ce.png)
これを日本語に変更しよう。

①ユーザフローから「言語」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/e759fc15-9e84-9203-fa4b-aefb39d3a2eb.png)
②カスタマイズの有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/4b36e228-7f81-7332-11e1-9621519d59a4.png)
③有効かつ既定に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/68b52340-57e5-6929-9e4b-ebba6e3a14cf.png)

Englishが残っている場合は無効にしておこう。

以下のようになればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/03e50820-922f-bfc7-6995-5f67a0147e7e.png)


###二要素認証の有効化
プロパティ＞多要素認証のMFAの強制の部分を「常にオン」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/0b7e4721-f37c-cd80-8e48-abfeb9d32972.png)

この例だとメールに認証コードが届くようになる。

###ユーザ自身でのパスワードリセット機能の有効化
「パスワードを忘れた場合」のリンクを有効にするために以下の設定を行う。
プロパティ＞パスワードの構成＞セルフサービス パスワードリセットにチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635205/2d7c9429-14f8-121e-1896-5c4bab1d8027.png)


##まとめ
Azureでの認証を試したのは今回が初だったが、思った以上に簡単にいろんな設定ができて驚いた。
ドキュメントがあまり見つからないのが苦しく、かつ、管理ポータルの操作が慣れるまで少し大変そうだが、それでもかなり実装コストは省けるだろう。（ドキュメントの部分は公式がかなり頑張ってくれている印象はある。自分の読解力がないだけなのかも）
皆さんにもぜひ試してみていただきたい。