Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Keycloak を使って管理者だけが Node-RED に SSO ログインできるようにした

Last updated at Posted at 2023-01-15

Keycloak を使って管理者だけが Node-RED に SSO ログインできるようにした

image.png

Node-RED を管理しているメンバーが何人かいるのですが、共用管理者アカウントではなく各自のアカウントで SSO できるようにし、かつ管理者のみにアクセスを限定したかったので対応してみました。

前提条件

Keycloak の管理者グループに admin ロールを割り当て、対象ユーザーは管理者グループに所属していることを前提としています。

try0ut.ml というドメインで構築しているものとします。

バージョン

name ver.
Keycloak v20.0.2
Node-RED v3.0.2

個別ユーザーで SSO ログインできる設定

[Keycloak] Client scope を作成する

  1. openid クライアントスコープを追加します。
    • Name: openid
    • Type: Optional
    • Include in token scope: ON
  2. 'Save' ボタンを押します。

[Keycloak] Client を作成する

  1. oidc-nodered クライアントを追加します。
    • Client type: OpenID Connect
    • Client ID: oidc-nodered
    • Client authentication: ON
    • Valid redirect URIs: https://nodered.try0ut.ml/*
  2. 'Save' ボタンを押して、'Credentials' タブが表示されたら Client secret をメモしておきます。
  3. 'Client scopes' タブに切り替えて、openid スコープを追加します。Assign type は、Default に設定します。

[Node-RED] 認証情報を設定する

  1. Node-RED のユーザーフォルダ (e.g. /data) に、passport-keycloak-oauth2-oidc をインストールしておきます。

    $ npm install passport-keycloak-oauth2-oidc
    
  2. settings.js で adminAuth を設定します。

    settings.js
    adminAuth: {
      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

[Node-RED] 個別ユーザーでログインする

  1. guest ユーザーで Keycloak にログインします。
  2. Node-RED を開き、Sign in ボタンをクリックします。
  3. ログインできることを確認します。

管理者ユーザーだけが SSO ログインできる設定

[Keycloak] 管理者ユーザーを登録する

  1. administrators グループを作成し、管理者にしたいユーザーを追加します。
  2. Role mapping を開き、admin ロールを追加します。

[Keycloak] roles スコープを修正する

  1. Client scope から roles スコープを開きます。
  2. Include in token scopeON になっているか確認します。
  3. 'Mappers' タブから client roles を開き、設定を確認します。
  4. 'Mappers' タブから realm roles を開き、設定を確認します。ここでは、'Token Claim Name' を roles に書き換える必要があります。1

[Node-RED] admin ロールによるログインを許可する

  1. settings.js で adminAuth を設定します。ベースは、個別アクセスの時の設定を使います。

    1. verify を書き換えます。参考元2と違い、passport-keycloak-oauth2-oidc では、グループは取れないのでロールを使います。
      なお、管理者以外はエラーメッセージを表示させてログインできないようにしておきます。
    settings.js
    verify: function(token, tokenSecret, profile, done) {
      if (profile.roles.includes('admin')) {
        profile.username = 'admin';
        done(null, profile);
      } else {
        done(new Error('Operation not permitted.'));
      }
    }
    
    1. users を書き換えます。
    settings.js
    users: [
      {
        username: 'admin', permissions: ['*']
      }
    ]
    
  2. 設定が反映されるように Node-RED を再起動します。

[Node-RED] 非管理者ユーザーでログインを試す

  1. guest ユーザーで Keycloak にログインします。
  2. Node-RED を開き、Sign in ボタンをクリックします。
  3. エラーメッセージが表示されてログインできないことを確認します。

[Node-RED] 管理者ユーザーでログインする

  1. admin ユーザーで Keycloak にログインします。
  2. Node-RED を開き、Sign in ボタンをクリックします。
  3. ログインできることを確認します。なお、[keycloak] administrators グループに所属する他ユーザーでも admin としてログインできます。
  1. https://stackoverflow.com/questions/57997377/get-the-user-roles-with-the-keycloak-userinfo-endpoint

  2. https://discourse.nodered.org/t/oauth-openid-login-with-keycloak/54144/3

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?