2

これらのアクションに従ってDeviseにこの問題があります:

  • 新しいユーザーにサインアップします (正常に動作します)
  • ユーザーメールを確認しました(正常に動作します)。その時点で、私は正常にログインしており、すべて正常に動作しています。
  • ログアウトして再度ログインしようとすると、不正なエラー (401) が表示されます。

ここでサーバーログを見ると、何が起こるか:

Started POST "/users/sign_in" for 127.0.0.1 at 2012-10-26 10:26:23 +0200
Processing by Users::SessionController#create as JSON
  Parameters: {"email"=>"olivier.milla@gmail.com", "password"=>"[FILTERED]",     "remember_me"=>"0"}
WARNING: Can't verify CSRF token authenticity
  User Load (0.0ms)  SELECT `users`.* FROM `users` WHERE `users`.`email` =     'olivier.milla@gmail.com' LIMIT 1
   (1.0ms)  BEGIN
   (0.0ms)  COMMIT
   (1.0ms)  BEGIN
   (0.0ms)  UPDATE `users` SET `current_sign_in_at` = '2012-10-26 08:26:23', `sign_in_count` = 2, `updated_at` = '2012-10-26 08:26:23' WHERE `users`.`id` = 1
   (25.0ms)  COMMIT
  Rendered devise/sessions/create.json.rabl (1.0ms)
Completed 200 OK in 135ms (Views: 22.0ms | ActiveRecord: 27.0ms)


Started GET "/accounts/new" for 127.0.0.1 at 2012-10-26 10:26:23 +0200
Processing by AccountsController#new as HTML
Completed 401 Unauthorized in 0ms

ご覧のとおり、私はログインしており、レンダリングされたビュー ( devise/sessions/create.json.rabl) を取得し、「/accounts/new」にリダイレクトされた直後に、承認されていません。その後、任意の URL にアクセスしようとしても、不正なメッセージを受け取り続けることができます。

新しいデータベース (db:reset) でこれを試しました。ログインする前に Cookie をクリーンアップしてみました。

この振る舞いがどこから来るのか、何か考えはありますか?

Rails 3.2.8でDevise 2.1.2を使用しています。

アップデート

リクエストに応じて: AccountsController コード:

class AccountsController < ApplicationController
  before_filter :authenticate_user!

  def :index
    @accounts = current_organization.accounts
  end

  def new
    @account = Account.new(:organization => current_organization)
  end

  def create
    @account = Account.new(params[:account])
    @account.organization = current_organization
    if @account.save
      redirect_to :index
    else
        #TODO
    end
  end
end
4

2 に答える 2

2

これを行う必要があります:

  1. <%= csrf_meta_tag %>レイアウトにあることを確認してください

  2. beforeSendすべての ajax リクエストに追加して、以下のようにヘッダーを設定します。


$.ajax({ url: 'YOUR URL HERE',
  type: 'POST',
  beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
  data: 'someData=' + someData,
  success: function(response) {
    $('#someDiv').html(response);
  }
});

送信元:警告: CSRF トークンの信頼性レールを検証できません


これは:token_authentication、モデルで有効にしたために発生しています。

あなたはこれを望まないかもしれません。


それ以外の場合は、AJAX リクエストのみの認証をスキップしたい場合は、次のようにすることができます。

skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }

あなたの本当のエラーに関しては、ユーザーをチェックインしていて、コードで:authenticate_user!を使用しているためではありませんか?current_organization

したがって、認証に合格している場合、必ずしもcurrent_organization値を持っているわけではありません!

それが役に立てば幸い!

于 2012-10-26T09:53:26.353 に答える