Rso's Jotter

日々の開発の知見のメモやその他雑記

Auth0 でUserMetadataを使う方法

ユーザに簡単な情報付与したいけどまじめにデータストア用意するまでもないような環境で、なんかいい方法ないかなと 思っていたのですが、Auth0にUser Metadataを付与できる機能があったので試しました。 (結論から言うと, 微妙でしたが...)

f:id:rso:20200127152957p:plain
Auth0ユーザ詳細画面

Auth0管理画面にUser Metadata なるものを設定できる画面があるから、これを参照したり更新したりできるんだろうと思い、リファレンス見てみました。 以下は試した内容のメモになります。

User Metadataの取得

  • userinfoの取得

auth0.com

上記の userinfo のエンドポイントからユーザ情報は取得できそうですが、どうやらuser_metadata はそのままでは返ってこないようです。

以下のような内容がRemarkにかかれています。

If you want this endpoint to return user_metadata or other custom information, you can use rules. For more information refer to User profile claims and scope.

user_metadataがほしければ Rules を作ってスコープを指定しろと、言うことのようです。思ったより簡単にはくれないようです。

Rulesというのは認証後に何かしらのアクションを追加できるようなものらしく、サンプルとして地域によってログインを弾いたり、追加情報を付与するみたいなのができるようです。

あまり詳細はよく分かっていないですが、以下のようなRulesスクリプトを書けば、namespace 以下にuser_metadataが入っている状態でuserinfoを取得することができました。

f:id:rso:20200127153842p:plain
Rulesスクリプト

どうしてこうなっているかというと、どうもuser_metadataはOIDCの仕様に則っていないから、そのままでは返せない、だからRulesを設定してやればいけるよ、といった感じのようです。

auth0.com

User Metadata の更新

先程の設定でめでたくuser_metadataの取得ができるようになりましたので、クライアントから更新方法を試します。

ユーザ情報の更新は PATCH /users/:id でいけるようです。 auth0.com

ただしそのままでは権限が不足しているので、scope に update:current_user_metadata を追加してやります。

自分はNuxt.js + Auth module で以下のようにscopeを追加します。

   strategies: {
      auth0: {
        domain: 'xxxx.auth0.com',
        client_id: 'xxxxx',
        scope: ['openid', 'profile', 'email', 'update:users', 'update:current_user_metadata']
      }
    },

そしてAPI仕様どおりのフォーマットでPATCHリクエストを投げると、無事更新されました。

更新はされました、が...

動作は確認できたのですが、ひとつ問題があり、更新後にもう一度 GET /userinfo を投げても更新前の情報が返ってきて、更新直後に反映されません。

いろいろググると、どうやらすぐには反映されず、アクセスキーの再生成が必要なようです.. community.auth0.com

所感

真面目にやるならちゃんとデータストアを別に用意したほうがよさそうです。 さくっとできるのかと思いきや、Rules, Scopeなどいくつか設定の手間がかかるだけでなく、即時にアップデートされなかったり、容量の制約などあるので、 あまり重要でない更新頻度の低いユーザに関連する情報をさくっと入れたいときには良いと思いますが、それ以外の用途では他の手段を検討したほうがよいかもしれません。

その他参考

Manage User Metadata