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).
Deberías darle una oportunidad a esta gema. https://github.com/AlexanderZaytsev/domp Rápido y fácil de integrar. Tenía una configuración de trabajo en unos 30 metros.
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"]