RedmineにAzureユーザでログイン

Docker for Macで試しました。
ちなみにAzureなどはまだまだ開発中らしくWebインターフェースがよく変わるので
以下のスクリーンショットとは異なる場合があります。

Redmineはdocker-composeを使ってサクッと構築します。
こちらを利用させていただきました。
とりあえず動くことを確認するだけなのでほとんどそのままですが、
一応docker-compose.ymlを載せておきます

version: '2'

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

  redmine:
    image: sameersbn/redmine:4.0.5
    container_name: redmine
    depends_on:
    - postgresql
    environment:
    - TZ=Asia/Tokyo

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

    - REDMINE_PORT=10083
    - REDMINE_HTTPS=false
    - REDMINE_RELATIVE_URL_ROOT=
    - 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:
    - ./redmine:/home/redmine/data

とりあえずhttp://localhost:10083にアクセスしてRedmineが起動できていることを確認します。

redmine_oauth_001.png

次にRedmineにプラグインをインストールします。
こちらのRedmine Omniauth Azure pluginを利用させていただきました。
READMEの通り、Redmineのボリュームのプラグインフォルダに移動してgit cloneします。

% cd redmine/plugins
% git clone https://github.com/Gucin/redmine_omniauth_azure.git

その後、Redmineのコンテナを再起動するだけでインストールされると思います。
便利ですねー。

redmine_oauth_002.png

ここで一旦Azure側の設定に移ります。
AzureポータルからAzureADを開いてアプリの登録を選択し、「+新規登録」を選択します。

azure_redmine_001.png

名前は適当で、リダイレクトURIはひとまず
https://localhost:10083/oauth2callback_azure」としておいてください。
この画面だとhttpsにしないと進めないのであとで書き換えます。

azure_redmine_002.png

作成するとこんな感じです。
黒で塗り潰してますが、クライアントIDとテナントIDは後で使います。

azure_redmine_003.png

ブランドでホームページURLに「http://localhost:10083/login」としておいてください。

azure_redmine_004.png

証明書とシークレットでクライアントシークレットを作成します。

azure_redmine_005.png

作成されたクライアントシークレットは後で使うのでメモっといてください。

azure_redmine_006.png

APIのアクセス許可で管理者の同意を与えます。

azure_redmine_007.png

これをやっておけば以下の画面で承諾する必要がなくなる?と思います。

azure_redmine_008.png

マニフェストでreplyUrlsWithTypeにあるhttpsからsを外します。
本番で使うならhttpsにしてくださいね。

azure_redmine_009.png

次にこの登録したアプリに対してアクセス権を付与します。
AzureADのエンタープライズアプリケーションを開くと作成したRedmineがあると思います。

azure_redmine_010.png

それを開くとユーザーが追加できるようになっているので、AzureADユーザーを追加します。
ここでは適当にuserというユーザを作成しました。
ここで割り当てたユーザーだけが認証できるようになるはず。

azure_redmine_011.png

そうすると追加したAzureADユーザーのアクセスパネルに、
登録したRedmineのアイコンが表示されると思います。
これ便利ですよね。
グループ単位でアクセス権与えようとすると金かかるのが残念。

azure_redmine_012.png

アイコンをクリックするとRedmineのログイン画面が表示されると思います。

ここで、Redmine側の設定に戻ります。
管理者アカウントでログインして、Redmine Omniauth Azure pluginの設定画面を開きます。
Azureでアプリ登録時に生成された、クライアントIDとテナントIDとクライアントシークレットをコピペして、 Oauth authenticationにチェックを入れて、適用をクリックします。

redmine_oauth_003.png

ログアウトするとRedmineのログイン画面に「Login via Azure」というボタンが表示されますので、
クリックします。

redmine_oauth_004.png

この手順で進めているなら、アクセスパネルにAzureADユーザー(user)でログイン済みのはずなので、
以下のスクリーンショットのようになると思います。
認証が通ったのでRedmine側にユーザーが作られた状態です。

redmine_oauth_005.png

管理者アカウントで作成されたユーザーを有効にしてください。

redmine_oauth_006.png

ログオフして、再度「Login via Azure」をクリックするとuserでログインできると思います。

redmine_oauth_007.png

これで、AzureADでログイン認証していれば、
いちいちRedmineにログインするときにIDとパスワードを入力する手間が省けます。
これが無料でできるのは素晴らしいですね。
けど、管理者以外は多要素認証にお金がかかっちゃうのが微妙ですよねー。