だから、私はDeviseでトークンを使用しようとしています(バージョン1.0.3とRails 2.3.8)でユーザーがログインできるようにしていますが、どこから始めればよいか完全にはわかりません。
http://zyphdesignco.com/blog/simple-auth-token-example-with-devise
上記のチュートリアルは、トークン機能をオンにするのに役立ち、トークンを生成(または削除)する方法を示しました...しかし、トークンの全体のポイントは、トークンを使用してユーザーを認証することです、正しいですか?
コンソールでユーザーを見ると、user.authentication_tokenと言って、「Qm1ne93n_XkgmQTvxDmm」のようなものを取得できます。これはすべて問題なく機能しますが、そこからどこに行くのですか?
次のコマンドラインコマンドを使用して、sign_inルートにアクセスしてみました。
curl -d "authentication_token = Qm1ne93n_XkgmQTvxDmm" localhost:3000/users/sign_in
そして、間違いなくログインに成功しませんでした。
セッションコントローラーで、彼らが呼び出すのがわかります:
authenticate(resource_name)
私が仮定しているのはモジュールのどこかにあります:
devise :: Controllers :: InternalHelpersを含める
これは含まれていますが、どこを探すべきかわかりません(ソースのコントローラフォルダにはありません)。認証がどのように機能するかを見ることができれば、トークンを見ているかどうかもわかります...
Deviseでは実際にトークンでログインできますか、それともトークンを生成するためのフレームワークしかありませんか?それらでログインできる場合は...どのようにこれを行いますか? curlを使用できません(つまり、ブラウザーで使用する必要がありますか?使用する場合は、独自のソリューションを導入する必要があります。ブラウザー以外のサポートが必要です)。そうでない場合は、どうすれば自分でロールできますか?
私の理解では、トークンを使用してログインしたり、cURLを使用した場合でも認証が必要な任意のページにアクセスしたりできます。 config/initializers/devise.rb
を見ると、次のような行があります。
config.token_authentication_key = :auth_token
token_authentication_key
の名前が何であれ、リクエストのクエリまたはフォームパラメータとして入力した名前と一致する必要があります。例ではauthentication_token
を使用していますが、devise.rbをそれに一致するように変更したかどうかはわかりません。
内部でどのように機能しているかを知りたい場合は、git clone git://github.com/plataformatec/devise.git
を試して、明確にする必要があるメソッドを検索します。
以下は、cURLリクエストのサンプルです(Devise :: SessionsControllerを拡張し、JSONを処理するためにcreateメソッドをオーバーライドするカスタムUsers :: SessionsControllerを作成しました)。
class Users::SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
set_flash_message(:notice, :signed_in) if is_navigational_format?
sign_in(resource_name, resource)
respond_to do |format|
format.html do
respond_with resource, :location => redirect_location(resource_name, resource)
end
format.json do
render :json => { :response => 'ok', :auth_token => current_user.authentication_token }.to_json, :status => :ok
end
end
end
end
そして、私が与えたcURLリクエスト:
curl -X POST 'http://localhost:3000/users/sign_in.json' -d 'user[email][email protected]&user[password]=password'
-> {"response":"ok","auth_token":"ABCDE0123456789"}
curl -L 'http://localhost:3000/profile?auth_token=ABCDE0123456789'
-> got page that I wanted that needs authentication
この記事を参照してください: http://www.hyperionreactor.net/blog/token-based-authentication-Rails-3-and-Rails-2
基本的に必要なのは、リクエストにトークンを追加することだけで、自動的に認証されます。つまり、localhost:3000/posts.xml?auth_token = the_token
これは私にとって良い出発点でした。
追加するマイグレーションauthentication_token
:
class AddTokenBasedAuthentication < ActiveRecord::Migration
def change
add_column :users, :authentication_token, :string
add_index :users, :authentication_token, unique: true
end
end
そして、アプリケーションコントローラで:
class ApplicationController < ActionController::Base
before_filter :authenticate_user_from_token!
before_action :authenticate_user!, except: <your login GET action>
private
def authenticate_user_from_token!
email = params[:email].presence
user = email && User.find_by(email: email)
sign_in user if user && Devise.secure_compare(user.authentication_token, params[:auth_token])
end
end
そして、リンクの構築はちょうどです
www.yoursite.com/[email protected]&auth_token=whatever_auth_token_is_stored_for_that_user
ソース: this Gistdevise's wiki からリンクされています&& this tutorial (上記)