问题
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
回答1:
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
回答2:
Fixed the issue. It had nothing to do with GraphQl/Apollo code. Thanks
来源:https://stackoverflow.com/questions/59057895/how-to-access-current-user-with-devise-token-authenticatable-gem