Devise_token_auth とユーザー名と電子メールを使用した Devise ログイン

概要

既存の Rails アプリケーションにトークン認証を追加しようとすると、継続的にエラーが発生します。これは、deviceauthentication_keys が原因です。私の Rails 4 アプリでは、ユーザーがユーザー名またはメールアドレスを使用してログインできるようにしており、API にも同じ機能を提供したいと考えています。

APIからログインするときに発生するエラーは次のとおりです

Started POST "/api/v1/auth/sign_in" for 127.0.0.1 at 2016-04-19 23:40:26 -0400
Processing by DeviseTokenAuth::SessionsController#create as JSON
Parameters: {"login"=>"[email protected]", "password"=>"[FILTERED]", "session"=>{"login"=>"[email protected]", "password"=>"[FILTERED]"}}
Can't verify CSRF token authenticity
Geokit is using the domain: localhost
User Load (1.3ms)  SELECT  "users".* FROM "users" WHERE (login = '[email protected]' AND provider='email')  ORDER BY "users"."id" ASC LIMIT 1
SQLite3::SQLException: no such column: login: SELECT  "users".* FROM "users" WHERE (login = '[email protected]' AND provider='email')  ORDER BY "users"."id" ASC LIMIT 1
Completed 500 Internal Server Error in 5ms

SQLite3::SQLException - no such column: login:

ユーザーモデルのコードは以下のとおりです。この問題は、ログイン パラメータが電子メール (またはユーザー名) 経由で検索するように変換されていないため、ユーザーの負荷が原因で発生します。ただし、以下のコードは通常のデバイスログインではまったく問題なく動作します。

#User.rb
devise :database_authenticatable, :registerable, :confirmable,
     :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login]
include DeviseTokenAuth::Concerns::User

def self.find_for_database_authentication(warden_conditions)
  conditions = warden_conditions.dup
  if login = conditions.delete(:login)
    where(conditions.to_h).where(['lower(username) = :value OR lower(email) = :value', { :value => login.downcase }]).first
  else
    where(conditions.to_h).first
  end
end

助けや指導をありがとう!

編集 パラメータを電子メールとパスワードとして送信するときにもエラーが発生します。

Processing by DeviseTokenAuth::SessionsController#create as JSON
Parameters: {"email"=>"[email protected]", "password"=>"[FILTERED]", "session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}}
Can't verify CSRF token authenticity
Unpermitted parameters: email, format, session
Completed 401 Unauthorized in 49ms (Views: 0.3ms | ActiveRecord: 0.0ms | Solr: 0.0ms)

解決策