こんにちは。Kaneyasuです。
本記事はこちらの記事の続編です。
今度はCognitoを使ってRedmineにOAuth認証を実装してみます。
本記事の対象者
本記事はCognitoとRedmineを使って、OAuth認証を実装する方法を紹介しています。
RedmineはEC2・ALB・ACM・Route53を用いて構築しています。
Redmine本体のセットアップ方法と、EC2・ALB・ACM・Route53の設定方法については、端折っていますので、これらの基本操作を把握されている方が対象となります。
Redmineのセットアップ
まずはRedmineのセットアップを行います。
サーバーはEC2を使い、各種設定を簡略するためにBitnamiのRedmineのAMIを使用します。
後で出てくるプラグインが、Redmine 5.1.0以上のバージョンを要求するため、Redmine 5.1.0以上のバージョンを選択します。
なお、管理者ログインのためのパスワードは、EC2のシステムログで確認ができます。
Bitnami系の仮想マシンは大体この仕様のようです。
EC2の詳細画面で、アクション>モニタリングとトラブルシューティング>システムログを取得をクリックをクリックします。
システムログのどこかに、管理者ユーザーのパスワードが出ています。
ただし、起動して時間がかかっていたり、何度も再起動しているとログが流れている可能性があります。
その場合は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としています。
ヘルスチェックのURLは、Redmineのログイン画面のURLが使えます。
- URL
- /login
- プロトコル
- HTTP
- ステータス
- 200
ターゲットグループを作ったら、ALBを作成します。
リスナーのプロトコルはHTTPSを選択し、ACMで作成した証明書を選択します。
ターゲットグループは先ほど作成したものを選択します。
ALBとドメインの紐付け
Route53でエイリアスレコードがCNAMEレコードを作成し、ドメインとALBを紐付けます。
HTTPSの動作確認
ここまででHTTPS化が完了しているはずです。
ブラウザでドメインを入力して、Redmineのログイン画面が表示されることを確認します。
RedmineのOAuth認証用プラグインの導入
今回はこちらのプラグインを使用させていただきます。
RedmineのEC2にSSHでログインし、OAuth認証用のプラグインを導入します。
プラグインのページにインストールコマンド一式が書いてありますが、BitnamiのRedmineはパスが少し異なります。
パスを調整すると以下のコマンドになります。
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のユーザープールを作成し、アプリケーションクライアントを作成します。
ここの手順は前回の記事を参照してください。
新しく作成したアプリケーションクライアントで、ホストされた UI
を有効化します。
ホストされた UI
の設定も前回の記事を参照してください。
ホストされた UI
のコールバックURLは、プラグインのページに書いてあるURLを使用します。
こちらですね。
https://yourdomain/oauth2callback
yourdomain
は、Route53で設定したドメインを入力します。
HTTPSであることがポイントです。
HTTPSでないと、アプリケーションクライアントにコールバックURLとして登録できません。
もしかしたら、コールバックURLを追加するだけで、アプリケーションクライアント自体は使いまわしてもいいのかもしれません。
こちらは未検証なので、試してみた方がいいかもしれません。
Redmineの設定
Redmineに管理者でログインし、設定画面を開きます。
ホスト名とパス
をRoute53で設定したドメインに変更します。
プロトコル
はHTTPSに変更します。
Redmine OAuth pluginの設定
Redmineに管理者でログインし、プラグインの設定画面を開きます。
Redmine OAuth pluginの設定画面を開きます。
設定内容は下記の通りです。
表に書いていないものはデフォルト値のままとなります。
項目 | 設定内容 |
---|---|
Provider | Customを選択します |
Clent ID | CognitoのアプリケーションクライアントのIDを入力します。 |
Client Secret | Cognitoのアプリケーションのシークレットを入力します。 |
Provider name | 任意の文字列を入力します。Redmineのログイン画面に出るボタンの表記になります。 |
Auth endpoint | Cognitoのホストされた UIのURLを入力します。 |
Token endpoint | Cognitoのアプリケーションクライアントのトークンエンドポイントを記述します。 |
Profile endpoint | CognitoのアプリケーションクライアントのUserinfo エンドポイントを記述します。 |
UID Field | ここで書いた属性がRedmine側のログインIDになります。 今回はemailにしました。 |
これで設定は完了です。
Redmineでログイン確認
Redmineのログイン画面で、Cognitoのボタンが表示されていることを確認します。
クリックするとCognitoのログイン画面に遷移します。
ログインするとRedmineの画面に戻り、ユーザーの作成画面に遷移します。
ログインIDにCognitoから取得したemailが入力されていることを確認します。
氏名を入力して保存します。
パスワードは入力しなくても通ります。
保存すると一旦、管理者の承認待ちになります。
管理者が承認すると、次回ログインからはRedmineにログインできます。
以上で完了です。