uygulamak için ne yapmalıdır: Bir e-posta ve şifresini kullanarak) veya bir kimlik doğrulama jetonu olan Omniauth, uygulamanızın bir kullanıcının kimliğini doğrulamak için Facebook sunucularına "konuşmasını" sağlar. Diğer bir deyişle Omniauth, Devise'nin üstüne oturur ve kullanıcılarınızın kimlik doğrulamasının sayısını artırır.
0) yapılandırmak vasiyetle: sadece bu izleyin: Facebook uygulamak için
Gerekirse giriş https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
1) kullanıcısı tıkladığında "Başlamak için Omniauth söyleyecektir senin görünümünde bir bağlantı ortaya Facebook sunucusuna Eğer ben bir User.create_user (registration_hash diyoruz göreceksiniz Facebook'ta
Şimdi
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
before_filter { @omniauth_hash = env["omniauth.auth"] }
# This method is responsible to create a registration_hash given an
# omniaauth_hash
# schama: https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema
def self.build_registration_hash(omniauth_hash={})
if (omniauth_hash["provider"].downcase.eql?("facebook"))
provider = "facebook"
# catch any excpetions thrown by code just to make sure we can continue even if parts of the omnia_has are missing
begin
first_name = omniauth_hash['user_info']['first_name']
last_name = omniauth_hash['user_info']['last_name']
sex = omniauth_hash.fetch('extra', {}).fetch('user_hash',{})['gender']
birthday = Date.strptime(omniauth_hash.fetch('extra', {}).fetch('user_hash', {})['birthday'],'%m/%d/%Y') if omniauth_hash.fetch('extra', {}).fetch('user_hash', {})['birthday']
if omniauth_hash.fetch('extra', {}).fetch('user_hash', {})['timezone']
utc_offset_in_hours = (omniauth_hash.fetch('extra', {}).fetch('user_hash', {})['timezone']).to_i
time_zone = (ActiveSupport::TimeZone[utc_offset_in_hours]).name
else
time_zone = nil
end
locale = omniauth_hash.fetch('extra', {}).fetch('user_hash', {})['locale']
home_town = omniauth_hash.fetch('extra', {}).fetch('user_hash', {}).fetch('location', {})['name']
if omniauth_hash.fetch('user_info', {})['image']
photo_url = (omniauth_hash.fetch('user_info', {})['image']).gsub("=square","=large") #http://graph.facebook.com/531564247/picture?type=square
else
photo_url = nil
end
rescue => ex
logger.error("Error while parsing facebook auth hash: #{ex.class}: #{ex.message}")
sex = nil
birthday = nil
time_zone = nil
locale = nil
home_town = nil
photo_url = nil
end
elsif omniauth_hash['uid'].downcase.include?("google.com")
provider = "google"
if omniauth_hash['user_info']['first_name'] and omniauth_hash['user_info']['last_name']
first_name = omniauth_hash['user_info']['first_name']
last_name = omniauth_hash['user_info']['last_name']
elsif omniauth_hash['user_info']['name']
first_name = omniauth_hash['user_info']['name'].split(' ')[0]
last_name = omniauth_hash['user_info']['name'].split(' ')[1]
else
first_name = nil
last_name = nil
end
sex = nil
birthday = nil
time_zone = nil
locale = nil
home_town = nil
photo_url = nil
elsif omniauth_hash['uid'].downcase.include?("yahoo.com")
provider = "yahoo"
if omniauth_hash['user_info']['first_name'] and omniauth_hash['user_info']['last_name']
first_name = omniauth_hash['user_info']['first_name']
last_name = omniauth_hash['user_info']['last_name']
elsif omniauth_hash['user_info']['name']
first_name = omniauth_hash['user_info']['name'].split(' ')[0]
last_name = omniauth_hash['user_info']['name'].split(' ')[1]
else
first_name = nil
last_name = nil
end
sex = nil
birthday = nil
time_zone = nil
locale = nil
home_town = nil
photo_url = nil
elsif omniauth_hash['uid'].downcase.include?("aol.com")
if omniauth_hash['user_info']['first_name'] and omniauth_hash['user_info']['last_name']
first_name = omniauth_hash['user_info']['first_name']
last_name = omniauth_hash['user_info']['last_name']
elsif omniauth_hash['user_info']['name']
first_name = omniauth_hash['user_info']['name'].split(' ')[0]
last_name = omniauth_hash['user_info']['name'].split(' ')[1]
else
first_name = nil
last_name = nil
end
provider = "aol"
sex = nil
birthday = nil
time_zone = nil
locale = nil
home_town = nil
photo_url = nil
else
provider = "open_id"
if omniauth_hash['user_info']['first_name'] and omniauth_hash['user_info']['last_name']
first_name = omniauth_hash['user_info']['first_name']
last_name = omniauth_hash['user_info']['last_name']
elsif omniauth_hash['user_info']['name']
first_name = omniauth_hash['user_info']['name'].split(' ')[0]
last_name = omniauth_hash['user_info']['name'].split(' ')[1]
else
first_name = nil
last_name = nil
end
sex = nil
birthday = nil
time_zone = nil
locale = nil
home_town = nil
photo_url = nil
end
h = {
:provider => provider,
:email => omniauth_hash['user_info']['email'],
:profile_attributes => {
:first_name => first_name ,
:last_name => last_name,
:avatar_url => photo_url,
:sex => sex,
:birthday => birthday,
:time_zone => time_zone,
:locale => locale,
:location => home_town
}
}
end
def process_callback
# The registration hash isolates the rest of the code from learning all the different structures
# of the omnia_hash
registration_hash = Users::OmniauthCallbacksController.build_registration_hash(@omniauth_hash)
logger.debug(registration_hash.to_yaml)
# Set the @user to nil
@user = nil
# Find if an authentication token for this provider and user id already exists
authentication = Authentication.find_by_provider_and_uid(@omniauth_hash['provider'], @omniauth_hash['uid'])
if authentication # We found an authentication
if user_signed_in? && (authentication.user.id != current_user.id)
flash[:error] = I18n.t "controllers.omniauth_callbacks.process_callback.error.account_already_taken",
:provider => registration_hash[:provider].capitalize,
:account => registration_hash[:email]
redirect_to edit_user_account_path(current_user)
return
end
else
# We could not find the authentication than create one
authentication = Authentication.new(:provider => @omniauth_hash['provider'], :uid => @omniauth_hash['uid'])
if user_signed_in?
authentication.user = current_user
else
registration_hash[:skip_confirmation] = true
authentication.user = User.find_by_email(registration_hash[:email]) || User.create_user(registration_hash)
end
end
@user = authentication.user
# save the authentication
authentication.token = @omniauth_hash
authentication.provider_name = registration_hash[:provider]
authentication.provider_username = registration_hash[:email]
if !authentication.save
logger.error(authentication.errors)
end
# If a user is signed in then he is trying to link a new account
if user_signed_in?
if authentication.persisted? # This was a linking operation so send back the user to the account edit page
flash[:success] = I18n.t "controllers.omniauth_callbacks.process_callback.success.link_account",
:provider => registration_hash[:provider].capitalize,
:account => registration_hash[:email]
else
flash[:error] = I18n.t "controllers.omniauth_callbacks.process_callback.error.link_account",
:provider => registration_hash[:provider].capitalize,
:account => registration_hash[:email],
:errors =>authentication.errors
end
redirect_to edit_user_account_path(current_user)
else
# This was a sign in operation so sign in the user and redirect it to his home page
if @user.persisted? && authentication.persisted?
flash[:success] = I18n.t "controllers.omniauth_callbacks.process_callback.success.sign_in",
:provider => registration_hash[:provider].capitalize,
:account => registration_hash[:email]
sign_in_and_redirect(:user,@user)
else
session['registration_hash'] = registration_hash
flash[:error] = I18n.t "controllers.omniauth_callbacks.process_callback.error.sign_in",
:provider => registration_hash[:provider].capitalize,
:account => registration_hash[:email]
redirect_to new_registration_users_url
end
end
end
def facebook
process_callback
end
def gmail
process_callback
end
yanıt vermek için bir denetleyici uygulamak zorunda Facebook sunucu uygulaması arayacak Bir noktada
=link_to image_tag("facebook_64.png", :size => "64x64", :alt => "Facebook"), user_omniauth_authorize_path(:facebook, :display=>"dialog"), :title=>"Facebook"
2)). Bu yöntem uygulama, uygulama bir kullanıcı oluşturmak nasıl bağlı olacaktır ama en azından yöntem, bir kullanıcı oluşturmak ve buna bir rasgele şifre atamak zorundadır: Ben bu yüzden diğer hizmetiyle My uygulama desteği giriş:
def self.create_user(registration_hash)
logger.info "Creating new user with registration hash: #{registration_hash.to_yaml}"
unless registration_hash or resigration_hash.empty?
return nil
end
user = User.new
user.email = registration_hash[:email]
if registration_hash[:password]
user.password = registration_hash[:password]
else
user.password = Devise.friendly_token[0,20]
end
user.password_confirmation = user.password
# custom app code here...
if registration_hash[:skip_confirmation] == true
user.confirm!
end
user
end
Not kimlik doğrulama belirteçleri içeren bir tablo uyguladı.
Bu, başlamanıza yardımcı olabilir. Bu uygulamayı kullanabilirsiniz
'iletişim' seçeneği uygun gibi görünüyor tüm şeyler. Bence 'popup' bu güne denk geliyor. – drewww
Şimdi, Popup ayrıca @drewww –