web-dev-qa-db-ja.com

API認証を考案する

私はRailsモバイルアプリケーション用のJSONベースのAPIも提供するWebアプリケーションに取り組んでいます。モバイルクライアントはまず(email/pass)でトークンを取得し、その後クライアントは後続のAPI呼び出しを行います。トークン付き。

私はDeviseが初めてで、authenticate(email, pass)のようなDevise APIを探しており、true/falseを返すことを期待しています。それに基づいて、トークンを作成して返送するか、拒否を返しますメッセージ。しかし、Deviseはこのようなものを提供していないようです。

Devise 1.3はJSONベースの認証を提供することを知っていますが、それは私が必要とするものとは少し異なります-トークンを生成してクライアントに戻す必要があり、その後、代わりにトークンを使用して認証が行われます。

誰かがいくつかのポインタをお願いできますか?

45
Xiaotian Guo

:token_authenticatableというデバイス構成があります。したがって、「ユーザー」のdeviseメソッドにそれを追加すると、呼び出すだけでAPIで認証できます

"/api/v1/recipes?qs=sweet&auth_token=[@user.auth_token]"

おそらくあなたのユーザーにもこれが必要でしょう:

before_save :ensure_authentication_token

[〜#〜] update [〜#〜](API認証コード付き)

あなたが探している方法は次のとおりです。

resource = User.find_for_database_authentication(:login=>params[:user_login][:login])
resource.valid_password?(params[:user_login][:password])

ここに私の deviseを使用したフルスケールのJSON/APIログインの要点

49
Jesse Wolgamott

Deviseはモジュールの1つとしてトークン認証をネイティブでサポートしているため、 Devise Wiki を読むことをお勧めします。私は個人的にDeviseでトークン認証を使用したことはありませんが、Brandon Martinにはトークン認証の例 here があります。

2
janders223

Deviseは、Rackの認証ミドルウェアであるWardenに基づいています。

ユーザーを認証するための独自の(代替)方法を実装する必要がある場合は、Deviseに同梱されている戦略と組み合わせて、Wardenをご覧ください。 https://github.com/plataformatec/devise/tree/master/lib/devise/strategies

1
chris_b

トークン認証だけでは不十分な場合は、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][email protected] user[password]=passw0rd

応答ヘッダーには、Set-Cookieヘッダーにセッションがあります。この値を後続のリクエストに入れます。

http localhost:3000/api/v1/restricted_things/1 'Cookie:_my_site_session=<sessionstring>; path=/; HttpOnly'
0
Mark Swardstrom