设计API身份验证

时间:2011-09-30 18:55:20

标签: ruby-on-rails ruby json api devise

我正在开发一个rails web应用程序,它还为移动设备提供基于JSON的API。移动客户端应首先获得带有(email / pass)的令牌,然后客户端将使用令牌进行后续API调用。

我是Devise的新手,我正在寻找一个类似authenticate(email, pass)的Devise API,并期望它返回true / false,然后根据我将创建并交回令牌或返回一个拒绝消息。但似乎Devise没有提供这样的东西。

我知道Devise 1.3提供了基于JSON的身份验证,但这与我的需求有点不同 - 我需要生成令牌并处理回客户端,然后在使用令牌完成身份验证之后。

有人可以指点一下吗?

4 个答案:

答案 0 :(得分:48)

有一个名为:token_authenticatable的设计配置。因此,如果您将其添加到“用户”中的设计方法中,则只需通过调用

即可在API中进行身份验证
"/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])

这是我的gist with a full scale JSON/API login with devise

答案 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'