Yam*_*ama 5 authentication ruby-on-rails graphql
我对使用 GraphQL 设置 current_user 有点困惑。因此,我在 Restful 应用程序中完成此操作的方法是让用户控制器在创建用户时登录用户,如下所示
def create
@user = User.new(user_params)
if @user.save
login(@user)
render :show
else
render json: @user.errors.messages, status: 422
end
end
Run Code Online (Sandbox Code Playgroud)
我在应用程序控制器中有登录(用户)方法,它的作用基本上是将用户设置为 current_user helper_method 并分配一个会话令牌,如下所示
protect_from_forgery with: :exception
helper_method :current_user
def login(user)
@current_user = user
session[:session_token] = user.reset_session_token!
end
def logout
current_user.reset_session_token!
session[:session_token] = nil
end
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find_by(session_token: session[:session_token])
end
Run Code Online (Sandbox Code Playgroud)
我想我真正的问题是我应该如何让 current_user 出现在我的 GraphQL 控制器上下文中?我正在使用“graphql”gem,它为我创建了一个 graphQL 控制器,但仍然困惑我应该如何实现它。当创建新用户时,其输出是
[["username", "elyy"], ["email", "kelly@kelly.com"], ["password_digest", "$2a$10$ATfHgklNx0bED7N9JCQfHuHjNF/sJ5AcwkOzMOqX7sPLdgAREcHd6"], ["created_at", "2018-10-21 01:46:06.913393"], ["updated_at", "2018-10-21 01:46:06.913393"], ["session_token","uOqgAxb5sOLm2AQMExLwaQ"]]
Run Code Online (Sandbox Code Playgroud)
有关如何设置项目的更多信息,我将在底部包含用户模型、用于创建用户的突变和 GraphQL 控制器。如果您需要任何进一步的信息,请随时询问。感谢所有帮助解释我应该如何解决这个问题并进一步使用 GraphQL 教育我的人,因为我在查看文档和一些人的示例时感到困惑。
class User < ApplicationRecord
has_secure_password
validates :username, :email, :password_digest, presence: true, on: :create
validates :username, uniqueness: true
validates :password, length: { minimum: 6, allow_nil: true }
validates_format_of :email, :with => /@/
attr_reader :password
after_initialize :ensure_session_token
def self.find_by_credentials(email, password)
user = User.find_by(email: email)
user && user.is_password?(password) ? user : nil
end
def self.generate_session_token
SecureRandom.urlsafe_base64
end
def password=(password)
@password = password
self.password_digest = BCrypt::Password.create(password)
end
def is_password?(password)
BCrypt::Password.new(self.password_digest).is_password?(password)
end
def reset_session_token!
self.session_token = User.generate_session_token
self.save!
self.session_token
end
def ensure_session_token
self.session_token ||= User.generate_session_token
end
end
Run Code Online (Sandbox Code Playgroud)
class Resolvers::CreateUser < GraphQL::Function
argument :email, !types.String
argument :password, !types.String
argument :username, !types.String
type Types::UserType
def call(_obj, args, _ctx)
User.create!(
email: args[:email],
password: args[:password],
username: args[:username]
)
end
end
Run Code Online (Sandbox Code Playgroud)
class GraphqlController < ApplicationController
def execute
variables = ensure_hash(params[:variables])
query = params[:query]
operation_name = params[:operationName]
context = {
# Query context goes here, for example:
current_user: current_user,
}
result = PrivateBookSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
render json: result
rescue => e
raise e unless Rails.env.development?
handle_error_in_development e
end
private
# Handle form data, JSON body, or a blank value
def ensure_hash(ambiguous_param)
case ambiguous_param
when String
if ambiguous_param.present?
ensure_hash(JSON.parse(ambiguous_param))
else
{}
end
when Hash, ActionController::Parameters
ambiguous_param
when nil
{}
else
raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
end
end
def handle_error_in_development(e)
logger.error e.message
logger.error e.backtrace.join("\n")
render json: { error: { message: e.message, backtrace: e.backtrace }, data: {} }, status: 500
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |