Doppio Ruolo con Devise e Omniauth

Il problema: due tipologie di utenti (stessa tabella user, ma col campo type) devono entrare in una applicazione, sia autenticazione standard che con oauth...

Con un attimo di fatica, ma grazie ad alcuni articoli stupendi, sono riuscito a fare "quasi" tutto (come al solito), poi un po' guardando i sorgenti e con un po' di fantasia ora funziona!

Partiamo dall'inizio: per l'autenticazione con devise, basta seguire l'introduzione di communityguide, tutto fila liscio.

Poi si aggiunge qualche finezza, come il recaptcha, che rende la cosa molto raffinata; nelle routes basta specificare che usiamo due utenti e la cosa funziona quasi perfettamente:

devise_for :workers, \
  :controllers => { :registrations => "devise_auth/registrations" }
devise_for :companies, \
  :controllers => { :registrations => "devise_auth/registrations" }

Quasi perché se vogliamo che con la stessa login l'utente possa entrare sia come worker che come company, bisogna avere al finezza di creare l'indice doppio sulla tabella degli users:

add_index :users, [:email,:type], :unique => true

Poi passiamo a Oauth, con il terzo aiuto sempre da communityguide, la cosa funziona egregiamente e ormai siamo quasi a posto....

Odio quel quasi, che ti porta via praticamente due pomeriggi per capire due cose: 

  1. che per inviare al server oauth un parametro per distinguere se l'utente è worker o company esiste solo il magico parametro origin che poi viene restituito nella variabile origin, quindi
    "/auth/twitter?origin=#{user_type}" #URL PER OMNIAUTH
    user_type = params[:origin].to_s == 'company'  ? \
      'company' : 'worker' #in session_controller per capire cosa fare...
    bla bla
  2. Facebook IGNORA il parametro origin!!!

Il famoso quasi a questo punto diventa grande come una casa, lo sconforto ti piglia ma...

Al prossimo post, altrimenti questo diventa immenso!

Categories

Other Posts

RSS Feed

Subscribe

Archives