Я использую 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 и локальном хосте, и как я могу это сделатьрешить это?