🚀

Auth0でユーザーにデフォルトのロールを振りたい

に公開

概要

Auth0でユーザーにデフォルトのロールを付与する方法をまとめました。
デフォルトでこれくらい用意してくれよと思うのですがそのような機能はないので、公式ブログを参考にAuth0 Actionの機能を使って初回ログイン後にロールを付与するようにしました。

https://auth0.com/blog/assign-default-role-on-sign-up-with-actions/
https://www.youtube.com/watch?v=rWiviV1ziJw&t=1141s

ただし、この方法ではMachine to Machine Authenticationのtokenを使用するようなので注意してください。(Tokens issued for Auth0 Management APIの扱いでNot Countedにしてくれないのか・・・と思ったりするんですが、もしこの辺わかる方いれば教えて下さい・・・)

ユーザーとロールとパーミッションについて

それぞれの意味と関係性についてざっくりとまとめました。

単語 意味
パーミッション (Auth0のアプリケーションとしての)APIごとに任意の数設定される値
JWTのscopeフィールドと(設定次第で)permissionsフィールドに含められます
ロール (APIに跨って)複数のパーミッションと紐づけることができる、認可権限の管理単位
ユーザー IdPとしてのAuth0(Auth0で作成したアプリケーション)にログインできるユーザーのこと
紐づけられたロールに紐づけられたパーミッションが紐づけられます

※本記事では割愛しますが、ユーザーに(ロールを介さず)直接パーミッションを付与することもできます

注意点としてAuth0で作成したAPIの設定としてRBACを有効にしないと、ユーザーに紐づけるパーミッションの設定は意味がありません(RBACが無効な場合、要求されたscope(=パーミッション)がすべてユーザーに付与されたJWTが払い出されます)。
下記記事に設定について記載しているので、よろしければこちらも参考にしていただければと思います。
https://zenn.dev/yuuri23/articles/aba2009e518d20#auth0%2Fapiのrbacの有効化

ロールの作成

ダッシュボードの「ユーザー管理」>「ロール」の画面の「+ロールを作成」のボタンを押下します。
その後適当な名前と説明を入力してロールを作成します。

作成されたロールのrol_から始まるロールIDは後ほど使うのでメモしておきます。

ロールの設定画面の「パーミッション」からAuth0のAPIの画面で作成したパーミンションをロールへ紐づけることができます。

Auth0 Actionの作成

作成するアクションの概要

Auth0 ActionはNodeJSのスクリプトをAuth0の任意のイベント(ログイン時など)をトリガーに実行する機能です。
Login/Post Login イベントをトリガーにAuth0のManagement APIのロール割当のエンドポイントをAuth0 Actionから叩き、ログインしたユーザーが初めてログインする場合にロールの割当処理を行うようにします。

Management APIの設定の確認と権限の付与

アクションの中から使用するために、「アプリケーション」>「アプリケーション」から新規アプリケーションを作成します。
作成後、APIの「Auth0 Management API」の設定画面を開き「認可済」にチェックをいれます
また下記パーミッションにチェックを入れ、「更新する」をクリックして設定を保存します。

  • read:client_grants
  • update:users
  • create:role_members

その後アプリケーションの「設定」から下記値をメモします。

  • ドメイン
  • クライアントID
  • クライアントシークレット

アクションの作成

「アクション」>「ライブラリー」の画面を開き、「アクションの作成」>「初めから構築する」を押下して

下記の23行目のYOUR_ROLE_IDを「ロールの作成」の章でメモしたロールIDへ置換し、設定画面のエディタへ貼り付けます。

/**
* Handler that will be called during the execution of a PostLogin Flow.
*
* @param {Event} event - Details about the user and the context in which they are logging in.
* @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.
*/
exports.onExecutePostLogin = async (event, api) => {

  // Check if the user has a role assigned
  if (event.authorization && event.authorization.roles && event.authorization.roles.length > 0) {
    return;
  }

  // Create management API client instance
  const ManagementClient = require("auth0").ManagementClient;

  const management = new ManagementClient({
    domain: event.secrets.DOMAIN,
    clientId: event.secrets.CLIENT_ID,
    clientSecret: event.secrets.CLIENT_SECRET,
  });

  const params =  { id : event.user.user_id };
  const data = { "roles" : ["YOUR_ROLE_ID"] };

  try {
    await management.users.assignRoles(params, data);
  } catch (e) {
    console.log(e);
  }
};

「シークレット」へ下記の「Management APIの設定の確認と権限の付与」でメモした値を追加します

  • DOMAIN
  • CLIENT_ID
  • CLIENT_SECRET

「依存関係」へ下記を追加します。

  • 名前
    • auth0
  • バージョン
    • latest
      • デプロイボタンを押したときに最新バージョンへ自動で置換されます

最後に「デプロイ」を押下してデプロイします。

Auth0 Actionの設定

「アクション」>「トリガー」を開き「post-login」を押下します

「アクションの追加」>「カスタム」の中にある前の章で作成したアクションをドラッグアンドドロップし、「適用」ボタンを押下し設定します。

以上でユーザーが初回ログイン後にロールが付与されるようになりました。

Discussion