graphql-rubyのAuthorizationに関する学習メモ
Authorization
https://graphql-ruby.org/guides#authorization-guides
概要
Authorization: GraphQL vs REST
- REST APIはリクエストされたアクションの直前に、クライアントがそのアクションに対して権限を持っているかを判断する。
- この考え方はGraphQLではマッチしない。その理由は、GraphQLの場合はコントローラが一つしかないため。
class GraphqlController < ApplicationController def execute # すべてのqueries、mutationsがここを通るため、この段階でどのような権限が必要か判断できない if current_user.can?(:"???") MySchema.execute(query_str, context: ctx, variables: variables) end end end
では、どのような考え方をするべきか?
- queriesの場合、取得するオブジェクトに対する権限を持っているか
- mutationsの場合、それぞれのmutationを実行する権限があるか
GraphQLにおける認証
そもそも認証とは?
- 認証とは、どのユーザーが現在のリクエストを行っているかを判断するプロセスのこと。例えば、usernameやpasswordによる確認、sessionによる確認など。
- 認可とは、現在のユーザーが何をする/見る権限を持っているかを確認するプロセスのこと。例えば、admin?ステータスの確認やデータベースからの権限グループの検索。
認可の例 (https://graphql.org/learn/authorization/より)
Only authors can see their drafts
認証はGraphQLでは扱われていない。代わりに、コントローラはHTTPリクエスト(例えば、HTTPヘッダやクッキー)に基づいて現在のユーザを取得し、その情報をGraphQLクエリに提供する。そうすれば、GraphQLのコードにおいて、current_userはcontext[:current_user] でアクセスできる。
class GraphqlController < ApplicationController def execute context = { current_user: current_user } MySchema.execute(query_str, context: context, ...) end end
ビジネスロジックに認可を委任する
リンク先参照