私はRailsモバイルアプリケーション用のJSONベースのAPIも提供するWebアプリケーションに取り組んでいます。モバイルクライアントはまず(email/pass)でトークンを取得し、その後クライアントは後続のAPI呼び出しを行います。トークン付き。
私はDeviseが初めてで、authenticate(email, pass)
のようなDevise APIを探しており、true/falseを返すことを期待しています。それに基づいて、トークンを作成して返送するか、拒否を返しますメッセージ。しかし、Deviseはこのようなものを提供していないようです。
Devise 1.3はJSONベースの認証を提供することを知っていますが、それは私が必要とするものとは少し異なります-トークンを生成してクライアントに戻す必要があり、その後、代わりにトークンを使用して認証が行われます。
誰かがいくつかのポインタをお願いできますか?
: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はモジュールの1つとしてトークン認証をネイティブでサポートしているため、 Devise Wiki を読むことをお勧めします。私は個人的にDeviseでトークン認証を使用したことはありませんが、Brandon Martinにはトークン認証の例 here があります。
Deviseは、Rackの認証ミドルウェアであるWardenに基づいています。
ユーザーを認証するための独自の(代替)方法を実装する必要がある場合は、Deviseに同梱されている戦略と組み合わせて、Wardenをご覧ください。 https://github.com/plataformatec/devise/tree/master/lib/devise/strategies
トークン認証だけでは不十分な場合は、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'