Développeur Web RoR

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

Tag - sinatra

Fil des billets

lundi 8 juillet 2013

Interfacer RubyCas avec une application RubyOnRails et Devise

RubyCas gère exclusivement le Single Sign On (SSO). En aucun cas il ne gère la gestion des utilisateurs (création de compte, mot de passe oublié, compte verrouillé, etc) : pour tout ça il faut une application séparée (ou bien le faire soi même sur l'application sinatra rubyCas). Devise est un gem reconnu qui fait tout ça très bien, pas question de réinventer la roue !

Le problème c'est que de base les authenticators (module de rubyCas de connexion aux données) ne permettent pas de se connecter à une application avec Devise. Vous pouvez par exemple vous connecter en direct à la base de donnée pour hasher le mot de passe avec BCrypt et vérifier que le hash corresponde (Module SQLBcrypt, SQL, SQLEncrypted). Certe ça fonctionne mais vous perdez l'intérêt de Devise (verrouillage de compte, compte non confirmé, etc).

Un développeur a codé un authenticator pour Devise (via l'api REST Json), sa pull-request est en attente sur Github mais comme j'en ai besoin je l'ai testé et ça marche. Ça marche bien ! Voici le lien vers le fichier : https://github.com/atyndall/rubycas-server/blob/054f219e0dd544392c913597c1f0275ac7c85af2/lib/casserver/authenticators/remote_devise.rb

Par contre il y a un bug pour devise >= 2.2.0 donc utilisez la dernière en 2.1. Et n'oubliez pas de lire mon commentaire en bas de la pull-request concernant include_root_in_json (ça vous évitera de chercher quelques heures).

Lien vers la pull-request : https://github.com/rubycas/rubycas-server/pull/155

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 !