вход ПРОТИВ регистрации | разработка с помощью omniauth-facebook

#ruby-on-rails #devise #oauth-2.0 #facebook-authentication #omniauth-facebook

#ruby-на-рельсах #придумать #oauth-2.0 #facebook-аутентификация #omniauth-facebook

Вопрос:

  • Rails 5.0.0.1
  • Ruby 2.3.1p112
  • драгоценный камень ‘devise’
  • драгоценный камень ‘omniauth’
  • gem ‘omniauth-facebook’

У меня есть приложение, работающее с omniauth-facebook и Devise, которое должно иметь некоторые необходимые дополнительные атрибуты на странице регистрации. Это работает очень хорошо, но у меня возникают некоторые трудности при разделении аутентификации на две ситуации / поведения:

  1. Конкретная страница для регистрации пользователя требует некоторых дополнительных параметров.
  2. Конкретная страница для входа пользователя (если пользователь уже зарегистрировался).

Проблема в методе first_or_create.

Мне нужно создать запись только на странице регистрации с моими необходимыми параметрами, в противном случае на странице входа мне просто нужно проверить, зарегистрировался ли пользователь, и при необходимости перенаправить на страницу регистрации.

Я ясно?

Модель:

 class User < ActiveRecord::Base
    def self.from_omniauth(auth)
        where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
            user.email = auth.info.email
            user.password = Devise.friendly_token[0,20]
            user.name = auth.info.name
            user.avatar = auth.info.picture
            user.username = auth.info.name.parameterize.dasherize.first(10)   Digest::SHA2.hexdigest("#{Time.now.utc}").first(5)
            user.skip_confirmation!
        end
    end
end
 

Обратный вызов:

 class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
    def facebook
        @user = User.from_omniauth(request.env["omniauth.auth"])

        params = request.env["omniauth.params"]
        @user.username = params["username"]
        @user.newsletter = params["newsletter"]
        @user.diet_id = params["diet_id"]

        if @user.persisted?
            sign_in_and_redirect @user, event: :authentication
            set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format?
        else
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
        end
    end

    def failure
        redirect_to root_path
    end
end
 

Соответствующий код для страницы регистрации:

 = form_tag user_facebook_omniauth_authorize_path(newsletter: @user.newsletter, username: @user.username, diet_id: @user.diet_id) do
 

Соответствующий код для страницы входа в систему:

 = link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path 
 

Комментарии:

1. У меня именно эта проблема. вы когда-нибудь решали эту проблему?

2. есть какие-нибудь успехи в этом?