我正在使用Android应用程序在RoR中构建API。我在SO上查看了其他各种类似的问题,但没有找到适合我确切用例的内容。我需要识别登录用户并相应地响应请求。这不仅仅是将用户ID转换为用户类别,隐式首选项(与设置不同),以便为用户提供更加个性化的体验。
在网络应用程序中,这是通过会话cookie完成的,我可以使用它实际上调用以下方法:
current_user.id # Gets user's id
current_user.category # Gets user's category
current_user.auth_level #Gets user's permission level
为此,在webapp中我有以下设置:
在登录操作中:
...
@user_session = session_setter(email, password)
...
def session_setter(email,password)
@session = UserSession.new(:email => email, :password => password)
@session.save
end
UserSession.rb
class UserSession < Authlogic::Session::Base
logout_on_timeout true
last_request_at_threshold 100
skip_callback :persist, :persist_by_cookie
skip_callback :after_save, :save_cookie
skip_callback :after_destroy, :destroy_cookie
end
session_store.rb(为memcached配置)
require 'action_dispatch/middleware/session/dalli_store'
App::Application.config.session_store :dalli_store, :memcache_server => ['127.0.0.1:11211'], :key => '_session'
此设置允许我在用户登录后访问current_user
对象并访问表users
中的所有列。
对于android,这就是我想到的:
为每个创建帐户的用户创建api_key
。这可能有一个到期日。将此密钥保存并存储在users
表中。 api_key
会在第一个请求中传递给应用,并以sharedPreferences
之类的方式存储。每个请求都应该带有pi_key
到服务器。将过滤器放在需要用户登录的操作上,以检查密钥是否存在。
现在,我的问题是:在此设置中,我需要通过过滤器在每个请求中从表中检索用户记录(或将其存储在memcached中,api_key
作为键值对) 。有没有办法在api中使用像current_user
这样的东西?
简而言之,我想复制相同的策略来维护api的登录用户,就像我对Web应用程序一样。
答案 0 :(得分:1)
API应该不知道您的网络应用程序上下文。 API是经典的无状态HTTP。
你问它一个问题,它会给你答案。虽然,从您的网络应用程序的状态和数据,但它不关心在那一端发生的事情。
API不能,或者更确切地说,不应该与用户登录/注销状态耦合。
您的webapp有责任使用反映登录状态所需的尽可能多的信息来查询API。
例如,
如果您的API有方法get_recommendations
,
API端点应该能够无缝地处理这两种情况。 如果需要,可以对其他方法进行其他调用,以找出当前用户(通过传入的用户ID密钥标识)的详细信息。
因此,从设计角度来看,除了此请求适用于id = X的已登录用户之外,您不应传递任何其他内容。
让您的API处理其他所有事情。
API只是一种特殊的功能/方法。
方法几乎可以做任何事情,只要它们忠实于描述/签名。