Hasura GraphQLとAuth0で認証をする

はじめに Hasuraを使っていて認証をするときにどうすればいいんだろうってなったので自分なりに記事にしておきます。 Hasuraとは HasuraはPostgres上でGraphQLを簡単に扱うことのできるGraphQL Engineです。 コンソール上でスキーマの定義などが全て行えてすごい楽。 https://hasura.io/ Hasuraを準備する Hasuraをデプロイ Hasura Docを開き、Deploy to Herokuをクリックします 次にHerokuの画面が出てくるので適当なアプリ名を決めてデプロイ テーブルを定義 デプロイが完了したらManage appからアプリの管理画面に飛ぶので右上のOpen appからHasuraのコンソールを開きます。 コンソールを開いたらヘッダーにあるDATAをクリックしてスキーマ定義のページに飛びます。 次にCreate Tableをクリックしてテーブルを定義をします。今回はUserがArticleを作成するときのことを想定します。Userはidとnameを文字列で持っていて、主キーはidです。 次にArticleはidとtitleとbody、そして作成したuserのidを持ち、主キーはidです。 また、ArticleとUserには親子関係が発生するので Foreign Keyを設定します。 Roleの作成 先ほど設定したTablesに対してRoleを作成し権限を付与します。 ここではすでにadminというRoleが作成されているのでuserとanonymousというRoleを追加で作成します。 anonymousの作成 anonymousは記事を見ることしかできないのでarticleのデータを一部を見ることに対してのみ権限を与えます。 左のTablesにあるarticleを開き、Permissionsタブを選択します。 そしてRoleのところにanonymousと入力し、selectのところのペンマークをクリックして下の画像のような設定を行います。 下の設定では、全ての列に対して中身を見ることを許すのでAllow role anonymous to select rows:の部分はWithout any checksを選択します。 また、articleの中身は公開してもよいのでToggle Allを選択します。 最後のaggregationに関しても今回は公開しても大丈夫なのでチェックをつけています。 userの作成 anonymousと同じようにuserのRoleも作成していきます。 userは自分の書いた記事は編集をすることができるのでarticleのinsertとupdate、deleteに対しては以下の設定をします。 { "user_id":{ "_eq": "X-Hasura-User-Id" } } この設定はarticleのuser_idがX-Hasura-User-Idと同一のときにpermissionを与えるというものです。selectに関してはanonymousのときと同じ設定で大丈夫です。 次にuserというRoleは自分自身の情報も編集できるので同じような設定をuserテーブルにも行います。 環境変数の設定 HasuraをデプロイしているHerokuのコンソールに移動し、Settingsを開きます. 次にConfig VarsのReveal Config Varsを押し、環境変数の設定を行います。 ここでは、HASURA_GRAPHQL_ADMIN_SECRETとHASURA_GRAPHQL_UNAUTHORIZED_ROLEという2つの環境変数を設定します. HASURA_GRAPHQL_ADMIN_SECRET あとで出てくるJWTモードを有効するために必要となります。 またこれを設定するとHasuraのコンソールにログインするときに入力が求められるようになります。 HASURA_GRAPHQL_UNAUTHORIZED_ROLE エンドポイントにクエリを投げるときに、認証が行われていない場合はここに設定されたRoleの権限で許されていることが実行することができます。 今回は先ほど作ったanonymousというRoleをHASURA_GRAPHQL_UNAUTHORIZED_ROLEに設定しました。 また、HASURA_GRAPHQL_ADMIN_SECRETは今回xxxxxxxxにしていますがこれが漏れたら終わりなので出来る限りセキュアなものにしてください。

Read More