Аутентифицированные маршруты с Omniauth Google

Я пытаюсь сделать аутентифицированный маршрут /me используя https://github.com/zquestz/omniauth-google-oauth2. Пока что у меня есть библиотека, настроенная для входа и выхода, и она работает нормально. Однако я хочу, чтобы определенные маршруты были доступны только тогда, когда пользователь вошел в систему. Я нашел этот фрагмент и внес несколько небольших изменений в соответствии с моими настройками.

application_controller.rb

before_filter :authenticate
def authenticate
    redirect_to :login unless User.from_omniauth(env["omniauth.auth"])
end

user.rb

def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
        user.provider = auth.provider
        user.uid = auth.uid
        user.name = auth.info.name
        user.first_name = auth.info.first_name
        user.last_name = auth.info.last_name
        user.email = auth.info.email
        user.picture = auth.info.image
        user.oauth_token = auth.credentials.token
        user.oauth_expires_at = Time.at(auth.credentials.expires_at)
        user.save!
    end

я использовал env["omniauth"] потому что это хэш аутентификации, который я использовал в своем SessionsController,

Однако теперь, когда я иду в localhost:3000Я получаю следующую ошибку:

undefined method `provider' for nil:NilClass

Я предполагаю, что это происходит потому, что env["omniauth.auth"] недоступен из application_controller.rb? Если это так, то как мне правильно получить доступ к хэшу аутентификации?

1 ответ

Решение

Попробуй это:

application_controller.rb

before_filter :authenticate

def authenticate
  redirect_to :login unless user_signed_in?
end

def user_signed_in?
  !!current_user
end

def current_user
  @current_user ||= begin
    User.find(session[:current_user_id]) || fetch_user_from_omniauth
  end
end

def fetch_user_from_omniauth
  user = User.from_omniauth(env['omniauth.auth'])
  session[:current_user_id] = user.id
  user
end

Сначала будет предпринята попытка получить пользователя, уже вошедшего в систему (из сеанса). Если он не найден, он попытается создать пользователя из omniauth, а затем установить его идентификатор в сеансе, чтобы при последующих запросах ему не требовался omniauth в env для поиска текущего пользователя.

Другие вопросы по тегам