#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, которое должно иметь некоторые необходимые дополнительные атрибуты на странице регистрации. Это работает очень хорошо, но у меня возникают некоторые трудности при разделении аутентификации на две ситуации / поведения:
- Конкретная страница для регистрации пользователя требует некоторых дополнительных параметров.
- Конкретная страница для входа пользователя (если пользователь уже зарегистрировался).
Проблема в методе 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. есть какие-нибудь успехи в этом?