Я работаю над небольшим проектом, в котором используются devise и devise-token_authenticatable в настройке Rails/GraphQL/Apollo/React. Проект настраивается с использованием webpacker, поэтому клиентская и серверная части обслуживаются из одного домена. Вход, регистрация, выход - все это обрабатывается клиентской частью (React). Я также должен отметить, что это приложение не только для API.

Похоже, сервер не устанавливает current_user или правильный файл cookie, и я получаю сообщение об ошибке сети.

Журналы Heroku показывают следующую ошибку:

NoMethodError (undefined method `authentication_token' for #<User:0x000055ca6c0e4c50>)

Означает ли это, что он пытается использовать метод authentication_token для класса nil?

В то же время в консоли отображается такая ошибка:

Network error: Unexpected token < in JSON at position 0 (I have no idea what this is)

В моем компоненте входа в систему я сохраняю authentication_token пользователя в локальном хранилище после успешного входа в систему, а в моей настройке Apollo я извлекаю его из хранилища и прикрепляю к каждому запросу. Но вкладка сети инструмента Chrome dev показывает, что я не получаю файл cookie, установленный devise после входа в заголовок ответа. Я новичок во всем этом, поэтому не уверен, что это проблема или что-то еще. PS: Я не использую сеансы Devise, так как вход в систему осуществляется на начальном этапе. В моих маршрутах есть devise_for: users, skip: :sessions.

Фрагменты кода:

Обеспечение Аполлона

Компонент UserInfo

Мутация входа в систему

Любая помощь приветствуется. Спасибо заранее за вашу помощь.

ОБНОВЛЕНИЕ: проблема устранена: (дополнительную информацию см. также в моем ответе ниже)

Проблема была устранена путем добавления частного метода current_user в application_controller.rb.

Вот код ...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end
1
Bhatiya J 26 Ноя 2019 в 22:11

2 ответа

Марко Качански был прав, я должен был подробнее рассказать о своих выводах и о том, как я их исправил. :-(

Я ошибался, полагая, что current_user автоматически отправляется гемом devise-token_authenticatable, когда он обнаруживает authentication_token в заголовке. По крайней мере, так как я настроил свой проект, я не получил current_user, как ожидалось, вместо этого я получил объект nil.

Итак ... Я создал частный метод current_user в application_controller.rb, и он устранил проблему.

Вот код ...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end
1
Bhatiya J 17 Фев 2020 в 20:33

Исправлена ​​проблема. Это не имело ничего общего с кодом GraphQl / Apollo. Спасибо

-1
Bhatiya J 28 Ноя 2019 в 00:54
Может быть, вы могли бы поделиться решением с остальной частью сообщества?
 – 
Marko Kacanski
6 Фев 2020 в 17:50
1
Вы правы ... Я выложил свое решение.
 – 
Bhatiya J
17 Фев 2020 в 20:34
Спасибо, я столкнулся с похожей проблемой, и ваше решение действительно помогло! :) Если вы отредактируете исходный вопрос, я смогу проголосовать за него, так как теперь он имеет очень полезный ответ.
 – 
Marko Kacanski
18 Фев 2020 в 21:40
Исходное сообщение отредактировано с исправлениями
 – 
Bhatiya J
21 Фев 2020 в 02:10