首页 > 解决方案 > 如何使用 devise-token_authenticable gem 访问 current_user?

问题描述

我正在开发一个正在使用devise和设置devise-token_authenticatable的小项目Rails/GraphQL/Apollo/React。项目是使用 设置webpacker的,因此前端和后端都来自同一个域。登录、注册、注销都由前端(React)处理。我还需要指出这不是一个仅 API 的应用程序。

看来,服务器没有设置current_user正确的 cookie,我收到了网络错误。

Heroku 日志显示以下错误:

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

这是否意味着它在 nil 类上尝试“authentication_token”方法?

同时它在控制台中显示此错误:

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

在我的登录组件的登录突变中,我在成功登录后将用户的 authentication_token 存储在本地存储中,在我的 Apollo 设置中,我从存储中检索它并将其附加到每个请求。但是 Chrome 开发工具的网络选项卡显示在响应标头中登录后我没有得到设计设置的 cookie。我对这一切都很陌生,所以不确定这是问题所在还是其他原因。PS:我没有使用设计会话,因为登录是在从端处理的。我有devise_for: users, skip: :sessions我的路线。

代码片段:

阿波罗提供

组件用户信息

登录突变

非常感谢任何帮助。预先感谢您的帮助。

更新:问题已解决:(有关其他信息,另请参阅下面的答案)

通过current_userapplication_controller.rb.

这是代码...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end

标签: ruby-on-railsdevisegraphqlreact-apollodevise-token-auth

解决方案


Marko Kacanski 是对的,我应该详细说明我的发现以及我是如何修复它的。:-(

我错误地认为当 gem 在标头中检测到 a 时它会current_user自动发送。至少按照我设置项目的方式,我没有得到预期的结果,而是得到了一个 nil 对象。devise-token_authenticatableauthentication_tokencurrent_user

所以...我在其中创建了一个current_user私有方法application_controller.rb,它解决了这个问题。

这是代码...

def current_user
 token = request.headers["Authorization"].to_s
 User.find_for_database_authentication(authentication_token: token)
end

推荐阅读