fv17の日記

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

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

ビジネスロジックに認可を委任する

リンク先参照