Je suis en train de déplacer une application pour utiliser uniquement la connexion fédérée Google (OpenID) pour une application (nous utilisons Google Apps pour tout et pensons qu'il serait plus facile de combiner la gestion des utilisateurs) . Alors que je peux me connecter avec succès et créer des utilisateurs, mes pensées sont maintenant sur la sécurité ...Google Apps et l'authentification Open ID dans Rails - Sécurité
Lorsqu'un utilisateur se connecte, je n'ai qu'un bouton "Connexion" - rien d'autre. Le domaine du site est codé en dur (où SITE_DOMAIN apparaît ci-dessous) et l'utilisateur est redirigé vers la page de connexion google typique.
Voici le code:
def create
open_id_authentication
end
protected
def open_id_authentication
openid_url = 'https://www.google.com/accounts/o8/site-xrds?hd=SITE_DOMAIN'
authenticate_with_open_id(openid_url,
:required => ['http://axschema.org/contact/email',
'http://axschema.org/namePerson/first',
'http://axschema.org/namePerson/last']) do |result, identity_url, registration|
case result.status
when :missing
failed_login "Sorry, the OpenID server couldn't be found"
when :invalid
failed_login "Sorry, but this does not appear to be a valid OpenID"
when :canceled
failed_login "OpenID verification was canceled"
when :failed
failed_login "Sorry, the OpenID verification failed"
when :successful
if @current_user = User.find_by_id_url(identity_url)
if @current_user.login_from(request.env['REMOTE_ADDR'])
successful_login
else
failed_login "Your OpenID profile registration failed: " + @current_user.errors.full_messages.to_sentence
end
else
ax_response = OpenID::AX::FetchResponse.from_success_response(request.env[Rack::OpenID::RESPONSE])
@current_user = User.login_create(ax_response, identity_url, request.env['REMOTE_ADDR'])
successful_login
end
end
end
end
Une fois la connexion réussie, je vous suffit d'enregistrer l'utilisateur dans une session ...
session[:current_user] = @current_user
... et utiliser une méthode simple current_user dans le contrôleur d'application ...
def current_user
return session[:current_user] if defined?(session[:current_user])
end
Ma principale préoccupation concerne la sécurité. OpenIDuthentification utilise le magasin en mémoire et dans l'ensemble, cela semblait un peu trop facile à mettre en œuvre (après avoir lu des tonnes de documentation). Les tests de base montrent que cela fonctionne bien, mais je suis nerveux. :)
Des pensées?
J'utilise le plugin open_id_authentication et le joyau de Openid rubis de base (avec petit bijou rubis-openid applications découverte pour les applications google)