首页 > 解决方案 > Rails 5:具有设计和 html5 地理定位问题的 Omniauth

问题描述

我正在使用devise,并且刚刚将该omniauth功能添加到 Rails 应用程序中。

gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'activerecord-session_store'

路线

devise_for :users, controllers: {registrations: 'users/registrations', sessions: 'users/sessions', omniauth_callbacks: "users/omniauth_callbacks"}

设计.rb

config.omniauth :facebook, 'App id', 'App_secret', callback_url: "https://localhost:3000/users/auth/facebook/callback", :scope => 'email', info_fields: 'email, name'
config.omniauth :twitter, 'app_id', 'App_secret', callback_url: "https://localhost:3000/users/auth/twitter/callback"

用户.rb

devise :database_authenticatable, :registerable, :recoverable, :timeoutable, :rememberable,
     :validatable, :trackable, :lockable, :omniauthable, :omniauth_providers => [:facebook, :twitter], :authentication_keys => {email: true}


 def self.create_from_facebook_data(facebook_data)
    where(provider: facebook_data.provider, uid: facebook_data.uid).first_or_create do | user |
      user.email = facebook_data.info.email
      user.name = facebook_data.info.name
      user.image = facebook_data.info.image
      user.password = Devise.friendly_token[0, 20]
    end
  end

  def self.create_from_twitter_data(twitter_data)
    where(provider: twitter_data.provider, uid: twitter_data.uid).first_or_create do | user |
      user.email = twitter_data.info.email
      user.name = twitter_data.info.nickname
      user.image = twitter_data.info.image
      user.password = Devise.friendly_token[0, 20]
    end
  end

omn​​iauth_callbacks_controller.rb

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  # facebook callback
  def facebook
    @user = User.create_from_facebook_data(request.env['omniauth.auth'])
    if @user.persisted?
      sign_in_and_redirect @user
      set_flash_message(:notice, :success, kind: 'Facebook') if is_navigational_format?
    else
      flash[:error] = 'There was a problem signing you in through Facebook. Please register or try signing in later.'
      redirect_to new_user_registration_url
    end
  end

  # twitter callback
  def twitter
    @user = User.create_from_twitter_data(request.env['omniauth.auth'])
    if @user.persisted?
      sign_in_and_redirect @user
      set_flash_message(:notice, :success, kind: 'Twitter') if is_navigational_format?
    else
      flash[:error] = 'There was a problem signing you in through Twitter. Please register or try signing in later.'
      redirect_to new_user_registration_url
    end
  end

  def failure
    flash[:error] = 'There was a problem signing you in. Please register or try signing in later.'
    redirect_to new_user_registration_url
  end
end

我可以使用社交媒体帐户登录,到目前为止一切正常,但我注意到一个错误,我无法弄清楚是什么原因造成的。

我正在使用 html5 地理位置来获取用户的位置,然后根据该位置进行搜索。此外,为了使用和允许访问 html5 地理位置,我必须实现这个

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(setGeoCookie, displayError);

    } else {
        alert("Geolocation is not supported by this browser.");
    }
}

function setGeoCookie(position) {
    var cookieName = "lat_lng";
    var now = new Date();
    var time = now.getTime();
    time += 3600 * 5000;
    now.setTime(time);
    var cookie_val = position.coords.latitude + "|" + position.coords.longitude;
    document.cookie = cookieName +"=" + cookie_val + '; expires=' + now.toUTCString() + '; path=/';
    $("#search-form").trigger('submit.rails');
}

function displayError(error) {
    var errors = {
        1: 'You need to click on allow.',
        2: 'Position unavailable',
        3: 'Request timeout'
    };
    alert("Error: " + errors[error.code]);
    location.reload();
}

现在,当我尝试在 localhost 中使用 safari 浏览器进行测试时,会发生这种奇怪的事情......如果我使用 twitter 或 Facebook 登录,2: 'Position unavailable'当我尝试执行搜索时会弹出错误。如果我用谷歌登录一切正常。仅当我使用 safari 并使用 twitter 或 Facebook 登录时,才会出现此问题,如果我使用 firefox,它就可以正常工作。

有什么想法可能在 safari 和 localhost 中导致此问题,以及我该如何解决?

标签: javascriptruby-on-railsgeolocationomniauth

解决方案


推荐阅读