我是Rails的新手,对Devise Gem有相当基本的了解。除了CRUD和视图外,我不清楚它提供的内容是否可以帮助我与AngularJs应用程序与Rails Json Api进行对话。
此刻,我正在手动滚动东西。为了安全起见,我在客户端(js)和服务器之间交换了HTTP标头令牌。我还在使用Railscast#250进行用户身份验证-但由于我没有看到如何将SessionController应用于远程客户端。
我可以采用任何策略通过远程json API进行身份验证和管理会话吗?
谢谢!
我个人不会将devise用于这样的事情,因为无论如何,您只会使用其中的一小部分
您几乎只是不使用会话。您需要做的就是每次都传递基本身份验证,然后在应用程序控制器中确定其是否有效,如果不是,则仅将其发送回身份验证错误。
请求示例: http://username:[email protected]/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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句