ruby on rails-设计API身份验证

我正在开发一个Rails Web应用程序,该应用程序还为移动设备提供了基于JSON的API。 移动客户端应首先通过(电子邮件/通过)获得令牌,然后客户端将使用该令牌进行后续的API调用。

我对Devise相当陌生,我正在寻找一个类似于authenticate(email, pass)的Devise API,并希望它返回true / false,然后基于此,我将创建并返回令牌或返回拒绝消息。 但似乎Devise没有提供类似的信息。

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

有人可以指点一下吗?

Xiaotian Guo asked 2020-07-13T03:56:58Z
4个解决方案
49 votes

有一个名为:token_authenticatable的devise配置。因此,如果将其添加到“用户”中的devise方法中,则只需调用以下命令即可在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])

这是我的精髓,是使用devise进行全面JSON / API登录的

Jesse Wolgamott answered 2020-07-13T03:57:31Z
2 votes

我建议您阅读Devise Wiki,因为Devise本身就支持令牌认证作为其模块之一。 我还没有亲自在Devise中使用令牌认证,但是Brandon Martin在这里有一个示例令牌认证示例。

janders223 answered 2020-07-13T03:57:51Z
1 votes

设备基于Warden,这是Rack的身份验证中间件。

如果您需要实现自己的(替代)方式来验证用户身份,则应结合使用Devise随附的策略来了解Warden:[https://github.com/plataformatec/devise/tree/master/ lib / devise / strategies]

chris_b answered 2020-07-13T03:58:15Z
0 votes

如果令牌身份验证不是您要执行的操作,则还可以返回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'
Mark Swardstrom answered 2020-07-13T03:58:53Z
translate from https://stackoverflow.com:/questions/7614798/devise-api-authentication