ruby-on-rails - GraphQL/Rails 422 无法处理的实体 - 将 token 保存到 session

标签 ruby-on-rails ruby graphql graphiql http-status-code-422

我目前正在将一个项目的 Rails 后端从 REST 更改为 graphql,但我在按照他们的教程进行身份验证时遇到错误 - https://www.howtographql.com/graphql-ruby/4-authentication/

我正在使用 GraphiQL 引擎测试我的所有请求并收到错误 status 422 unprocessable Entity, User Must Exist

这是有道理的,因为我正在执行的突变是创建一种新颜色 - 它与用户有 belongs_to 关系。

关于链接页面的一半 above ^^^ 它是这样说的:

With the token that the signinUser mutation provides, apps can authenticate subsequent requests. There are a couple of ways this can be done. In this tutorial, we are just going to use the built-in session, since this doesn’t add any requirements to the client application. The GraphQL server should be able to get the token from the session header on each request, detect what user it relates to, and pass this information down to the resolvers.

我能够通过 signinUser 方法成功返回一个身份验证 token ,就像之前在同一页面上显示的文档一样 - 它发布到的方法还将 token 保存到这个假定的 session 在此方法中(也来自上面发布的相同链接 ^^^):

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

在我拼死挣扎的过程中,您会看到我在方法返回之前就退出了 session ,毫不奇怪地看到它包含用户登录的 token 。

但是,当我继续执行更改以创建颜色时,我的期望是 session 仍将包含该标记并且我能够成功提交该颜色。事实并非如此,当我为这个请求 pd 出 session 时,它返回一个空哈希。

我找不到关于内置 graphql session 工作原理的任何信息——总的来说,我对 graphql 是全新的。


我的主要问题是 - graphql session 应该缓存 token 信息吗?为什么信息没有传递到 signinUser 之后的请求?既然文档声称这种身份验证方法不是长期解决方案,我是否应该费心尝试在本教程中使用身份验证?


我知道这很多,但真的很感激在这方面多动脑筋。

提前致谢!

附言。我了解教程使用了链接,而我在这里使用了颜色 - 这是有意为之的,我已尽最大努力确保语义差异不会导致任何错误。

  • Rails 版本 - 5.2.2(仅使用 api)

  • graphql - 1.7.4

  • graphiql rails - 1.4.4

最佳答案

与 REST API 相同,GraphQL 不会在两个后续请求之间存储任何信息,您必须将登录突变中返回的身份验证 token 传递给所有需要当前用户相关信息的后续请求。

您应该在 graphql_controller.rb 中执行如下操作

class GraphqlController < ApplicationController
  def execute
    variables = ensure_hash(params[:variables])
    query = params[:query]
    operation_name = params[:operationName]
    context = {
      current_user: current_user
    }
    result = GraphqlTutorialSchema.execute(query, variables: variables, context: context, operation_name: operation_name)

    render json: result
  end

  private

  # set current user here
  def current_user
    # you can token here
    token = request.headers['Authorization']
    return nil unless token
    # find current user from this token
  end

  # Handle form data, JSON body, or a blank value
  def ensure_hash(ambiguous_param)
    # ...code
  end
end

关于ruby-on-rails - GraphQL/Rails 422 无法处理的实体 - 将 token 保存到 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281567/

相关文章:

graphql - 如何在无服务器生产中禁用 GraphQL Playground?

ruby-on-rails - jqPlot 根本不显示 Rails 添加的 Bootstrap 页脚

ruby - 如何进一步处理导致 Ruby FasterCSV 库抛出 MalformedCSVError 的数据行?

javascript - ruby on Rails 是否有像 ASP.NET MVC 一样的客户端验证

ruby-on-rails - 使用摩卡,有没有办法用很多参数 stub ?

ruby - ||= 在 Ruby 中做什么

javascript - 操作 get(this.props 'data' ) 的数据输出

graphql - Apollo 客户端变异错误处理

ruby-on-rails - ruby rails : How do you list the partial paths that are rendered for a page?

ruby-on-rails - 是否可以将 nodejs 应用程序集成为 Rails 应用程序的一部分?