私は現在、プロジェクトの 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