既存の 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)