rails google ruby-on-rails devise omniauth

ruby on rails - google - Rails 4, Devise, Omniauth(con mĂșltiples proveedores)



rails devise google (3)

He pasado días viendo los RailsCasts en dispositivos y omniauth y luego siguiendo tutoriales relacionados para configurar un sistema de autenticación que utiliza estas gemas. Creo que los RailsCasts están desactualizados y tratar de subsanar las brechas con otros tutoriales está creando todo tipo de problemas.

Por favor, ¿alguien puede sugerir un tutorial actual que pueda usar como base para implementar este sistema? Tengo modelos de autenticación y de usuario separados (con usuarios que tienen muchas autenticaciones).

Realmente me gustaría usar el dispositivo y omniauth (con CanCan para habilidades) en los rieles 4, pero me estoy desgarrando al intentar encontrar una configuración básica (usando psql como base de datos).



Para usar Devise con múltiples proveedores de autenticación, necesita 1 modelo más - Autorización

#authorization.rb # == Schema Information # # Table name: authorizations # # id :integer not null, primary key # user_id :integer # provider :string(255) # uid :string(255) # token :string(255) # secret :string(255) # created_at :datetime # updated_at :datetime # profile_page :string(255) # class Authorization < ActiveRecord::Base belongs_to :user end

Hay código para modelo de usuario.

#user.rb SOCIALS = { facebook: ''Facebook'', google_oauth2: ''Google'', linkedin: ''Linkedin'' } has_many :authorizations def self.from_omniauth(auth, current_user) authorization = Authorization.where(:provider => auth.provider, :uid => auth.uid.to_s, :token => auth.credentials.token, :secret => auth.credentials.secret).first_or_initialize authorization.profile_page = auth.info.urls.first.last unless authorization.persisted? if authorization.user.blank? user = current_user.nil? ? User.where(''email = ?'', auth[''info''][''email'']).first : current_user if user.blank? user = User.new user.skip_confirmation! user.password = Devise.friendly_token[0, 20] user.fetch_details(auth) user.save end authorization.user = user authorization.save end authorization.user end def fetch_details(auth) self.name = auth.info.name self.email = auth.info.email self.photo = URI.parse(auth.info.image) end

Y al final necesitas reemplazar los métodos para el controlador Devise

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def all user = User.from_omniauth(env[''omniauth.auth''], current_user) if user.persisted? sign_in user flash[:notice] = t(''devise.omniauth_callbacks.success'', :kind => User::SOCIALS[params[:action].to_sym]) if user.sign_in_count == 1 redirect_to first_login_path else redirect_to cabinet_path end else session[''devise.user_attributes''] = user.attributes redirect_to new_user_registration_url end end User::SOCIALS.each do |k, _| alias_method k, :all end end

Si necesita algunos para proveedores, por ejemplo, Twitter, debe anular el método de Twitter, ya que no proporciona correo electrónico al usuario y debe guardar sus credenciales de alguna otra manera.

También deberías hacer algunos cambios en las rutas.

devise_for :users, :controllers => { :omniauth_callbacks => ''users/omniauth_callbacks'', }


en ustedes inicializadores intente hacer algo como esto

#config/initializers/devise.rb #provider1 config.omniauth :facebook, ENV[''FACEBOOK_APP_ID''], ENV[''FACEBOOK_SECRET''], :site => ''https://graph.facebook.com/'', :authorize_path => ''/oauth/authorize'', :access_token_path => ''/oauth/access_token'', :scope => ''email, user_birthday, read_stream, read_friendlists, read_insights, read_mailbox, read_requests, xmpp_login, user_online_presence, friends_online_presence, ads_management, create_event, manage_friendlists, manage_notifications, publish_actions, publish_stream, rsvp_event, user_about_me, user_activities, user_birthday, user_checkins, user_education_history, user_events, user_groups, user_hometown, user_interests, user_likes, user_location, user_notes, user_photos, user_questions, user_relationships, user_relationship_details, user_religion_politics, user_status, user_subscriptions, user_videos, user_website, user_work_history'' #provider2 config.omniauth :twitter, ENV[''TWITTER_KEY''], ENV[''TWITTER_SECRET''], :scope => { :secure_image_url => ''true'', :image_size => ''original'', :authorize_params => { :force_login => ''true'' } } #provider3 config.omniauth :google_oauth2, ENV["GOOGLE_KEY"], ENV["GOOGLE_SECRET"]