Auth0 のRules で Access Token に Roleを追加する

2019.05.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。 Auth0をいじっているのでメモ。

2019/05時点のAuth0では、Groupは存在せず、Roleのみが提供されている。 ただし、Auth0 Authorization Extentionを追加すると、パフォーマンスなどネックはあるもののGroupが利用できる。

とりあえず、特定のユーザに権限を与えたい。 Groupが妥当だけど、Roleでもいい、Access Tokenに乗ってくれば・・・

Roleの作成

とりあえずAdmin Roleを作成し、ユーザに付与する。 Users & Roles メニューからポチポチすればOK。

Rulesの作成

RolesはスタンダードなClaimには乗らないので、カスタマイズするためにRuleを追加する。 Ruleってのは認証時に割り込み処理を行って、カスタマイズするようなJavaScriptのコードのこと。 特定のIPをブロックしたり、好き放題できる。

Empty Ruleで作成。

context.accessTokenにrolesを設定。 claimのルールなのでネームスペースを使うこと。

function (user, context, callback) {
  const namespace = 'https://classmethod.jp/';
  const assignedRoles = (context.authorization || {}).roles;
  context.accessToken[namespace + 'roles'] = assignedRoles;
  return callback(null, user, context);
}

動作確認

Ruleを有効にしたら /token APIでAccess Tokenを作成。

無事、JWTにRoleが乗りました。

2019-05-08T09:59:08.298Z    bbc752d8-dd35-4c9f-b900-81a4f17e154c
{
    "https://classmethod.jp/roles": [
        "Admin"
    ],
    "iss": "https://xxxxxx.auth0.com/",
    "sub": "auth0|xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "aud": "https://xxxxxx.auth0.com/api/v2/",
    "iat": 1557309526,
    "exp": 1557395926,
    "azp": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "scope": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "gty": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

雪溶けちゃったなぁ。