如何为Rails设置远程json API以进行身份​​validation和会话

我是rails的新手,对Devise Gem有一个非常基本的了解。 除了CRUD和观点我不清楚它提供什么可以帮助我使用AngularJs应用程序与Rails Json Api交谈。

目前,我正在努力推动事物。 为了安全,我在客户端(js)和服务器之间交换HTTP标头令牌。 我也使用Railscast#250进行用户身份validation – 但我没有看到如何将SessionController应用于远程客户端。

是否有任何策略可用于通过远程json API进行身份validation和管理会话?

谢谢!

我个人不会为这样的东西使用设计,因为它只有你要使用的一小部分

你几乎不使用会话。 您需要做的就是每次都传递基本身份validation,并在应用程序控制器中确定它是否有效,如果不是只是发回一个身份validation错误。

示例请求: http://username:password@example.com/api/endpoint

 class ApplicationController before_filter :check_auth! private def check_auth! username, password = ActionController::HttpAuthentication::Basic::user_name_and_password(request) user = User.find_by(username: username) if user && user.encrypted_password == SomeEncryptFunction(params[:password]) @current_user = user else raise "error" end end end 

但如果你想……

然后你可以做的是在用户第一次授权(开始他们的会话)时更新用户的DateTime字段,然后在后续调用中他们可以传递你给他们的令牌,每次他们登录时你检查它。你也检查自第一次刷新以来仅经过了一定时间,否则其会话无效。

 class SessionsController < ApplicationController skip_before_filter :check_auth! before_filter :login! private # Note: I don't remember the actual devise method for validating username + password def login! user = User.find_by(username: params[:username]) if user && user.valid_password(params[:password]) current_user = user current_user.update_attributes( authenticated_at: DateTime.now, authentication_token: Devise.friendly_token ) else raise "error" end end end class ApplicationController before_filter :check_auth! private def check_auth! if valid_token(params[:token]) current_user = User.find_by(authentication_token: params[:token]) else raise "error" end end # Returns true if token belongs to a user and is recent enough def valid_token(token) user = User.find_by(authentication_token: params[:token]) user && user.authenticated_at < DateTime.now - 1.day end end