但是,这个示例页面让我很困惑:https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
它指出:
With Rails 3.0.3,use this in your Gemfile instead if rails is having
trouble loading oauth core:gem “omniauth”
Next,you need to declare the provider in your
config/initializers/devise.rb:config.omniauth :facebook,“APP_ID”,“APP_SECRET”
题
omniauth和devise是否相互关联?
在基于Railscast 250的身份验证中,我该怎么做才能实现Facebook登录
解决方法
要实现Facebook登录,您需要:
0)配置设计:只需遵循:https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
1)在您的视图中显示一个链接,当用户点击时会告诉Omniauth开始“说话”到Facebook服务器.
=link_to image_tag("facebook_64.png",:size => "64x64",:alt => "Facebook"),user_omniauth_authorize_path(:facebook,:display=>"dialog"),:title=>"Facebook"
2)Facebook服务器有一次会调用你的应用程序,所以你必须实现一个控制器来响应Facebook
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',{})['birthday'],'%m/%d/%Y') if omniauth_hash.fetch('extra',{})['birthday'] if omniauth_hash.fetch('extra',{})['timezone'] utc_offset_in_hours = (omniauth_hash.fetch('extra',{})['timezone']).to_i time_zone = (ActiveSupport::TimeZone[utc_offset_in_hours]).name else time_zone = nil end locale = omniauth_hash.fetch('extra',{})['locale'] home_town = omniauth_hash.fetch('extra',{}).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",:account => registration_hash[:email] else flash[:error] = I18n.t "controllers.omniauth_callbacks.process_callback.error.link_account",: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",: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",:account => registration_hash[:email] redirect_to new_registration_users_url end end end def facebook process_callback end def gmail process_callback end
现在您将注意到我调用了User.create_user(registration_hash).此方法实现将取决于您的应用程序如何创建用户,但至少该方法必须创建用户并为其分配随机密码:
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
注意:我的应用程序支持使用其他服务登录,因此我实现了一个包含身份验证令牌的表.
希望这可以帮助你入门.
原文地址:https://www.jb51.cc/ruby/264442.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。