Keycloak を使って管理者だけが Node-RED に SSO ログインできるようにした
Node-RED を管理しているメンバーが何人かいるのですが、共用管理者アカウントではなく各自のアカウントで SSO できるようにし、かつ管理者のみにアクセスを限定したかったので対応してみました。
前提条件
Keycloak の管理者グループに admin ロールを割り当て、対象ユーザーは管理者グループに所属していることを前提としています。
try0ut.ml
というドメインで構築しているものとします。
バージョン
name | ver. |
---|---|
Keycloak | v20.0.2 |
Node-RED | v3.0.2 |
個別ユーザーで SSO ログインできる設定
[Keycloak] Client scope を作成する
-
openid
クライアントスコープを追加します。- Name:
openid
- Type:
Optional
- Include in token scope:
ON
- Name:
- 'Save' ボタンを押します。
[Keycloak] Client を作成する
-
oidc-nodered
クライアントを追加します。- Client type:
OpenID Connect
- Client ID:
oidc-nodered
- Client authentication:
ON
- Valid redirect URIs:
https://nodered.try0ut.ml/*
- Client type:
- 'Save' ボタンを押して、'Credentials' タブが表示されたら Client secret をメモしておきます。
- 'Client scopes' タブに切り替えて、
openid
スコープを追加します。Assign type は、Default に設定します。
[Node-RED] 認証情報を設定する
-
Node-RED のユーザーフォルダ (e.g. /data) に、
passport-keycloak-oauth2-oidc
をインストールしておきます。$ npm install passport-keycloak-oauth2-oidc
-
settings.js
で adminAuth を設定します。settings.jsadminAuth: { type: 'strategy', strategy: { name: 'keycloak', label: 'Sign in', icon: 'fa-lock', autoLogin: 'true', strategy: require('passport-keycloak-oauth2-oidc').Strategy, options: { realm: 'master', clientID: 'oidc-nodered', clientSecret: '********', publicClient: 'false', authServerURL: 'https://keycloak.try0ut.ml', callbackURL: 'https://nodered.try0ut.ml/auth/strategy/callback', verify: function(token, tokenSecret, profile, done) { done(null, profile); } }, }, users: [ { username: 'guest', permissions: ['*'] } ] },
- realm: Keycloak の対象レルム(デフォルト:
master
) - clientID: Keycloak で作成したクライアントの ID
- clientSecret: clientID に紐づくシークレット
- publicClient:
false
(= clientSecret を使用) - authServerURL: Keycloak の URL
- callbackURL: Node-RED の URL +
/auth/strategy/callback
- realm: Keycloak の対象レルム(デフォルト:
[Node-RED] 個別ユーザーでログインする
管理者ユーザーだけが SSO ログインできる設定
[Keycloak] 管理者ユーザーを登録する
- administrators グループを作成し、管理者にしたいユーザーを追加します。
- Role mapping を開き、
admin
ロールを追加します。
[Keycloak] roles スコープを修正する
- Client scope から
roles
スコープを開きます。 -
Include in token scope が
ON
になっているか確認します。 - 'Mappers' タブから
client roles
を開き、設定を確認します。
- 'Mappers' タブから
realm roles
を開き、設定を確認します。ここでは、'Token Claim Name' をroles
に書き換える必要があります。1
[Node-RED] admin ロールによるログインを許可する
-
settings.js
で adminAuth を設定します。ベースは、個別アクセスの時の設定を使います。-
verify
を書き換えます。参考元2と違い、passport-keycloak-oauth2-oidc では、グループは取れないのでロールを使います。
なお、管理者以外はエラーメッセージを表示させてログインできないようにしておきます。
settings.jsverify: function(token, tokenSecret, profile, done) { if (profile.roles.includes('admin')) { profile.username = 'admin'; done(null, profile); } else { done(new Error('Operation not permitted.')); } }
-
users
を書き換えます。
settings.jsusers: [ { username: 'admin', permissions: ['*'] } ]
-
-
設定が反映されるように Node-RED を再起動します。
[Node-RED] 非管理者ユーザーでログインを試す
[Node-RED] 管理者ユーザーでログインする
-
admin
ユーザーで Keycloak にログインします。 - Node-RED を開き、Sign in ボタンをクリックします。
- ログインできることを確認します。なお、[keycloak] administrators グループに所属する他ユーザーでも admin としてログインできます。