Azure Functions と Azure Active Directory B2C を連携させる　その１

Azure Functions を 使うときに認証をかけたい場合があるだろう。今回は、つぎの３つのテーマを達成するために少しづつやってみよう。

<img width="1225" alt="Screen Shot 2017-10-27 at 10.36.15 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/6e80747b-5907-1d7a-712f-e4e4529010ae.png">


* Azure Functions と、[Azure Active Directory B2c](https://azure.microsoft.com/en-us/services/active-directory-b2c/) を連携させてユーザ認証する
* Facebook と連携してアカウントを作れるようにする
* 多要素認証を有効にする
* RBAC

まずは今回は最初の一つ目からやってみたい。

# 1. Azure Active Directory B2C を作成する

[Azure Active Directory B2C](https://azure.microsoft.com/en-us/services/active-directory-b2c/) はクラウドのID マネジメントシステムで、一般ユーザ向けに認証認可の管理や、多くの、SNSとの連携 (Facebook, Google 等) 多要素認証など、コンシューマ向けのID管理で必要なことは一通りできる様子。さて、これをServerless の基盤と合わせて設定するとどれぐらいでできるだろうか？

## 1.1. Azure Active Directory B2C とテナントと作成する

最初に、Azure Active Directory B2C を作成する。普通にポータルから作れる。するとつぎのような選択が出て来るので、Create a new Azure AD B2C Tenant を選ぶ。これを選ぶと、テナントが作られる。

<img width="582" alt="Screen Shot 2017-10-27 at 10.37.57 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/51f0b70f-8552-ca36-cf88-f9394ed64c5f.png">

なぜかJapan がないので、US にしておくが、つぎのような画面が出て来るので、情報を入れて、Create を押すと、テナントと、Azure Active Directory B2C が出来上がる。

<img width="318" alt="Screen Shot 2017-10-27 at 10.38.40 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/2de41fa1-8c2b-c819-c9ec-e7a7771b6503.png">

ところが、これだけだと、サブスクリプションが紐づいてないので、何もできない。紐付けよう

<img width="871" alt="Screen Shot 2017-10-27 at 10.45.35 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/70cf74c2-c80d-5faa-94de-4df77a41b7d2.png">


## 1.2.　B2C とサブスクリプションを紐付ける

これで、サブスクリプションとの紐付けができた。リソースグループに、B2C ができているので、それをクリックして、こちらをクリック

<img width="242" alt="Screen Shot 2017-10-27 at 10.47.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/a1dc0c71-9809-80c8-48c9-227dc9f1873f.png">




# 2. アプリケーションを作成する

認証をかけてリソースを守る対象を「アプリケーション」として登録する。

## 2.1. Azure Function を作成する

適当に Http Trigger の Function を作成してみよう。

<img width="1099" alt="Screen Shot 2017-10-27 at 10.54.33 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d1411440-2f86-8602-f8f0-68d979991372.png">

URL が取得できる。

## 2.2. アプリケーションを登録する

この 保護する対象のアプリケーションを B2C に登録しよう。

<img width="577" alt="Screen Shot 2017-10-27 at 10.50.23 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/49785a56-93d6-91a8-708f-6c27056dff33.png">

`Add` ボタンをクリックしてアプリを登録

アプリを登録するときのポイントは一つだけで、Reply URL に保護対象のFunction App のURL + `.auth/login/aad/callback` というURLにする。これは、AD側で認証してもらった後に、Azure Functions 側に戻って来るときのURLだ。ここで、ADからのトークンを受け取って、ユーザを登録したり認証したりする。

<img width="581" alt="Screen Shot 2017-10-27 at 10.57.58 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/df0a7bab-5878-6750-5b96-5d942e82cb7b.png">

アプリができると、IDが振られる

<img width="698" alt="Screen Shot 2017-10-27 at 10.58.51 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/0c46d9ed-30fc-d93f-19db-c0504c70a170.png">

ただ、これだけだと、まだ何もできない。

## 3. Sign up or Sign in Policy を設定する

まずは追加ボタン

<img width="485" alt="Screen Shot 2017-10-27 at 11.03.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/f4945265-8f0b-31dc-0c55-48ba1b81b14d.png">

今回は、一般ユーザをe-mail/passowrd で認証するので、Local 認証というのを選ぶ

<img width="894" alt="Screen Shot 2017-10-27 at 11.05.02 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/69a0f370-21ec-b0f3-a8d2-f9c3f7ded3c5.png">

Select sign-up attributes はサインアップするときに必要な項目を定義する。もちろんe-mail (password はカウントしない）だけでやりたいので、`e-mail` のみ選択。

<img width="849" alt="Screen Shot 2017-10-27 at 11.05.25 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/21493d10-c9fd-9f56-2f20-4476651d2060.png">

Select Application Claim は、認証後にアプリにどういう情報を渡すか？という設定。いろんな値が渡せる。基本的にリクエストヘッダーから取得できる様子。

* [Azure App Service での認証および承認](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-authentication-overview )

<img width="841" alt="Screen Shot 2017-10-27 at 11.05.44 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/8a710134-f979-b89a-0231-315d4ff7f55a.png">

最終的に、この画面になるので、Create を押すとポリシーができる。

<img width="311" alt="Screen Shot 2017-10-27 at 11.06.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/7fe7c150-93c4-883a-56a5-fd3da32262e4.png">

# 3. Azure Function の設定

Authentication / Authorization をクリック

<img width="1052" alt="Screen Shot 2017-10-27 at 11.15.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/dff4593c-ae9c-4886-deec-14fd1570b318.png">

設定画面が出て来るので、`App Service Authentication` を `On` にして、Action to take when request is not authenticated を`Log in with Active Directory` に設定し、Azure Active Directory をクリック

<img width="580" alt="Screen Shot 2017-10-27 at 11.17.05 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/77f82451-5300-7301-4db4-6464c54ac61f.png">

設定に行く前に、先ほど設定したSign up or Sign in Policy を開いてみるとつぎのような画面になっている。赤で囲んだところをコピーしておく。よくみると、Application で設定した値が設定されているのがわかるだろう。

<img width="577" alt="Screen Shot 2017-10-27 at 11.18.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d07e8eb8-8654-dc48-ba06-6bca0c0039d8.png">


そして、先ほどの、AD の設定画面に戻る。

Client ID に Application を作成したら取得できた Application ID をセットする。Issuer Url には、先ほど Sign up or Sign in Policy で取得したURLを貼っておく。これは、AD B2C とテナントの発行者のURL。

<img width="576" alt="Screen Shot 2017-10-27 at 11.20.31 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/5216b31b-5074-7234-ca6b-39820c4af212.png">

これで設定OK！しっかりセーブしておこう

<img width="575" alt="Screen Shot 2017-10-27 at 11.20.55 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/08cbd8ac-cdd6-d46d-efe2-5131e81fccd6.png">

4. 動作確認

Sign up or Sign in Policyをサイド開けてみよう。よくみると、Run now というボタンがある。実はこれで設定を試せる。押してみよう。

<img width="574" alt="Screen Shot 2017-10-27 at 11.31.42 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/20bfd652-96e8-2463-27bf-45fe27ea3831.png">


できてるっぽい

<img width="1346" alt="Screen Shot 2017-10-27 at 11.33.37 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/d2380587-4ed6-31ae-7806-3196441c4ab3.png">

せっかくなので、さっき作ってみた Azure Functions をテストしてみる。テスト実行してみると、しっかり、401 の認証エラーになる。さて、最後のテスト

<img width="1148" alt="Screen Shot 2017-10-27 at 11.35.17 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/7f2dc0ea-96b3-6fb0-ef2e-30c4358dd65a.png">

Azure Functions のURLを入れてブラウザを叩く。Sign up/in 画面きたー！アカウントないから、サインアップする。

<img width="1329" alt="Screen Shot 2017-10-27 at 11.36.33 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/2888e120-d926-0411-fca0-15fb851bfb9e.png">

ちゃんと、e-mail が本当にあるか確認してくれる。そしてセーブ。

<img width="440" alt="Screen Shot 2017-10-27 at 11.37.07 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/650f4743-1a75-545e-a957-a49587d199fa.png">

認証されて動いた！！！

<img width="855" alt="Screen Shot 2017-10-27 at 11.38.27 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/a4cacdce-89a0-642e-f7d4-1f6b52f67c69.png">



そして、AD B2C の方には新しいユーザが登録されている。

<img width="1076" alt="Screen Shot 2017-10-27 at 11.39.11 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/e096c4f7-8225-7fd6-9c1a-c011bf6c7b03.png">

# 終わりに

次回は、Facebook 認証と多要素認証について書いてみたい！これは楽チンだわ。