Lors de la migration d'une de mes applications rails 3 en rails 4 (et devise 2.0.1 en 3.1.0). J'ai eu des petits soucis, deux pour être précis, un lié à Devise >2.0.1 et un à Rails >3 :

1) Rails 4

Rails 4 : ne permet plus d'action si l'authenticityToken n'est pas présent ou invalide (comme c'est pour une API, je ne veux pas de Auth..Token), voici la solution :

#protect_from_forgery with: :exception
protect_from_forgery with: :null_session, :if => Proc.new { |c| c.request.format == 'application/json' }

Si le format de la requête est en JSON on ne protège pas l'action. A vous de voir si ça pose un problème de sécurité.

2) Devise

Il faut dire explicitement à Devise de répondre aux requêtes json : à mettre dans config/application.rb et non dans l'initalizers/devise.rb !

config.to_prepare do
   DeviseController.respond_to :html, :json
end

Cette API est par exemple utilisée par RubyCas devise authenticator.

Normalement tout devrait fonctionner.

A lire aussi :

https://github.com/plataformatec/devise/issues/2209

https://github.com/plataformatec/devise/issues/2215