Omniauth рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Facebook, Google, Twitter рдФрд░ Github рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рдПрдХ рдмрд╛рд░ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг / рд▓реЙрдЧрд┐рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╡рд╛рд▓ рд╕реЗ рд╣реИрд░рд╛рди рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдерд╛, рдпрд╛ рдХрд┐рд╕реА рдиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдгред рддреИрдпрд╛рд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдерд╛ред рдФрд░ рдлрд┐рд░ Google рдиреЗ рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ред рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдФрд░ рдЙрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕рдВрд╢реЛрдзрди рдХрд┐рдпрд╛, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛, рдореИрдВ рдмрд╕ рдЦреБрд╢ рдерд╛ред

рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдмреНрдпрд╛рдЬ рдХреЗ рдЙрд╕ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдФрд░ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдирд┐рд░рд╛рд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереАред рдпреИрдВрдбреЗрдХреНрд╕ рдХреИрд╢ рдХреА рдорд╣рд┐рдорд╛, рдЬрд╣рд╛рдВ рд╕реЗ рдЙрд╕ рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рдкреНрд░рддрд┐ рдЦреАрдВрдЪреА рдЧрдИ рдереАред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡рд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реВрдк рд╕реЗ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реБрдЖ, рдореИрдВрдиреЗ рдЙрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ...

рдпрд╣ рдЕрдзреНрдпрд╛рдп рдкреНрд░рд╕рд┐рджреНрдз рд░рддреНрди рдУрдорд╛рдирд┐рдпрд╛рде рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред Omniauth рдорд▓реНрдЯреА-рдкреНрд░рджрд╛рддрд╛ рдмрд╛рд╣рд░реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдпрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдореНрдпреБрдирд┐рдЯреАрдЧрд╛рдЗрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдиреЛрдЯ: рдлрд┐рд▓рд╣рд╛рд▓ рд╕рдВрд╕рд╛рдзрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлреЗрд╕рдмреБрдХ, рдЧреВрдЧрд▓, рдЯреНрд╡рд┐рдЯрд░ рдФрд░ рдЬреАрдердм рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧрд╛)ред рдпрд╣ рдЕрдзреНрдпрд╛рдп рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдбреЗрд╡рд┐рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдореМрдЬреВрджрд╛ рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдлреЗрд╕рдмреБрдХ рд▓реЙрдЧрд┐рди рдЬреЛрдбрд╝реЗрдВ


Omniauth рдорд▓реНрдЯреА-рдкреНрд░рджрд╛рддрд╛ рдмрд╛рд╣рд░реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд░реИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рд╣реИред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Facebook Developers.facebook.com/setup рдкрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ (рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдФрд░ рдПрдХ URL (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП www.communityguides.eu )ред рдлреЗрд╕рдмреБрдХ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдЬреАрдХреГрдд рд╕рд╛рдЗрдЯ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ URL рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, http: // localhost: 3000 ) / ред URL рдореЗрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдпрд╛ 127.0.0.1 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░реЗрдВ, рдЗрд╕рд╕реЗ "рдЕрдорд╛рдиреНрдп рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди / рддреНрд░реБрдЯрд┐" рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ 'рдУрдореНрдиреНрдпреБрде' рд░рддреНрди рдЬреЛрдбрд╝реЗрдВ, рдмрдВрдбрд▓ рдЗрдВрд╕реНрдЯреЙрд▓ рдЪрд▓рд╛рдПрдВ, рдЕрдкрдиреЗ APP_ID / APP_SECRET рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдПрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред

Gemfile
gem 'omniauth', '0.1.6' 

config / initializers / omniauth.rb
 Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, 'APP_ID', 'APP_SECRET' end 

рдЕрдм рд╣рдо рдПрдХ рдирдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдореЙрдбрд▓ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЕрдВрддрд┐рдо
 rails generate model service user_id:integer provider:string uid:string uname:string uemail:string rails generate controller services 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбрд▓ / user.rb
 class User < ActiveRecord::Base devise :database_authenticatable, :oauthable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable has_many :services, :dependent => :destroy has_many :articles, :dependent => :destroy has_many :comments, :dependent => :destroy has_many :ratings, :dependent => :destroy belongs_to :country attr_accessible :email, :password, :password_confirmation, :remember_me, :fullname, :shortbio, :weburl validates :weburl, :url => {:allow_blank => true}, :length => { :maximum => 50 } validates :fullname, :length => { :maximum => 40 } validates :shortbio, :length => { :maximum => 500 } end 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбрд▓ / рд╕реЗрд╡рд╛ред рдЖрд░рдмреА
 class Service < ActiveRecord::Base belongs_to :user attr_accessible :provider, :uid, :uname, :uemail end 

config / рдорд╛рд░реНрдЧреЛрдВ .rb
 ... match '/auth/facebook/callback' => 'services#create' resources :services, :only => [:index, :create] ... 

рд╣рдордиреЗ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ (рдЕрдм рддрдХ рдХреЗрд╡рд▓ рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдмрдирд╛рдПрдВ) рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рдорд╛рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдпрд╣ рдХреНрдпрд╛ рд╣реИ рд╣рдо http: // localhost: 3000 / schem / facebook рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдиреБрд░реЛрдз Facabook рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдлреЗрд╕рдмреБрдХ рдЖрдкрдХреЗ рдкреЗрдЬ рдХреЛ рдкрде / рдЕрдзрд┐рдХрд╛рд░ / рдлреЗрд╕рдмреБрдХ / рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдЗрд╕ рдкрде рдХреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдирд┐рдпрдВрддреНрд░рдХ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рд╣реИред рдЕрдм рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рд╣реИрд╢ рд▓реМрдЯрд╛рддреА рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХ / services_controller.rb
 class ServicesController < ApplicationController def index end def create render :text => request.env["omniauth.auth"].to_yaml end end 

рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред рд╣рдо рдкрддрд╛ http: // localhost: 3000 /itory / facebook рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдлреЗрд╕рдмреБрдХ рдкрд░ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдорд┐рд▓реЗрдЧрд╛ред рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ (рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦреЗрдВ)ред

рдкреГрд╖реНрда рд╕реНрд░реЛрдд рдХреЛрдб
 --- user_info: name: Markus Proske urls: Facebook: http://www.facebook.com/profile.php?id=.... Website: nickname: profile.php?id=.... last_name: Proske first_name: Markus uid: "..." credentials: token: ........... extra: user_hash: name: Markus Proske timezone: 1 gender: male id: "...." last_name: Proske updated_time: 2010-11-18T13:43:01+0000 verified: true locale: en_US link: http://www.facebook.com/profile.php?id=........ email: markus.proske@gmail.com first_name: Markus provider: facebook 

рд╣рдо рдХреЗрд╡рд▓ рдЖрдИрдбреА, рдкреНрд░рджрд╛рддрд╛ рдирд╛рдо рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдВ рд╕реНрдерд┐рдд рдИрдореЗрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: user_hashред рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдБ рд╡рд┐рдзрд┐ рдмрджрд▓реЗрдВ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХ / services_controller.rb
 ... def create omniauth = request.env['omniauth.auth'] if omniauth omniauth['extra']['user_hash']['email'] ? email = omniauth['extra']['user_hash']['email'] : email = '' omniauth['extra']['user_hash']['name'] ? name = omniauth['extra']['user_hash']['name'] : name = '' omniauth['extra']['user_hash']['id'] ? uid = omniauth['extra']['user_hash']['id'] : uid = '' omniauth['provider'] ? provider = omniauth['provider'] : provider = '' render :text => uid.to_s + " - " + name + " - " + email + " - " + provider else render :text => 'Error: Omniauth is empty' end end ... 

рдорд╣рд╛рди, рд╣рдо рдлреЗрд╕рдмреБрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ! рдЕрднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдбреЗрд╡рд┐рд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рд░реНрдХрд┐рдЯ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд┐рдВрджреБ рд╣реИрдВ:

рдУрдорд╛рдирд┐рдпрд╛рде рдЕрдзрд┐рдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░рд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдПрдХ рдбрд╛рдХ рдкрддреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХрд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Github рдПрдХ рдкрддрд╛ рддрднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реЛред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЯреНрд╡рд┐рдЯрд░ рдХрднреА рднреА рдПрдХ рдореЗрд▓рд┐рдВрдЧ рдкрддрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдкрддреЗ рд╡рд╛рд▓реЗ рдЬреАрдердм рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдлрдмреА рдХреА рддрд░рд╣ рд▓реЙрдЧрд┐рди / рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬреАрдердм рдмрд┐рдирд╛ рдкрддреЗ рдпрд╛ рдЯреНрд╡рд┐рдЯрд░ рдЦрд╛рддреЛрдВ рдХреЛ рдореМрдЬреВрджрд╛ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рджрд╛рддрд╛ рдПрдХ рд╣реИрд╢ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХреАрдХреГрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рд░ рдХреЛрдИ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд╛рдкрд╕ рдмреБрд▓рд╛рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ (рд▓реЙрдЧ рдЗрди рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░) рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рд╣рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдорд╛рд░реНрдЧ рдлрд┐рд░ рд╕реЗ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдЗрд╕рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдПрдХ рдХрд╛ рдирд╛рдо рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛: рдкрд░рдореЗрд╕ [рд╕реЗрд╡рд╛]ред

config / рдорд╛рд░реНрдЧреЛрдВ .rb
 ... match '/auth/:service/callback' => 'services#create' resources :services, :only => [:index, :create, :destroy] ... 


рдЕрдЧрд▓рд╛, рдЬреАрдердм рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рдкрдиреНрдиреЛрдВ рдкрд░ рдЬрд╛рдПрдВред рд╣рдо рдлрд┐рд░ рд╕реЗ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ (рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рд▓рд┐рдП, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ 127.0.0.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдирдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ http: // localhost: 3000 / or / github / callback / рдФрд░ http: //127.0.0.1eps000/auth/twitter/callback ред рдлрд┐рд░ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдмрджрд▓реЗрдВред


config / initializers / omniauth.rb
 # Do not forget to restart your server after changing this file Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, 'APP_ID', 'APP_SECRET' provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' provider :github, 'CLIENT ID', 'SECRET' end 

рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдзрд┐ рдкрде рдФрд░ рдУрдорд╛рдирд┐рдпрд╛рде рд╣реИрд╢ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣реИрд╢ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рд╣рдорд╛рд░реЗ рдЪрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд░реЛрдХреЗрдВред
рднрд╛рдЧ рдПрдХ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рд╕реЗрд╡рд╛ рдореЙрдбрд▓ рдореЗрдВ рдкреНрд░рджрд╛рддрд╛-рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝реА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЬреЛрдбрд╝реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рджрд░реНрдЬ рдХрд░реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореЗрд▓рд┐рдВрдЧ рдкрддреЗ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдЗрд╕ рдкрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рд╣реИред рдЬрдм рдРрд╕рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реЗрд╡рд╛ рдЙрд╕реЗ рдЬреЛрдбрд╝ рджреА рдЬрд╛рдПрдЧреА рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд╣ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдПрдХ рдирдпрд╛ рдбрд╛рдХ рдкрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрд╡рд╛ рдХреЛ рдЙрд╕рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рднрд╛рдЧ рджреЛ : рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╣реА рд▓реЙрдЧ рдЗрди рдХрд░ рдЪреБрдХрд╛ рд╣реИ: рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рдЙрд╕рдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рдиреАрдЪреЗ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЛред рдЗрд╕рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рд╣реИрдВ рдФрд░ рдлреЗрд╕рдмреБрдХ, рдЬреАрдердм рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдирдпрд╛ рдкреНрд░рджрд╛рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 4 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреЛрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕реНрд╡рдпрдВ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХ / services_controller.rb
 class ServicesController < ApplicationController before_filter :authenticate_user!, :except => [:create] def index # get all authentication services assigned to the current user @services = current_user.services.all end def destroy # remove an authentication service linked to the current user @service = current_user.services.find(params[:id]) @service.destroy redirect_to services_path end def create # get the service parameter from the Rails router params[:service] ? service_route = params[:service] : service_route = 'no service (invalid callback)' # get the full hash from omniauth omniauth = request.env['omniauth.auth'] # continue only if hash and parameter exist if omniauth and params[:service] # map the returned hashes to our variables first - the hashes differ for every service if service_route == 'facebook' omniauth['extra']['user_hash']['email'] ? email = omniauth['extra']['user_hash']['email'] : email = '' omniauth['extra']['user_hash']['name'] ? name = omniauth['extra']['user_hash']['name'] : name = '' omniauth['extra']['user_hash']['id'] ? uid = omniauth['extra']['user_hash']['id'] : uid = '' omniauth['provider'] ? provider = omniauth['provider'] : provider = '' elsif service_route == 'github' omniauth['user_info']['email'] ? email = omniauth['user_info']['email'] : email = '' omniauth['user_info']['name'] ? name = omniauth['user_info']['name'] : name = '' omniauth['extra']['user_hash']['id'] ? uid = omniauth['extra']['user_hash']['id'] : uid = '' omniauth['provider'] ? provider = omniauth['provider'] : provider = '' elsif service_route == 'twitter' email = '' # Twitter API never returns the email address omniauth['user_info']['name'] ? name = omniauth['user_info']['name'] : name = '' omniauth['uid'] ? uid = omniauth['uid'] : uid = '' omniauth['provider'] ? provider = omniauth['provider'] : provider = '' else # we have an unrecognized service, just output the hash that has been returned render :text => omniauth.to_yaml #render :text => uid.to_s + " - " + name + " - " + email + " - " + provider return end # continue only if provider and uid exist if uid != '' and provider != '' # nobody can sign in twice, nobody can sign up while being signed in (this saves a lot of trouble) if !user_signed_in? # check if user has already signed in using this service provider and continue with sign in process if yes auth = Service.find_by_provider_and_uid(provider, uid) if auth flash[:notice] = 'Signed in successfully via ' + provider.capitalize + '.' sign_in_and_redirect(:user, auth.user) else # check if this user is already registered with this email address; get out if no email has been provided if email != '' # search for a user with this email address existinguser = User.find_by_email(email) if existinguser # map this new login method via a service provider to an existing account if the email address is the same existinguser.services.create(:provider => provider, :uid => uid, :uname => name, :uemail => email) flash[:notice] = 'Sign in via ' + provider.capitalize + ' has been added to your account ' + existinguser.email + '. Signed in successfully!' sign_in_and_redirect(:user, existinguser) else # let's create a new user: register this user and add this authentication method for this user name = name[0, 39] if name.length > 39 # otherwise our user validation will hit us # new user, set email, a random password and take the name from the authentication service user = User.new :email => email, :password => SecureRandom.hex(10), :fullname => name # add this authentication service to our new user user.services.build(:provider => provider, :uid => uid, :uname => name, :uemail => email) # do not send confirmation email, we directly save and confirm the new record user.skip_confirmation! user.save! user.confirm! # flash and sign in flash[:myinfo] = 'Your account on CommunityGuides has been created via ' + provider.capitalize + '. In your profile you can change your personal information and add a local password.' sign_in_and_redirect(:user, user) end else flash[:error] = service_route.capitalize + ' can not be used to sign-up on CommunityGuides as no valid email address has been provided. Please use another authentication provider or use local sign-up. If you already have an account, please sign-in and add ' + service_route.capitalize + ' from your profile.' redirect_to new_user_session_path end end else # the user is currently signed in # check if this service is already linked to his/her account, if not, add it auth = Service.find_by_provider_and_uid(provider, uid) if !auth current_user.services.create(:provider => provider, :uid => uid, :uname => name, :uemail => email) flash[:notice] = 'Sign in via ' + provider.capitalize + ' has been added to your account.' redirect_to services_path else flash[:notice] = service_route.capitalize + ' is already linked to your account.' redirect_to services_path end end else flash[:error] = service_route.capitalize + ' returned invalid data for the user id.' redirect_to new_user_session_path end else flash[:error] = 'Error while authenticating via ' + service_route.capitalize + '.' redirect_to new_user_session_path end end 


рд╣рдорд╛рд░рд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рдЕрднреА рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЦрд╛рддреЗ рдФрд░ рд▓реЙрдЧрд┐рди рдпрд╛ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреАрди рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд▓реЙрдЧрд┐рди рдФрд░ рдкрдВрдЬреАрдХрд░рдг рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрде / рдирд┐рдпрдо / рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рд╣рдореЗрд╢рд╛ / рд╕рд╛рдорд╛рдиреНрдп / рд╕реЗрд╡рд╛ / рдХреЙрд▓рдмреИрдХ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдРрд╕реА рдЦрд╛рдореА рд╣реИ рдЬреЛ рдЕрд╡рд╛рдВрдЫрд┐рдд рдЦрд╛рддреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИ: рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЦрд╛рддреЗ (рдореЗрд▓: one@user.com) рдФрд░ рдПрдХ рдлреЗрд╕рдмреБрдХ рдЦрд╛рддреЗ (рдореЗрд▓: two@user.com) рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рдПрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдиреАрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ, рдкрддреЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдореЗрд▓: рддреАрди@user.com рдХреЗ рд╕рд╛рде рдПрдХ Google рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕рддреНрд░ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрднреА рднреА Google рдЦрд╛рддрд╛ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ: рдпрджрд┐ рд╡рд╣ "Google рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рддреАрди@user.com рдЦреЛрдЬреЗрдЧрд╛, рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрдЬреЗрдЧрд╛ рдФрд░ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдЧрд╛ред
рдпрд╣ рдХреБрдЫ рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЖрдЗрдП рд▓реЙрдЧ рдЗрди рдХрд░рдХреЗ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:

app / views / devise / session / new.html.erb
 <section id="deviseauth"> <h2>Sign in</h2> <h3>Sign in with your CommunityGuides account -- OR -- use an authentication service</h3> <div id="local" class="box"> <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> <p><%= f.label :email %><br /> <%= f.text_field :email %></p> <p><%= f.label :password %><br /> <%= f.password_field :password %></p> <% if devise_mapping.rememberable? %> <p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p> <% end %> <p><%= f.submit "Sign in" %></p> <% end %> </div> <div id="remote"> <div id="terms" class="box"> <%= link_to "Terms of Service", "#" %> </div> <div id="services" class="box"> <a href="/auth/facebook" class="services"><%= image_tag "facebook_64.png", :size => "64x64", :alt => "Facebook" %>Facebook</a> <a href="/auth/google" class="services"><%= image_tag "google_64.png", :size => "64x64", :alt => "Google" %>Google</a> <a href="/auth/github" class="services"><%= image_tag "github_64.png", :size => "64x64", :alt => "Github" %>Github</a> <a href="/auth/twitter" class="services"><%= image_tag "twitter_64.png", :size => "64x64", :alt => "Twitter" %>Twitter</a> </div> </div> <div id="devise_links"> <%= render :partial => "devise/shared/links" %> </div> </section> 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡рд┐рдЪрд╛рд░ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рдкрдВрдЬреАрдХрд░рдг / new.html.erb
 <section id="deviseauth"> <h2>Sign up</h2> <h3>Sign up on CommunityGuides manually -- OR -- or use one of your existing accounts</h3> <div id="local2" class="box"> <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <p><%= f.label :email %><br /> <%= f.text_field :email %></p> <p><%= f.label :password %><br /> <%= f.password_field :password %></p> <p><%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation %></p> <p><%= recaptcha_tags %></p> <p><%= f.submit "Sign up" %></p> <% end %> </div> <div id="remote2"> <div id="terms" class="box"> <%= link_to "Terms of Service", "#" %> </div> <div id="services" class="box"> <a href="/auth/facebook" class="services2"><%= image_tag "facebook_64.png", :size => "64x64", :alt => "Facebook" %>Facebook</a> <a href="/auth/google" class="services2"><%= image_tag "google_64.png", :size => "64x64", :alt => "Google" %>Google</a> <a href="/auth/github" class="services2"><%= image_tag "github_64.png", :size => "64x64", :alt => "Github" %>Github*</a> <div id="footnote_signup">* You can use Github only if you set a public email address</div> </div> </div> <div id="devise_links"> <%= render :partial => "devise/shared/links" %> </div> </section> 


рдЖрдк Github: Authbuttons рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧрд┐рди рдпрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдкреГрд╖реНрда рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рдиреАрдп рдПрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рдЦрд╛рддреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдРрдк / рд╡рд┐рдЪрд╛рд░ / рд╕реЗрд╡рд╛рдПрдВ / index.html.erb
 <section id="deviseauth"> <h2>Authentication Services - Setting</h2> <div id="currservices"> <h3>The following <%= @services.count == 1 ? 'account is' : 'accounts are' %> connected with your local account at CommunityGuides:</h3> <% @services.each do |service| %> <div class="services_used"> <%= image_tag "#{service.provider}_64.png", :size => "64x64" %> <div class = "user"> <div class="line1">Name: <%= service.uname %> (ID: <%= service.uid %>)</div> <div class="line2">Email: <%= service.uemail != '' ? service.uemail : 'not set' %></div> <div class="line3"> <% @services.count == 1 ? @msg = 'Removing the last account linked might lock you out of your account if you do not know the email/password sign-in of your local account!' : @msg = '' %> <%= link_to "Remove this service", service, :confirm => 'Are you sure you want to remove this authentication service? ' + @msg, :method => :delete, :class => "remove" %> </div> </div> </div> <% end %> </div> <div id="availableservices"> <h3>You can connect more services to your account:</h3> <div id="services"> <a href="/auth/facebook" class="services"><%= image_tag "facebook_64.png", :size => "64x64", :alt => "Facebook" %>Facebook</a> <a href="/auth/google" class="services"><%= image_tag "google_64.png", :size => "64x64", :alt => "Google" %>Google</a> <a href="/auth/github" class="services"><%= image_tag "github_64.png", :size => "64x64", :alt => "Github" %>Github</a> <a href="/auth/twitter" class="services"><%= image_tag "twitter_64.png", :size => "64x64", :alt => "Twitter" %>Twitter</a> </div> <h4>If you signed-up for CommunityGuides via an authentication service a random password has been set for the local password. You can request a new password using the "Forgot your Password?" link on the sign-in page.</h4> </div> </section> 


Google рдХреЛ рдЬреЛрдбрд╝реЗрдВ

рдЕрдВрдд рдореЗрдВ, Google рдХреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред Google (рдФрд░ OpenID рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ) рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдЧреНрд░рд╣рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЕрдиреБрд╕рд╛рд░ ActiveRecord рдпрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╣рд░реЛрдХреВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ / tmp рддрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рд╣рд░реЛрдХреВ рдбреЙрдХреНрд╕ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкред

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рджреЛ рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдПрдХ рд╣реИрд╢ рд╕реЗ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ Google рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ? рдУрдордирд┐рдпрд╛рде рдЖрдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдУрдорд╛рдирд┐рдпрд╛рде рд╡рд┐рдХреА рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░реИрдирд╛ рдмреЗрдЯреНрд╕ рдиреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╕реНрдХреНрд░реИрдирд╛рд╕реНрдЯ рдХрд┐рдПред

рдлрд┐рд░ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдереЛрдбрд╝реА рдЦрд╛рдореА рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реЗрдЦрд╛ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдбреЗрд╡рд┐рд╕ рд╡рд┐рдХреА рдХреЗ рдкрд╛рд╕ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд╣реИред рд▓реЗрдХрд┐рди рдШрд░ рдкрд░ рд╣рдо рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрдкрдХреЛ рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдЪрд╛рд╣реЗрдВ рддреЛ рд╕реНрдерд╛рдиреАрдп рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░ рд╕рдХреЗрдВрдЧреЗред рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХреЛрдВ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ / рдкрдВрдЬреАрдХрд░рдг_рд╕рдВрдХреНрд░рдордг_рдЖрд░рдмреА
 ... def update # no mass assignment for country_id, we do it manually # check for existence of the country in case a malicious user manipulates the params (fails silently) if params[resource_name][:country_id] resource.country_id = params[resource_name][:country_id] if Country.find_by_id(params[resource_name][:country_id]) end if current_user.haslocalpw super else # this account has been created with a random pw / the user is signed in via an omniauth service # if the user does not want to set a password we remove the params to prevent a validation error if params[resource_name][:password].blank? params[resource_name].delete(:password) params[resource_name].delete(:password_confirmation) if params[resource_name][:password_confirmation].blank? else # if the user wants to set a password we set haslocalpw for the future params[resource_name][:haslocalpw] = true end # this is copied over from the original devise controller, instead of update_with_password we use update_attributes if resource.update_attributes(params[resource_name]) set_flash_message :notice, :updated sign_in resource_name, resource redirect_to after_update_path_for(resource) else clean_up_passwords(resource) render_with_scope :edit end end end ... 


рдХреЛрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ( t.boolean: haslocalpw ,: null => false ,: default => true ), рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдмрджрд▓реЗрдВ, рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдмрджрд▓реЗрдВ рд╡рд░реНрддрдорд╛рди рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдпрджрд┐ рд╣реИрд╕реНрд▓реЛрдкреНрдХрд╡реЙрдлрд╝ рдЭреВрдареА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рд╡рд┐рдзрд┐ рдмрджрд▓реЗрдВ:

рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдирд┐рдпрдВрддреНрд░рдХ / services_controller.rb
 ... user = User.new :email => email, :password => SecureRandom.hex(10), :fullname => name, :haslocalpw => false ... 


рдкреБрдирд╢реНрдЪ: рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдмрдбрд╝рд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдкреАрдПрдо рдореЗрдВ рддреНрд░реБрдЯрд┐ / рд╢рдмреНрджрд╛рдВрдХрди рдХреЛ рдЧрд▓рдд рдХрд░реЗрдВред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In166325/


All Articles