GraphQL/ Rails 422 无法处理的实体 - 将令牌保存到会话
GraphQL/ Rails 422 Unprocessable Entity - Saving token to Session
我目前正在努力将项目的 rails 后端从 REST 更改为 graphql,但我 运行 在按照他们的教程进行身份验证时遇到错误 - https://www.howtographql.com/graphql-ruby/4-authentication/
我正在使用 GraphiQL 引擎测试我的所有请求并收到错误 status 422 unprocessable Entity, User Must Exist
这是有道理的,因为我正在执行的突变是创建一种新颜色 - 它与用户有 belongs_to
关系。
页面的一半左右 linked 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
方法成功地 return 一个身份验证令牌,就像之前在同一页面上显示的文档一样 - 它发布到的方法也将令牌保存到这个假定的session 在此方法中(也来自上面发布的相同 link ^^^):
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
您将能够在我绝望的斗争中看到,我在方法 return 之前就退出了会话,并且毫不奇怪地看到它包含该用户登录的令牌。
但是,当我继续执行更改以创建颜色时,我的期望是会话仍将包含该标记并且我能够成功提交该颜色。事实并非如此,当我为此请求输出会话时,它 return 是一个空哈希。
我找不到关于内置 graphql session 工作原理的任何信息——总的来说,我是 graphql 的新手。
我的主要问题是 - graphql session 应该是缓存令牌信息吗?为什么信息没有转移到 signinUser
之后的请求?既然文档声称这种身份验证方法不是长期解决方案,我是否应该费心尝试在本教程中使用身份验证?
我知道这很多,但真的很感激对此多加思考。
提前致谢!
PS。我知道教程使用 links 而我在这里使用 colors - 这是有意的,我已尽力确保语义差异不会导致任何错误。
Rails 版本 - 5.2.2(仅使用 api)
graphql - 1.7.4
graphiql rails - 1.4.4
与 REST API 相同,GraphQL 不会在两个后续请求之间存储任何信息,您必须将登录突变中返回的身份验证令牌传递给所有需要当前用户相关信息的后续请求。
您应该在 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
我的一位同事指出 "session" 是 rails 的一部分,应该创建一个可以从下一个请求访问的 cookie。
我提到我使用的是 Rails 版本 - 5.2.2(仅使用 api) - 当你在初始化新 [=35= 时使用 -api
标志时] 项目,它将这些行添加到 application.rb
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
# Only loads a smaller set of middleware suitable for API only apps.
# Middleware like session, flash, cookies can be added back manually.
# Skip views, helpers and assets when generating a new resource.
config.api_only = true
特别注意这一行 - Middleware like session, flash, cookies can be added back manually.
我注释掉了 config.api_only = true
,这将 cookie 添加回应用程序/允许我向现有用户发出下一个请求。
如果您不想删除,您也可以添加我从 "Lysender" 中找到的这些行到他的 post - Rails 5 – API Only – Enable Cookies and Sessions api 独有的功能。
config.api_only = true
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_coookie_name', expire_after: 30.days
我目前正在努力将项目的 rails 后端从 REST 更改为 graphql,但我 运行 在按照他们的教程进行身份验证时遇到错误 - https://www.howtographql.com/graphql-ruby/4-authentication/
我正在使用 GraphiQL 引擎测试我的所有请求并收到错误 status 422 unprocessable Entity, User Must Exist
这是有道理的,因为我正在执行的突变是创建一种新颜色 - 它与用户有 belongs_to
关系。
页面的一半左右 linked 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
方法成功地 return 一个身份验证令牌,就像之前在同一页面上显示的文档一样 - 它发布到的方法也将令牌保存到这个假定的session 在此方法中(也来自上面发布的相同 link ^^^):
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
您将能够在我绝望的斗争中看到,我在方法 return 之前就退出了会话,并且毫不奇怪地看到它包含该用户登录的令牌。
但是,当我继续执行更改以创建颜色时,我的期望是会话仍将包含该标记并且我能够成功提交该颜色。事实并非如此,当我为此请求输出会话时,它 return 是一个空哈希。
我找不到关于内置 graphql session 工作原理的任何信息——总的来说,我是 graphql 的新手。
我的主要问题是 - graphql session 应该是缓存令牌信息吗?为什么信息没有转移到 signinUser
之后的请求?既然文档声称这种身份验证方法不是长期解决方案,我是否应该费心尝试在本教程中使用身份验证?
我知道这很多,但真的很感激对此多加思考。
提前致谢!
PS。我知道教程使用 links 而我在这里使用 colors - 这是有意的,我已尽力确保语义差异不会导致任何错误。
Rails 版本 - 5.2.2(仅使用 api)
graphql - 1.7.4
graphiql rails - 1.4.4
与 REST API 相同,GraphQL 不会在两个后续请求之间存储任何信息,您必须将登录突变中返回的身份验证令牌传递给所有需要当前用户相关信息的后续请求。
您应该在 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
我的一位同事指出 "session" 是 rails 的一部分,应该创建一个可以从下一个请求访问的 cookie。
我提到我使用的是 Rails 版本 - 5.2.2(仅使用 api) - 当你在初始化新 [=35= 时使用 -api
标志时] 项目,它将这些行添加到 application.rb
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
# Only loads a smaller set of middleware suitable for API only apps.
# Middleware like session, flash, cookies can be added back manually.
# Skip views, helpers and assets when generating a new resource.
config.api_only = true
特别注意这一行 - Middleware like session, flash, cookies can be added back manually.
我注释掉了 config.api_only = true
,这将 cookie 添加回应用程序/允许我向现有用户发出下一个请求。
如果您不想删除,您也可以添加我从 "Lysender" 中找到的这些行到他的 post - Rails 5 – API Only – Enable Cookies and Sessions api 独有的功能。
config.api_only = true
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_coookie_name', expire_after: 30.days