1

I’m working on a small project that is using devise and devise-token_authenticatable in a Rails/GraphQL/Apollo/React setup. Project is setup using webpacker, so the front and back ends are both served from the same domain. Sign-in, register, log-out are all handle by the front end (React). I also need to point out this is not an API only app.

It seems, server is not setting the current_user or the proper cookie and I’m getting a network error.

Heroku logs shows the following error:

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

Is that mean it’s trying ‘authentication_token’ method on a nil class?

At the same time it’s showing this error in the console:

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

In my login component’s sign-in mutation, I’m storing the authentication_token of the user in local storage after a successful login and in my Apollo setup I’m retrieving it from storage and attaching it to each request. But Chrome dev tool’s network tab shows I’m not getting the cookie set by devise after a signin in the response header. I’m pretty new to all of this so not sure this is the problem or something else. PS: I’m not using Devise sessions since sign-in is handle in the from end. I have devise_for: users, skip: :sessions in my routes.

Code snippets:

Apollo Provide

Component UserInfo

SignIn mutation

Any assistance is greatly appreciated. Thank you in advance for your help.

UPDATE: issue was fixed: (also see my answer below for additional info)

Issue was fixed by adding current_user private method in application_controller.rb.

Here's the code...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end
Bhatiya J
  • 126
  • 12

2 Answers2

0

Marko Kacanski was right I should have elaborate on my findings & how I fixed it. :-(

I was wrong to assume that the current_user is automatically sent by the gem devise-token_authenticatable when it detects a authentication_token in the header. At least the way I have setup my project, I wasn't getting the current_user as expected, instead I get a nil object.

So... I created a current_user private method in application_controller.rb and, it fixed the issue.

Here's the code...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end
Bhatiya J
  • 126
  • 12
-2

Fixed the issue. It had nothing to do with GraphQl/Apollo code. Thanks

Bhatiya J
  • 126
  • 12
  • Maybe you could share the solution with the rest of the community? – Marko Kacanski Feb 06 '20 at 14:50
  • Thank you, I was dealing with a similar issue and your solution really helped! :) If you edit your original quesiton, I'll be able to upvote it since it now has a very usefull answer. – Marko Kacanski Feb 18 '20 at 18:40