我正在开发一个rails web应用程序,它还为移动设备提供基于JSON的API。移动客户端应首先获得带有(email / pass)的令牌,然后客户端将使用令牌进行后续API调用。
我是Devise的新手,我正在寻找一个类似authenticate(email, pass)
的Devise API,并期望它返回true / false,然后根据我将创建并交回令牌或返回一个拒绝消息。但似乎Devise没有提供这样的东西。
我知道Devise 1.3提供了基于JSON的身份验证,但这与我的需求有点不同 - 我需要生成令牌并处理回客户端,然后在使用令牌完成身份验证之后。
有人可以指点一下吗?
答案 0 :(得分:48)
有一个名为:token_authenticatable
的设计配置。因此,如果您将其添加到“用户”中的设计方法中,则只需通过调用
"/api/v1/recipes?qs=sweet&auth_token=[@user.auth_token]"
您可能也希望在您的用户中使用此功能:
before_save :ensure_authentication_token
更新(使用API授权码)
您正在寻找的方法是:
resource = User.find_for_database_authentication(:login=>params[:user_login][:login])
resource.valid_password?(params[:user_login][:password])
答案 1 :(得分:2)
我建议通过Devise Wiki阅读,因为Devise本身支持令牌身份验证作为其中一个模块。我没有在Devise中亲自使用令牌认证,但Brandon Martin有一个示例令牌认证示例here。
答案 2 :(得分:1)
Devise基于Warden,Rack的身份验证中间件。
如果您需要实施自己的(替代)方式来验证用户,您应该看看Warden与Devise附带的策略相结合:https://github.com/plataformatec/devise/tree/master/lib/devise/strategies
答案 3 :(得分:0)
如果令牌身份验证不是您想要做的事情,您还可以返回一个cookie并让客户端在请求标头中包含cookie。它的工作方式与Web会话控制器非常相似。
在API会话控制器
中class Api::V1::SessionsController < Devise::SessionsController
skip_before_action :authenticate_user!
skip_before_action :verify_authenticity_token
def create
warden.authenticate!(:scope => :user)
render :json => current_user
end
end
在路线
namespace :api, :defaults => { :format => 'json' } do
namespace :v1 do
resource :account, :only => :show
devise_scope :user do
post :sessions, :to => 'sessions#create'
delete :session, :to => 'sessions#destroy'
end
end
end
然后你可以做这种事情(例子是使用HTTPie)
http -f POST localhost:3000/api/v1/sessions user[email]=user@email.com user[password]=passw0rd
响应标头将在Set-Cookie标头中有一个会话。将此值放在后续请求中。
http localhost:3000/api/v1/restricted_things/1 'Cookie:_my_site_session=<sessionstring>; path=/; HttpOnly'