我正在构建一个仅限API(现在)的Rails应用程序,作为我正在构建的Android应用程序的后端。我之前使用的是Firebase,但希望对应用程序数据进行更多处理,而且我不想让所有逻辑的移动客户端膨胀,所以我正在远离Firebase的实时数据库并使用Rails支持应用程序数据。我也使用Firebase的身份验证非常简单。但是整个系统将所有这些功能集中在一个地方似乎并不那么复杂,所以我也想在Rails应用程序中执行auth和用户管理。
我已经安装了devise_token_auth
(见here)并完成了基本配置。如果提供了params并且创建了用户,则/auth
路由可以正常工作。 sign_in
和sign_out
都成功创建会话并返回一些标头信息。返回的重要部分是client
,access-token
和uid
,我需要在将来调用API时使用这些部分。我相信这些都是无效的,并且每次后续调用都会被替换。在这部分流程中,我不知道如何继续。我不明白这些标头中的数据如何与登录的用户相关联,以及如何验证他们拥有他们请求的资源。用另一种方式总结问题:
如何将用户签入API,然后验证哪个用户正在进行后续API调用?
我的Android应用是一个任务管理器,所以我需要能够验证,例如user 1
请求task 3
,他们拥有该资源。我也不确定如何使用API来引导索引调用。也就是说,当命中索引端点(/tasks
)时,如何从API标头中的数据中识别出应该检索哪个用户的任务。
我无法使用devise_token_auth
找到任何可靠的教程或示例,因此我无法将我现有的各个部分之间的交互拼接在一起。我知道这是一个多肉的问题 - 提前感谢任何指导。
答案 0 :(得分:1)
如何验证哪个用户正在进行后续API调用?
使用current_user
方法。这是devise_token_auth
宝石的built-in feature。
我需要能够验证,例如,如果用户1请求任务3,他们拥有该资源
您可以采取许多不同的方法。您可以使用current_user
方法在每个控制器操作中编写一些自定义逻辑(如果需要,返回403 forbidden
)。
或者,您可以使用流行的"框架"此解决方案,例如CanCanCan
或Pundit
。我,可能是大多数现代社区,都会推荐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所述。