如何在使用devise_token_auth时通过Rails API验证用户是否拥有所请求的资源

时间:2017-07-08 21:23:33

标签: ruby-on-rails devise

我正在构建一个仅限API(现在)的Rails应用程序,作为我正在构建的Android应用程序的后端。我之前使用的是Firebase,但希望对应用程序数据进行更多处理,而且我不想让所有逻辑的移动客户端膨胀,所以我正在远离Firebase的实时数据库并使用Rails支持应用程序数据。我也使用Firebase的身份验证非常简单。但是整个系统将所有这些功能集中在一个地方似乎并不那么复杂,所以我也想在Rails应用程序中执行auth和用户管理。

我已经安装了devise_token_auth(见here)并完成了基本配置。如果提供了params并且创建了用户,则/auth路由可以正常工作。 sign_insign_out都成功创建会话并返回一些标头信息。返回的重要部分是clientaccess-tokenuid,我需要在将来调用API时使用这些部分。我相信这些都是无效的,并且每次后续调用都会被替换。在这部分流程中,我不知道如何继续。我不明白这些标头中的数据如何与登录的用户相关联,以及如何验证他们拥有他们请求的资源。用另一种方式总结问题:

如何将用户签入API,然后验证哪个用户正在进行后续API调用?

我的Android应用是一个任务管理器,所以我需要能够验证,例如user 1请求task 3,他们拥有该资源。我也不确定如何使用API​​来引导索引调用。也就是说,当命中索引端点(/tasks)时,如何从API标头中的数据中识别出应该检索哪个用户的任务。

我无法使用devise_token_auth找到任何可靠的教程或示例,因此我无法将我现有的各个部分之间的交互拼接在一起。我知道这是一个多肉的问题 - 提前感谢任何指导。

1 个答案:

答案 0 :(得分:1)

  

如何验证哪个用户正在进行后续API调用?

使用current_user方法。这是devise_token_auth宝石的built-in feature

  

我需要能够验证,例如,如果用户1请求任务3,他们拥有该资源

您可以采取许多不同的方法。您可以使用current_user方法在每个控制器操作中编写一些自定义逻辑(如果需要,返回403 forbidden)。

或者,您可以使用流行的"框架"此解决方案,例如CanCanCanPundit。我,可能是大多数现代社区,都会推荐Pundit

高度建议您阅读该图书馆的自述文件,因为它非常有帮助。但是对于上面的例子,你可以这样写:

class TasksController
  def show
    task = Task.find(params[:id])
    authorize(task) # !!!
    render task
  end
end

# app/policies/task_policy.rb
class TaskPolicy
  def show?
    record.user == user
  end
end

(请注意,默认情况下,Pundit策略中的" user"会调用方法:current_user。这在项目的自述文件中都有说明。)

  

当命中索引端点(/tasks)时,如何从API标头中的数据中识别出应该检索哪些用户的任务

同样,这些都是Pundit标准功能的一部分。您只需定义一个TaskPolicy::Scope并在控制器中调用policy_scope(Task) - 如here所述。