ぽぴなび

知って感動した技術情報・生活情報や買ってよかったものの雑記です。

【NestJS x Auth0】NestJSで作成したAPIにAuth0の認証/認可を追加する 〜認可(Auth0)編〜

前回の続きです。

  1. NestJSで作成したAPIにAuth0の認証/認可を追加する 〜準備編〜
  2. NestJSで作成したAPIにAuth0の認証/認可を追加する 〜準備編 その2〜
  3. NestJSで作成したAPIにAuth0の認証/認可を追加する 〜認証編〜

前回でトークンによる認証機能を実装することができましたが、
今のままでは認証が通っているユーザーであれば誰でもすべての操作ができてしまいます。

今回はゴールイメージで設定した2種類のロールを作成し、RBACを実装します。
この記事ではまずAuth0側の設定を行います。

参考記事

auth0.com

最終的なゴールイメージ

  • 実装済み】CRUDAPIがある:
    • POST /items
    • GET /items
    • GET /items/{:itemId}
    • PATCH /items/{:itemId}
    • DELETE /items/{:itemId}
  • 2種類のロールがある:
    • 管理者: CRUDすべての操作を実行可能
    • 利用者: CRUが実行可能
  • 実装済み】認証していない場合、Readのみ実行可能とする。

0. Auth0のUser、Role、Permissionの関係

Auth0のUser、Role、Permissionについて簡単に整理します。

  • Userは複数のRoleを持つことができます。
  • Roleは複数のPermissionを持つことができます。
  • Permissionはread:itemsのような文字列です。
    →上をまとめるとUserには複数のPermissionが割り当てられます。
  • NestJS側では、リクエストに付与されているトークンに各APIに対するPermissionが含まれているかどうかで権限があるかどうかを判断することができます。

今回は管理者、利用者 Roleを作成して、以下のような Permission を割り当てようと思います。

  • 管理者
    • create:items
    • read:items
    • update:items
    • delete:items
  • 利用者
    • create:items
    • read:items
    • update:items

1. Permissionの作成

Auth0ダッシュボードで 上記のPermissionを作成します。

  1. 「Applications」>「APIs」>「Item API(前回作成したAPI名)」を選択します。
  2. 「Permissions」タブを開きます。
  3. 入力欄を埋めて「+ Add」を押します(Descriptionは適当)。
    • create:items
    • read:items
    • update:items
    • delete:items
  4. 「Settings」タブを開き、「RBAC Settings」セクションの以下を有効にします。
    • Enable RBAC
    • Add Permissions in the Access Token
  5. 「Save」ボタンを押して変更を保存します。

2. Roleの作成

Auth0ダッシュボードで 上記で作成したPermissionを持つRoleを作成します。

  1. 「User Management」>「Roles」を選択し「+ Create Role」をクリックします。
  2. 入力欄を埋めて「Create」を押します。
    • admin: Create, read, update, delete items
    • general: Create, read, update items
  3. 各Roleのページで「Permissions」タブを開き、 「Add Permission」から上記のPermissionを追加します。

厳密にはread:itemsをRoleに追加する必要はありませんが、参考サイトに以下のように書いてあったので作成します。

誰でも API からアイテムを読み取ることができるため、このロールにread:itemsスコープを追加する必要はありません。ただし、ビジネス要件が変化し、データの読み取りが特権操作になる場合に備えて、ロールを追加することをお勧めします。
Full-Stack TypeScript Apps: Developing a Secure API with NestJS

3. Userの作成

Auth0ダッシュボードで 上記で作成したRoleを持つUserを作成します。

  1. 「User Management」>「Users」を選択し「+ Create User」をクリックします。
  2. 入力欄を埋めて「Create」を押します。
    • admin@example.com
    • general@example.com
  3. 各ユーザーのページで、「Roles」タブを選択し「Assign Roles」からさきほど作成したRoleを割り当てます。
    • admin@example.com: admin
    • general@example.com: general

4. トークンの確認

以上でAuth0で必要な設定が終わったので、前回設定したAuth0のサンプルアプリケーションでトークンを取得して、Permissionが含まれているか確認します。
取得したトークンを以下のサイトに入力し、右側のPayloadの欄でpermissionsが含まれていればOKです。

JSON Web Tokens - jwt.io

{
  ~~
  "permissions": [
    "create:items",
    "delete:items",
    "read:items",
    "update:items"
  ]
}

次回はNestJS側でRBACを実装します。