EC2でRedmineを起動し、CognitoでOAuth認証を設定してみる

こんにちは。Kaneyasuです。

本記事はこちらの記事の続編です。

https://qiita.com/satoshi256kbyte/items/d743a91d03976d62a9cd

今度はCognitoを使ってRedmineにOAuth認証を実装してみます。

# 本記事の対象者

本記事はCognitoとRedmineを使って、OAuth認証を実装する方法を紹介しています。
RedmineはEC2・ALB・ACM・Route53を用いて構築しています。
Redmine本体のセットアップ方法と、EC2・ALB・ACM・Route53の設定方法については、端折っていますので、これらの基本操作を把握されている方が対象となります。

# Redmineのセットアップ

まずはRedmineのセットアップを行います。
サーバーはEC2を使い、各種設定を簡略するためにBitnamiのRedmineのAMIを使用します。  
  
https://bitnami.com/stack/redmine/cloud/aws/amis

後で出てくるプラグインが、Redmine 5.1.0以上のバージョンを要求するため、Redmine 5.1.0以上のバージョンを選択します。

なお、管理者ログインのためのパスワードは、EC2のシステムログで確認ができます。
Bitnami系の仮想マシンは大体この仕様のようです。

EC2の詳細画面で、アクション＞モニタリングとトラブルシューティング＞システムログを取得をクリックをクリックします。

![EC2の詳細画面で、アクション＞モニタリングとトラブルシューティング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/08b0f572-a7b0-5217-95f9-6f3147daca28.png)
![システムログを取得をクリック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/33a24833-3d4f-7ec7-4506-b516f40fdf9f.png)

システムログのどこかに、管理者ユーザーのパスワードが出ています。
ただし、起動して時間がかかっていたり、何度も再起動しているとログが流れている可能性があります。
その場合はEC2を作り直した方が早いでしょう。

# HTTPS化

RedmineをCognitoとOAuthで連携するためには、RedmineのHTTPS化が必要です。
前回のGitLabとは異なり、BitnamiのRedmineは単独だとHTTPS化が難しいので、ALB・ACM・Route53を使ってHTTPS化します。
（できないわけではありませんが、私は結構大変だと思います。）

## 証明書の用意

HTTPS化には、ALBに証明書を登録する必要があります。
証明書はACMで作成しておきます。
ACMで作成した証明書を有効にするには、Route53でドメインを登録して、CNAMEを設定する必要があります。
これらの作業を事前に行なっておきます。

ACMの証明書はALBと同じリージョンに作成してください。
私はいつもCloudFrontを使用しているので、バージニアでACMを作成してしまい、ALB側の選択肢に出てこなくて焦りました。

## ターゲットグループとALBの作成

ターゲットグループを作成、RedmineのEC2を登録します。
今回はALB＞EC2間の通信はHTTPとしています。

![ターゲットグループの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/b1e32155-b6a0-f715-155a-2145dd2951c5.png)

ヘルスチェックのURLは、Redmineのログイン画面のURLが使えます。

- URL
  - /login
- プロトコル
  - HTTP
- ステータス
  - 200
  
![ターゲットグループのヘルスチェック設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/ac5a4496-6987-2ded-1255-a5a7f8d22709.png)

ターゲットグループを作ったら、ALBを作成します。
リスナーのプロトコルはHTTPSを選択し、ACMで作成した証明書を選択します。
ターゲットグループは先ほど作成したものを選択します。

![リスナーのプロトコルはHTTPS](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/fca000ee-4f38-4b18-b8af-e96facab2ddd.png)

## ALBとドメインの紐付け

Route53でエイリアスレコードがCNAMEレコードを作成し、ドメインとALBを紐付けます。

## HTTPSの動作確認

ここまででHTTPS化が完了しているはずです。
ブラウザでドメインを入力して、Redmineのログイン画面が表示されることを確認します。

# RedmineのOAuth認証用プラグインの導入

今回はこちらのプラグインを使用させていただきます。

https://github.com/kontron/redmine_oauth

RedmineのEC2にSSHでログインし、OAuth認証用のプラグインを導入します。
プラグインのページにインストールコマンド一式が書いてありますが、BitnamiのRedmineはパスが少し異なります。
パスを調整すると以下のコマンドになります。

```bash
cd /bitnami/redmine/plugins
git clone https://github.com/kontron/redmine_oauth.git
chown -R www-data:www-data redmine_oauth
cd /opt/bitnami/redmine
bundle config unset deployment
bundle install
sudo /opt/bitnami/ctlscript.sh restart apache
```

# Cognito側の設定

Cognitoのユーザープールを作成し、アプリケーションクライアントを作成します。
ここの手順は前回の記事を参照してください。

https://qiita.com/satoshi256kbyte/items/d743a91d03976d62a9cd

新しく作成したアプリケーションクライアントで、`ホストされた UI`を有効化します。
`ホストされた UI`の設定も前回の記事を参照してください。
`ホストされた UI`のコールバックURLは、プラグインのページに書いてあるURLを使用します。
こちらですね。

`https://yourdomain/oauth2callback`

`yourdomain`は、Route53で設定したドメインを入力します。
HTTPSであることがポイントです。
HTTPSでないと、アプリケーションクライアントにコールバックURLとして登録できません。

![ホストされた UIの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/f1e9a985-b3b8-b07c-a219-d20be24f74e7.png)

もしかしたら、コールバックURLを追加するだけで、アプリケーションクライアント自体は使いまわしてもいいのかもしれません。
こちらは未検証なので、試してみた方がいいかもしれません。

# Redmineの設定

Redmineに管理者でログインし、設定画面を開きます。

![Redmineの管理画面を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/a1347255-9b73-ccf7-f7a9-e9831b3d3c7e.png)

`ホスト名とパス`をRoute53で設定したドメインに変更します。
`プロトコル`はHTTPSに変更します。

![ホスト名とプロトコルの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/1736787c-4c0a-0ad4-bcdc-12246b5b9674.png)

# Redmine OAuth pluginの設定

Redmineに管理者でログインし、プラグインの設定画面を開きます。

![Redmineの管理画面を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/a1347255-9b73-ccf7-f7a9-e9831b3d3c7e.png)

Redmine OAuth pluginの設定画面を開きます。

![Redmine OAuth pluginの設定画面を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/7e500217-70c7-b153-34e6-6f41ea2a40d6.png)

設定内容は下記の通りです。
表に書いていないものはデフォルト値のままとなります。

| 項目 | 設定内容 |
| --- | --- |
| Provider | Customを選択します |
| Clent ID | CognitoのアプリケーションクライアントのIDを入力します。 |
| Client Secret | Cognitoのアプリケーションのシークレットを入力します。 |
| Provider name | 任意の文字列を入力します。Redmineのログイン画面に出るボタンの表記になります。 |
| Auth endpoint | Cognitoのホストされた UIのURLを入力します。 |
| Token endpoint | Cognitoのアプリケーションクライアントの[トークンエンドポイント](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/token-endpoint.html)を記述します。 |
| Profile endpoint | Cognitoのアプリケーションクライアントの[Userinfo エンドポイント](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/userinfo-endpoint.html)を記述します。 |
| UID Field | ここで書いた属性がRedmine側のログインIDになります。<br>今回はemailにしました。 |

![Redmine OAuth pluginの設定内容](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/a81e7671-da6a-3128-fd3b-0d98f5f5610e.png)

これで設定は完了です。

# Redmineでログイン確認

Redmineのログイン画面で、Cognitoのボタンが表示されていることを確認します。
クリックするとCognitoのログイン画面に遷移します。

![Redmineのログイン画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/bc37aa39-a308-6669-a274-fa994c804eaa.png)

ログインするとRedmineの画面に戻り、ユーザーの作成画面に遷移します。
ログインIDにCognitoから取得したemailが入力されていることを確認します。
氏名を入力して保存します。
パスワードは入力しなくても通ります。

![Cognitoログイン後のユーザー作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/088f6de7-3199-229e-3052-e2ceb12bc8c4.png)

保存すると一旦、管理者の承認待ちになります。
管理者が承認すると、次回ログインからはRedmineにログインできます。

以上で完了です。