🔑

Actions機能を使ってHasuraとAuth0を連携させる

2023/09/03に公開

Hasuraの認証に使えるサービスとしてAuth0を使った方法が紹介されている。

https://hasura.io/learn/ja/graphql/hasura/authentication/

その中で、Rules機能を利用した方法が説明されているが、Auth0側ではRules機能の廃止がアナウンスされている。

https://auth0.com/blog/jp-preparing-for-rules-and-hooks-end-of-life/

そこで、より拡張性の高い機能であるActions機能を使った方法を紹介する。

カスタムJWTクレームの発行

まず、Actions機能のLibraryにアクセスし、 [Build Custom] をクリックする。

image

名前はここでは hasura-jwt-claim としておく。 (好きな名前で良い)

image

作成すると、編集画面が出てくので、 exports.onExecutePostLogin の関数を書き換える。

 exports.onExecutePostLogin = async (event, api) => {
+  const namespace = "https://hasura.io/jwt/claims";
+
+  api.accessToken.setCustomClaim(namespace, {
+    'x-hasura-default-role': 'user',
+    'x-hasura-allowed-roles': ['user'],
+    'x-hasura-user-id': event.user.user_id
+  });
 };

終わったら [Deploy] をクリックする。

ログイン時にHasuraにユーザーを作成するようにする

同じ要領で、ログイン時にHasuraにユーザーを作成する処理も実装する。

Libraryのページに戻り、 [Build Custom] から sign-in という名前で2つ目のActionを作成する。

作成したら、以下の通り exports.onExecutePostLogin の関数を書き換える。

exports.onExecutePostLogin = async (event, api) => {
+  const axios = require('axios');
+
+  const userId = event.user.user_id;
+  const nickname = event.user.nickname;
+
+  const admin_secret = "xxxx";
+  const url = "https://ready-panda-91.hasura.app/v1/graphql";
+  const query = `mutation($userId: String!, $nickname: String) {
+    insert_users(objects: [{
+      id: $userId, name: $nickname, last_seen: "now()"
+    }], on_conflict: {constraint: users_pkey, update_columns: [last_seen, name]}
+    ) {
+      affected_rows
+    }
+  }`;
+
+  const variables = { "userId": userId, "nickname": nickname };
+
+  await axios.post(
+    url,
+    { query, variables },
+    { headers: { 'content-type' : 'application/json', 'x-hasura-admin-secret': admin_secret } }
+  );
};

HTTPクライアントを利用しているため、dependenciesにaxiosを追加する。

image

image

そして、 [Deploy] をクリックしてデプロイする。

Actionsの有効化

最後に、ログイン後の処理として先ほど作成した2つのActionをルーティングする。

ActionsのFlowsを開き、Loginをクリックする。

image

Customタブを選択し、表示されている2つのActionを以下の順になるようにドラッグアンドドロップする。

  • hasura-jwt-claim
  • sign-in

image

このような表示になったら [Apply] をクリックする。

image

以上で、Actions機能を使ってHasuraとAuth0を連携させることができる。

参考文献

Discussion