适用于Android的RoR API中的用户会话管理

时间:2014-07-02 13:38:26

标签: android ruby-on-rails session

我正在使用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应用程序一样。

1 个答案:

答案 0 :(得分:1)

API应该不知道您的网络应用程序上下文。 API是经典的无状态HTTP。

你问它一个问题,它会给你答案。虽然,从您的网络应用程序的状态和数据,但它不关心在那一端发生的事情。

API不能,或者更确切地说,不应该与用户登录/注销状态耦合。

您的webapp有责任使用反映登录状态所需的尽可能多的信息来查询API。

例如, 如果您的API有方法get_recommendations

  • 理想情况下,它应该采用多个args,以便能够处理所有情况
  • 注销用户,将进行查询,查看正在查看的页面。就像在观看矩阵电影场景一样,应该给出其他矩阵场景作为reco的
  • 登录用户,将进行查询,其他方面。如此,该用户已查看了多少个动作视频,可以作为一个arg传递。

API端点应该能够无缝地处理这两种情况。 如果需要,可以对其他方法进行其他调用,以找出当前用户(通过传入的用户ID密钥标识)的详细信息。

因此,从设计角度来看,除了此请求适用于id = X的已登录用户之外,您不应传递任何其他内容。

让您的API处理其他所有事情。

API只是一种特殊的功能/方法。

方法几乎可以做任何事情,只要它们忠实于描述/签名。