Azure AD Application Proxyの代わりに、nginxでAzureADの認証情報(ADAL)を使用した認証を実装(2/3)

これの続きです。
[Azure AD Application Proxyの代わりに、nginxでAzureADの認証情報(ADAL)を使用した認証を実装(1/3)](http://qiita.com/undersoon/items/ce32f2ef103266d6e7b3)
[Azure AD Application Proxyの代わりに、nginxでAzureADの認証情報(ADAL)を使用した認証を実装(2/3)](http://qiita.com/undersoon/items/db8163709ad85353215e)

最後に「Azure AD上にOauth2用のネイティブアプリケーションを用意。ディレクトリのリード権も付与。」を書きます。。

# (AzureAD側の操作)アプリの登録。

0. AzureADのテナントIDを調べるため、「Azure Active Directory」-「プロパティ」からディレクトリIDを覚えておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/b2f0e6c0-ad08-8d8f-0719-d3fcf1261e41.png)
0. Azure Portalにログインして、Azure Active Directoryから「アプリの登録」-「新しいアプリケーションの登録」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/05d47392-2945-9961-77a7-c9eca4d5ae31.png)
0. いったん、登録内容は適当にして「Webアプリ/API」を作成する。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/542585d3-acd0-631e-7d31-d23e4c09530d.png)
0. 作成したアプリのプロパティを確認し、アプリケーションIDを覚えておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/c94667f0-00d4-0e26-cf08-e7068316eca1.png)
0. 続いて、秘密鍵を作成し、鍵を覚えておく(※一度生成された鍵は二度と再確認できなくなるので必ずメモ等しておくこと)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/3b3400ae-f22a-eab7-6e3c-a8c0ab7998b4.png)
0. 続いて、WebアプリがAzureADのユーザ情報を閲覧できるようにする必要があるので、下記のように設定する。※なんとなく、対象のアクセス権にチェックを入れたら即時反映されそうな雰囲気があるが、「保存」ボタンを押すことを忘れないように。(一回、保存ボタンを押し忘れてはまりました。。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168390/a534e518-0905-e000-5178-3083eb2f53f0.png)

# Linuxインスタンス側の操作

1) oauth2用のconfigを作成。
下記のようなconfigを用意する。

```text
client_id = <"「(AzureAD側の操作)アプリの登録。」の手順4で確認したID>"
client_secret = "<「(AzureAD側の操作)アプリの登録。」の手順5で確認したID>"
http_address="http://127.0.0.1:4180"
provider = "azure"
azure-tenant=<"「(AzureAD側の操作)アプリの登録。」の手順1で確認したID>"
cookie_secret = "<適当な文字列>"
cookie_domain = "<nginxのURL>"
email_domains = [
  "*"
]
upstreams = [
    "file:///dev/nul"
]
```  

2) oauth2_proxy起動用のシェルスクリプトを用意し、下記スクリプトでoauth2_proxyを起動する。

```text
nohup /usr/lib/golang/bin/oauth2_proxy -config="<作成したconfig>" > oauth_proxy_4180.nohup.out &
```

3) nginxのconfigを下記のようなconfigを用意する。※今回の件に関係ないconfig箇所は割愛。

```text
server {
    listen 80;
    server_name tekitouapprp.hoge.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name tekitouapprp.hoge.com;

    location = /oauth2/auth {
      internal;
      proxy_pass http://127.0.0.1:4180;
      proxy_set_header Host $host;
      proxy_pass_request_body off;
      proxy_set_header Content-Length "";
    }

    location = /oauth2/start {
      internal;
      proxy_pass http://127.0.0.1:4180;
      proxy_set_header Host $host;
      proxy_pass_request_body off;
      proxy_set_header Content-Length "";
    }

    location = /oauth2/callback {
      auth_request off;
      proxy_pass http://127.0.0.1:4180;
      proxy_set_header Host $host;
    }

    location = /custom_400.html {
      internal;
      root html;
    }

    location / {

        # Azure AD oauth
        auth_request /oauth2/auth;
        error_page 401 = /oauth2/start?rd=$uri;

        # piyo.co.jpをリバプロする場合、第一引数がpiyo.co.jpのドメイン部、第二引数がnginxのドメイン部にする。
        sub_filter 'piyo.co.jp' 'tekitouapprp.hoge.com';
        sub_filter_once off;

        # リバプロしたいURLを記載する。
        proxy_pass https://piyo.co.jp/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_no_cache 1;
        proxy_cache_bypass 1;
        sendfile off;
    }
}
```
 
以上です。うまくいけば、nginx側のconfigの書き方次第ですが、Azure Application Proxyよりも柔軟なリバプロができるはずです。

お詫び：
完全にうる覚えなので、設定すべき内容が不足しているかもです。
そのときは気づいたベースで修正します。