オンプレRedmineにGoogleアカウントでログイン

AzureADアカウントでのログインは 以前 投稿しましたが、
Googleアカウントでのログインは書いてなかったなと思いましたので書きました。

Redmineは sameersbn/redmine のコンテナを利用させてもらって
docker-composeで構築します。
デフォルトから自己証明書のHTTPSでアクセスするために
nginxのリバースプロキシを加えたりしていますので こちらの投稿 を参考にしてください。
docker-compose.ymlは最後に丸ごと記載しています。
ちなみにRedmineのバージョンは4.1.0で確認しています。

GCP側の準備

Google OAuth2は こちら で公開されているプラグインを利用させていただきます。
更新がストップしてからかなり経つようですが、4.1系でも動くようです。
適当なプロジェクトを作成しましたら、Google API Consoleにアクセスして、OAuth同意画面に進みます。

gitlab_google_oauth2_00001.png

ユーザーの種類は、今回はテストなので外部としています。

gitlab_google_oauth2_00002.png

次に、認証情報にて「認証情報を作成」⇒「OAuth クライアント ID」に進みます。

gitlab_google_oauth2_00003.png

こちらで入力する内容はプラグインのページを参考にしてください。
僕の環境では以下のようになりますが、ドメインなど各自の環境に合わせて変更してください。

承認済みのJavaScript生成元 : https://example.tsuchinokometal.com
承認済みのリダイレクトURI : https://example.tsuchinokometal.com/redmine/oauth2callback
redmine_google_oauth2_001.png

作成すると、以下の画面が表示されるので、クライアントIDとシークレットをメモっておいてください。

gitlab_google_oauth2_00005.png

Redmine Omniauth Google pluginのインストール

Redmineコンテナにプラグインをインストールします。
ボリュームにあるpluginsフォルダで以下のコマンドを実行してください。
(あとで出てくるdocker-compose.ymlの場合だと、./volumes/redmine/plugins/ですね)

$ git clone https://github.com/twinslash/redmine_omniauth_google.git
$ docker restart redmine

システム管理者でログインしてプラグインを確認すると、
「Redmine Omniauth Google plugin」が追加させていますので、設定に進みます。

redmine_google_oauth2_002.png

作成したクライアントIDとシークレットを入力します。
G Suiteを利用している場合は、Available domainsに独自ドメインを入力してください。

redmine_google_oauth2_003.png

ログオフしてログイン画面を表示すると、
以下のように「Login via Google」ボタンが表示されますので、
そこをクリックするとシングルサインオンすることができます。

redmine_google_oauth2_004.png

認証画面が出ますので、自分のGoogleアカウントで認証してみてください。

gitlab_google_oauth2_00007.png

うまくいけばユーザー登録画面が表示されます。
ローカルにユーザーを作成してGoogleアカウントでも認証できるようにする形となります。
試しに設定したパスワードとログインIDでもログインできることは確認しました。
個人的には内部認証できなくしてGoogle OAuth2による認証だけにしたいんですが、
できないんですかね。
ちなみにアカウント登録を自動化しないとシステム管理者で承認しないと登録されません。

redmine_google_oauth2_005.png

今回使用したdocker-compose.ymlです。
ポイントはnginxを使っているところと、

REDMINE_HTTPS=true
REDMINE_RELATIVE_URL_ROOT=/redmine

としているところですかね。

version: '3'

services:
  redmine_postgresql:
    image: sameersbn/postgresql:9.6-4
    container_name: redmine_postgresql
    environment:
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production
    volumes:
    - ./volumes/postgresql:/var/lib/postgresql

  redmine:
    image: sameersbn/redmine:4.1.0
    container_name: redmine
    depends_on:
    - redmine_postgresql
    environment:
    - TZ=Asia/Tokyo

    - DB_ADAPTER=postgresql
    - DB_HOST=redmine_postgresql
    - DB_PORT=5432
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production

    - REDMINE_PORT=10083
    - REDMINE_HTTPS=true
    - REDMINE_RELATIVE_URL_ROOT=/redmine
    - REDMINE_SECRET_TOKEN=

    - REDMINE_SUDO_MODE_ENABLED=false
    - REDMINE_SUDO_MODE_TIMEOUT=15

    - REDMINE_CONCURRENT_UPLOADS=2

    - REDMINE_BACKUP_SCHEDULE=
    - REDMINE_BACKUP_EXPIRY=
    - REDMINE_BACKUP_TIME=

    - SMTP_ENABLED=false
    - SMTP_METHOD=smtp
    - SMTP_DOMAIN=www.example.com
    - SMTP_HOST=smtp.gmail.com
    - SMTP_PORT=587
    - SMTP_USER=mailer@example.com
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=:login

    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=mailer@example.com
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_INTERVAL=30

    ports:
    - "10083:80"
    volumes:
    - ./volumes/redmine:/home/redmine/data

  nginx2:
    image: nginx
    container_name: nginx2
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./certs:/certs
    ports:
      - "80:80"
      - "443:443"