Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

Tag - rubycas

Fil des billets

mercredi 11 septembre 2013

Faire fonctionner l'API JSON de Devise 3.1.0 avec Rails 4

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

vendredi 5 juillet 2013

Single Sign On (authentification centralisée) avec RubyCas

RubyCas-Server est une application sinatra qui respecte la norme CAS (central authentification service). Elle permet le single sign on. (Wiki RubyCas : https://github.com/rubycas/rubycas-server/wiki)

RubyCas-server retient le service qui demande l'authentification mais si l'on effectue quelques manipulations (création de compte par exemple), le redirection vers le service ne sera pas effective. Il n'y a pas grand chose à faire pour palier à ce problème. Il suffit d'activer les sessions dans rubycas-server. Comme il s'agit d'une application sinatra il faut activer les sessions manuellement :

dans le fichier lib/casserver/server.rb

enable :sessions

Ensuite ligne 307 (dans la route get "#{uri_path}/login" do) il faut retenir le service et le surcharger en cas d'autres redirections, remplacer la ligne @service = clean_service_url(params['service']) par

if params['service'].nil? or params['service'].empty? then
@service = clean_service_url(session['service'])
else
session['service'] = params['service']
@service = clean_service_url(params['service'])
end

Maintenant vous aurez la redirection vers le service effective même après une création de compte, un mot de passe oublié ou autre !