GraphQL / Rails 422 Unprocessable Entity - сохранение токена в сессию - PullRequest
0 голосов
/ 21 января 2019

В настоящее время я работаю над изменением рельсового бэкенда проекта с REST на graphql, и у меня возникает ошибка с аутентификацией после их урока - https://www.howtographql.com/graphql-ruby/4-authentication/

Я использую движок GraphiQLдля проверки всех моих запросов и получения ошибки status 422 unprocessable Entity, User Must Exist

Это имеет смысл, поскольку выполняемая мной мутация заключается в создании нового цвета, который имеет отношение belongs_to к пользователю.

О программеНа полпути через страницу, связанную выше ^^^, написано:

С помощью токена, предоставленного мутацией signinUser, приложения могут аутентифицировать последующие запросы.Есть несколько способов сделать это.В этом руководстве мы просто собираемся использовать встроенный сеанс , поскольку это не добавляет никаких требований к клиентскому приложению.Сервер 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

В моей отчаянной борьбе вы сможете увидеть, что я выкинул сессию прямо перед возвратом метода, и неудивительно, что он содержит токен для этогопользователи входят в систему.

Однако, когда я приступил к выполнению мутации для создания цвета, я ожидал, что сессия все еще будет содержать этот токен, и я смогу успешно зафиксировать этот цвет.Это было не так, и когда я выдал сессию для этого запроса, он возвращает пустой хеш.

Я не могу найти никакой информации о том, как работает встроенный graphql сеанс -и я новичок в graphql в целом.


Мои основные вопросы будут таковы: предполагается ли, что graphql session должен кэшировать информацию о токене?Почему информация не переносится на запросы, следующие за signinUser?Стоит ли мне даже пытаться использовать аутентификацию в этом учебном пособии, поскольку в документах утверждается, что этот метод аутентификации не является долгосрочным решением?


Я знаю, что это много, но я бы очень признателен за дополнительный умна этом.

Заранее спасибо!

PS.Я понимаю, что в данном руководстве используются ссылки , и я использую здесь цвета - это сделано намеренно, и я приложил все усилия, чтобы убедиться, что семантические различия не вызывают никаких ошибок.

  • Версия Rails - 5.2.2 (с использованием только API)

  • graphql - 1.7.4

  • graphiql rails- 1.4.4

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Мой коллега отметил, что «сессия» является частью рельсов и должна создать cookie, который будет доступен из следующего запроса.

Я упоминал, что я использовал версию Rails - 5.2.2 (используя только API) - хорошо, когда вы используете флаг -api при инициализации нового проекта rails, он добавляет эти строки к 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, и это добавило куки обратно в приложение / позволило мне сделать следующий запрос с существующимuser.

Вы также можете добавить эти строки, которые я нашел из "Lysender" в его посте - Rails 5 - API Only - Включить Cookies и сеансы , если хотитепредпочитаю не удалять функцию только для API.

config.api_only = true
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_coookie_name', expire_after: 30.days
0 голосов
/ 21 января 2019

То же, что и API-интерфейсы REST. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...