我知道有关此主题的信息很多,但是找不到最新的信息。我看到了与Rails和android身份验证相关的类似主题,但是TokenAuthenticatable
现在我将其从devise中删除。
我的问题很简单:使用Rails 4,有没有很好的方法可以从本地Android和iPhone应用程序对用户进行身份验证?有谁知道提供解决方案的优秀教程或文章?
亚当·韦特(Adam Waite)添加赏金:
我刚刚在这个问题上悬赏500英镑,因为我找不到在任何地方从iOS应用程序向Rails API进行身份验证的正确做法。这是我正在考虑做的事情,但不知道它是否安全?!:
假设我们有一个User
记录。用户已经注册了一个帐户,该帐户已经User
在数据库中创建了带有email
列和password_digest
列的记录。
用户登录后,我希望该用户在移动应用上保持身份验证,直到明确退出为止。
我想我们将需要基于令牌的身份验证。我可能会在创建时创建一个ApiKey记录,User
并将其另存为User
记录上的关联。
当用户登录/登录时,响应将包含一个API令牌(类似SecureRandom.hex
),该令牌将保存在iOS钥匙串中,并与所有后续请求一起使用,以通过在标头中传递用户并使用类似以下方式进行验证来验证用户:
before_filter :restrict_access
private
def restrict_access
authenticate_or_request_with_http_token do |token, options|
ApiKey.exists?(access_token: token)
end
这样安全吗?我是否应该在每个请求中刷新令牌并将其包含在响应中?
我还有什么其他选择?Facebook,Twitter和Pinterest之类的公司做什么?
我知道OAuth2.0,但这不是用于授予外部应用程序吗?
是否有管理这一切的宝石?
抱歉,在这里完全不确定。
500个最佳答案。
我的研究解决方案的要点。随时进行编辑,更正,无效等。
SessionsController < ApplicationController
skip_before_filter :authenticate_user, :only => [:create]
def create
user = User.where("username = ? OR email = ?", params[:username_or_email], params[:username_or_email]).first
if user && user.authenticate(params[:password])
api_key = user.find_api_key
if !api_key.secret_key || api_key.is_expired?
api_key.set_expiry_date
api_key.generate_secret_key
end
api_key.save
render json: api_key, status: 201
else
status: 401
end
end
注意ApiAuth.authentic吗?方法和请求对象。该请求必须在客户端上使用HMAC算法进行签名。
ApplicationController < ActionController::Base
respond_to :json
force_ssl
protect_from_forgery with: :null_session
before_filter :authenticate_user
private
def authenticate_user
if authenticate_user_from_secret_key
return true
else
head :unauthorized
end
end
def authenticate_user_from_secret_key
userid = ApiAuth.access_id(request)
currentuser = userid && User.find_by_id(userid)
if ApiAuth.authentic?(request, currentuser.find_api_key.secret_key)
return true
else
return false
end
false
end
用户创建/注册
UsersController < ApplicationController
skip_before_filter :authenticate_user, :only => [:create]
def create
user = User.create(user_params)
if !user.new_record?
render json: user.find_apit_key, status: 201
else
# error
end
end
api密钥模型。与#352 railscast中的api密钥模型相似,唯一的区别是ApiAuth密钥生成。
class ApiKey < ActiveRecord::Base
before_create :generate_secret_key, :set_expiry_date
belongs_to :user
def generate_secret_key
begin
self.secret_key = ApiAuth.generate_secret_key
end while self.class.exists?(secret_key: secret_key)
end
用户模型。
class User < ActiveRecord::Base
has_secure_password
before_save :ensure_api_key
has_many :api_keys
def find_api_key
self.api_keys.active.ios.first_or_create
end
在客户端,必须使用HMAC算法对请求进行签名。
代码来自:[SHA1 HMAC密钥生成/身份验证] https://github.com/mgomes/api_auth [控制器和模型] https://github.com/danahartweg/authenticatable_rest_api
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句