App ServiceでSpring Boot + Thymeleaf + Twitter認証

「Twitterでログイン」の認証機能をMicrosoft AzureのApp Serviceにある**「認証/承認」**で簡単に作れることを知ったのでメモします。

公式ドキュメントは以下です。
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-mobile-how-to-configure-twitter-authentication

試したのはSpring Boot + Thymeleafのアプリです。

# Twitter側の準備

まずはTwitterでアプリを登録します。
https://apps.twitter.com/

以下、少し長いですが、既に登録したことがある方は読み飛ばしてください。

「Apply for a developer account」をクリック
![2018-09-24_23h48_47.png](https://qiita-image-store.s3.amazonaws.com/0/47737/e28c9e4b-3bf6-4177-240b-c08be970426e.png)

Twitterで電話番号を登録していない場合はここで登録が必要です。
![2018-09-24_23h49_02.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b2345750-fb0c-386d-a302-7262bc802817.png)

Country/regionでJapanを選択して番号を入力
![2018-09-24_23h49_22.png](https://qiita-image-store.s3.amazonaws.com/0/47737/7cb3d6b2-13d5-705b-3ded-5b7779e59f74.png)

登録した電話番号にVerify codeが来るので入力
![2018-09-24_23h49_44.png](https://qiita-image-store.s3.amazonaws.com/0/47737/2d11507c-f86a-4d1f-10ff-08acef89b629.png)

進みます(既に電話番号登録されていた方はここから）
![2018-09-24_23h49_56.png](https://qiita-image-store.s3.amazonaws.com/0/47737/57cb41db-6c7e-916d-944e-d246bc503aeb.png)

誰が使うのか聞かれます。個人利用なのでpersonal useを選択しました。Account nameはTwitterアカウントの@移行を入力。（何でも構いません）
![2018-09-24_23h50_44.png](https://qiita-image-store.s3.amazonaws.com/0/47737/a1858287-906a-8d84-52a6-8232b92c411f.png)

利用するプロジェクトに関する情報を入力します。今回は単なる検証なのでStudent project/Learning to codeとOtherを選択しました。利用用途の説明が最低300文字必要なのが辛いですね…。
![FireShot Capture 051 - Apply — Twitter Developers - https___developer.twitter.com_en_apply_usecase.png](https://qiita-image-store.s3.amazonaws.com/0/47737/6c8a79b8-90f9-2c31-8422-ddb179735c4d.png)

利用規約を読んで一番下までスクロールするとチェックボックスが有効となるのでチェックして次に進みます。
![FireShot Capture 052 - Apply — Twitter Developers - https___developer.twitter.com_en_apply_terms.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b95b67f1-4f30-efc9-b976-af946b68cf07.png)

設定は以上で、Twitterアカウントの登録メールアドレスへVerifyメールが来るのでメールにあるボタンをクリックしてVerifyします。
![2018-09-24_23h56_20.png](https://qiita-image-store.s3.amazonaws.com/0/47737/4746507c-af46-1b20-72f0-0e706173c71d.png)

ここからCreate an Appを押してアプリの登録へ進みます。
![2018-09-25_00h25_14.png](https://qiita-image-store.s3.amazonaws.com/0/47737/f9fbecf2-9fcd-9e9f-13ca-d48f3bbe18a4.png)

アプリ情報を入力します。Website URLとCallback URLはAzureにデプロイした後にわかるので、この時点では適当なものを入れて登録しておきます。
![2018-09-23_11h31_00.png](https://qiita-image-store.s3.amazonaws.com/0/47737/aac5c76a-ace9-c409-ae74-bff33070dc3c.png)

以上で準備完了です。

# App Serviceの設定

Twitterの準備ができたらApp Serviceの設定を行います。

今回サンプルに使ったコードは次に置いてます。
https://github.com/kikutaro/AzureAuthSpringBoot

前に書いた[「Spring Boot on Microsoft Azure」](https://qiita.com/kikutaro/items/251aebc572794105a524)のWebアプリをベースにしています。Thymeleafの依存性を入れてindex.htmlに以下の定義を加えた程度です。

```html
<p><a th:href="@{'/.auth/login/twitter'}">Twitter Login</a></p>
<p><a th:href="@{'/.auth/logout'}">Twitter Logoff</a></p>
```

cloneしたアプリをビルドしてデプロイします。

```
az login
```

```
.\mvnw.cmd clean package
```

```
.\mvnw.cmd azure-webapp:deploy
```

デプロイが終わったらApp Serviceの設定にある「認証/承認」をクリックして、「オフ」を「オン」に切り替えます。
![2018-09-24_23h21_10.png](https://qiita-image-store.s3.amazonaws.com/0/47737/adb7cce9-80e1-28a4-60b0-a8fff96b7032.png)

「オン」にすると認証プロバイダが表示されるので、Twitterを選択します。
![2018-09-24_23h21_31.png](https://qiita-image-store.s3.amazonaws.com/0/47737/c231e0be-7d22-daf4-0941-d77971513fe1.png)

するとAPIキーとAPIシークレットを求められるので再びTwitterの設定に戻ります。
![2018-09-23_11h28_37.png](https://qiita-image-store.s3.amazonaws.com/0/47737/7ea7f8f9-3999-8462-0efa-c33e18e84ebe.png)

登録したアプリからAPIキーとAPIシークレットをコピーして先ほどのAzureの設定画面にペーストして保存します。
![2018-09-24_23h43_13.png](https://qiita-image-store.s3.amazonaws.com/0/47737/67f48006-f777-3bbc-aa4d-43eeed5ccdaa.png)

続けて、先ほど適当なURLを入力していた部分にデプロイされたアプリのURLを設定します。Azureで発行されたURLをコピーします。
![2018-09-25_01h02_38.png](https://qiita-image-store.s3.amazonaws.com/0/47737/50c001f3-c833-c8e8-17ed-f972e32d508b.png)

TwitterのsettingでWebsiteにURLを入れ、Callback URLsに「発行されたURL/.auth/login/twitter/callback」と設定します。
![2018-09-25_01h05_51.png](https://qiita-image-store.s3.amazonaws.com/0/47737/64de454e-70d2-8750-5812-38294f87d50c.png)

以上で設定完了です。

# 動作確認

動作確認をします。デプロイで発行されたURLにアクセスすると次のようなページが表示されるので、まずは、1つ目の「Check Body & Header」をクリックします。
![2018-09-24_23h25_07.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b8fd67eb-6fb1-7549-f7ee-67d71bd313ed.png)

すると以下のような表示となります。
![2018-09-24_23h25_15.png](https://qiita-image-store.s3.amazonaws.com/0/47737/adb1a3a6-c2c0-c48a-9d68-eb656ce0a81d.png)

Javaのコードでは次のようにリクエストボディとリクエストヘッダを出力するように記述しているので、上記のようにヘッダの内容が出力されました。

```java

@GetMapping("/check")
public String check(@RequestBody(required = false) String body, @RequestHeader(required = false) HttpHeaders headers, Model model) {
    model.addAttribute("return", "This is from server side.");
    if(body != null) {
        model.addAttribute("body", body);
    }
    if(headers != null) {
        model.addAttribute("headers", headers);
    }
    return "check";
}
```

ここで戻って、今度は「Twitter Login」のリンクをクリックします。すると以下の認証画面が表示されるので、「連携アプリを認証」してください。
![2018-09-24_23h25_25.png](https://qiita-image-store.s3.amazonaws.com/0/47737/cec159fd-7de4-4152-aa08-fe5c05c11a6f.png)

しばらくすると次のページが表示されます。Twitterでログインができたようです。RETURN TO THE WEBSITEで戻れるので戻ってみます。
![2018-09-24_23h25_32.png](https://qiita-image-store.s3.amazonaws.com/0/47737/d34fadcd-594e-130a-cb1d-5c39304c15e3.png)

戻ったら再度「Check Body & Header」を押します。
![2018-09-24_23h25_07.png](https://qiita-image-store.s3.amazonaws.com/0/47737/b8fd67eb-6fb1-7549-f7ee-67d71bd313ed.png)

するとTwitterで認証された後の今度はリクエストヘッダが色々増えていることがわかります。ここでTwitterのアカウントなどの情報から、Twitterのaccess token、access token secretがヘッダから渡ってきます。
![2018-09-24_23h25_43.png](https://qiita-image-store.s3.amazonaws.com/0/47737/766b0fbe-141e-6c83-7787-83b73a6c4818.png)

以上でTwitterログインが実現できました。認証後のページがAzureのデフォルトになっているので次はそこを変える方法を調べてみたいと思います。