web-dev-qa-db-ja.com

ログインにDeviseトークンを使用していますが、これは組み込まれていますか?

だから、私は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を使用できません(つまり、ブラウザーで使用する必要がありますか?使用する場合は、独自のソリューションを導入する必要があります。ブラウザー以外のサポートが必要です)。そうでない場合は、どうすれば自分でロールできますか?

38
Jenny

私の理解では、トークンを使用してログインしたり、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
36
Anthony Panozzo

この記事を参照してください: http://www.hyperionreactor.net/blog/token-based-authentication-Rails-3-and-Rails-2

基本的に必要なのは、リクエストにトークンを追加することだけで、自動的に認証されます。つまり、localhost:3000/posts.xml?auth_token = the_token

5
zero_padded

これは私にとって良い出発点でした。

追加するマイグレーション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 (上記)

2
stevenspiel