3

私は現在、プロジェクトの Rails バックエンドを REST から Graphql に変更する作業を行っていますが、チュートリアルに従って認証でエラーが発生しています - https://www.howtographql.com/graphql-ruby/4-authentication/

GraphiQL エンジンを使用してすべてのリクエストをテストし、エラーを受け取りましたstatus 422 unprocessable Entity, User Must Exist

私が実行している突然変異は新しい色を作成することであるため、これは理にかなっています-これはbelongs_toユーザーと関係があります。

にリンクされたページの約半分^^^^それはこれを言います:

ミューテーションが提供するトークンを使用してsigninUser、アプリは後続のリクエストを認証できます。これを行うにはいくつかの方法があります。このチュートリアルでは、組み込みの sessionを使用するだけです。これは、クライアント アプリケーションに要件を追加しないためです。GraphQL サーバーは、各リクエストのセッション ヘッダーからトークンを取得し、関連するユーザーを検出して、この情報をリゾルバーに渡すことができる必要があります。

signinUserドキュメントが同じページで以前に示したようなメソッドを介して認証トークンを正常に返すことができます-それが投稿するメソッドは、このメソッドでこの想定されたセッションにトークンを保存します(これも上に投稿された同じリンクから^ ^^) :

def call(_obj, args, ctx)
    input = args[:email]

    return unless input

    user = User.find_by email: input[:email]

    return unless user
    return unless user.authenticate(input[:password_digest])

    crypt = ActiveSupport::MessageEncryptor.new(ENV["SECRET_BASE_KEY"])

    token = crypt.encrypt_and_sign("user-id:#{ user.id }")

    puts "please **********************************"
    p ctx[:session]


    ctx[:session][:token] = token

    puts "please **********************************"
    p ctx[:session]

    OpenStruct.new({
      user: user,
      token: token
      })
  end

メソッドが戻る直前にセッションを p アウトし、ユーザーがサインインするためのトークンが含まれていることに驚くことはありませんでした。

しかし、ミューテーションを実行して色を作成したとき、セッションにはまだそのトークンが含まれており、その色を正常にコミットできると期待していました。そうではなく、このリクエストのセッションを p'd にすると、空のハッシュが返されます。

組み込みのgraphqlセッションがどのように機能するかについての情報を見つけることができません-そして、私は一般的にgraphqlにまったく慣れていません。


私の主な質問は、graphqlセッションはトークン情報をキャッシュすることになっているのでしょうか? 以下のリクエストに情報が引き継がれないのはなぜsigninUserですか?ドキュメントでは、この認証方法は長期的な解決策ではないと主張しているため、このチュートリアルで認証を使用しようとすることさえ気にする必要がありますか?


私はこれがたくさんあることを知っていますが、これについて余分な頭脳を本当に感謝しています.

前もって感謝します!

PS。チュートリアルではリンクを使用していることを理解しており、ここではを使用しています。これは意図的なものであり、セマンティックの違いによってエラーが発生していないことを確認するために最善を尽くしました。

  • Rails バージョン - 5.2.2 (API のみを使用)

  • グラフql-1.7.4

  • グラフィックレール - 1.4.4

4

2 に答える 2