Rails 5: Omniauth с проблемой разработки и html5 геолокации - PullRequest
0 голосов
/ 27 мая 2019

Я использую devise, и я только что добавил функцию omniauth в приложение rails.

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

routs

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

devise.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"

User.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

omniauth_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, мне пришлось реализовать this .

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();
}

Теперь, когда я пытаюсь протестировать локальный хост и использовать браузер Safari,происходит странная вещь ... Если я войду в систему через твиттер или фейсбук, при попытке поиска появится сообщение 2: 'Position unavailable'.Если я вхожу в Google, все работает нормально.Эта проблема возникает только тогда, когда я использую Safari и вошел в систему через Twitter или Facebook, если я использую Firefox, он работает просто отлично.

Любые идеи, которые могут вызывать эту проблему в Safari и локальном хосте, и как я могу это сделатьрешить это?

...