使用Nuxt + Auth和Rails 5 Devise Omniauth登录

时间:2020-09-18 18:43:22

标签: ruby-on-rails ruby authentication oauth nuxt.js

如何将NuxtJS身份验证模块(FRONT)与Devise Omniauth(Rails BACKEND)一起使用?

这是我尝试过的:

从提供商策略获取用户数据:

facebook: {
    client_id: 'CLIENTID',
    userinfo_endpoint: 'https://graph.facebook.com/v2.12/me?fields=about,name,picture{url},email,birthday',
    redirect_uri:'http://localhost:3000/omniauth/facebook',
    scope: ['public_profile', 'email', 'user_birthday']
  }

登录方法:

facebookLogin () {
    this.$wait.start('signing in')
    this.$auth.loginWith('facebook')
    .then((response) => {
      this.$toast.success({
        title: 'Connexion réussie',
        message: 'Vous vous êtes bien connecté.',
        position: 'bottom center',
        timeOut: 3000
      })
    })
    .catch(() => {
      this.$toast.error({
        title: 'Erreur',
        message: 'L\'email ou le mot de passe ne sont pas valides. Vérifiez votre saisie.',
        position: 'bottom center',
        timeOut: 8000
      })
    })
    .finally(() => this.$wait.end('signing in'))
  },

在Rails上使用此数据创建或查找用户:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

def facebook
 @user = User.from_facebook(request.env["omniauth.auth"])
 sign_in @user
 redirect_to "#{ENV['FRONT_DOMAIN']}"
end

class User < ApplicationRecord

def self.from_facebook(auth)
where(uid: auth.uid, provider: auth.provider).first_or_create do |user|
  user.email = auth.info.email
  user.first_name = auth.info.first_name
  user.last_name = auth.info.last_name
  user.password = Devise.friendly_token[0, 20]
  user.provider = auth.provider
  user.uid = auth.uid
  Client.create(user: user)
end
end

如何组合两个部分以在我的FRONT部分上登录用户? 我不能使用devise-jwt,因为过去的dev覆盖了Devise方法

本地身份验证方法覆盖:

def create
  build_resource

  unless @resource.present?
    raise DeviseTokenAuth::Errors::NoResourceDefinedError,
          "#{self.class.name} #build_resource does not define @resource,"\
          ' execution stopped.'
  end

  # give redirect value from params priority
  @redirect_url = params.fetch(
    :confirm_success_url,
    DeviseTokenAuth.default_confirm_success_url
  )

  # success redirect url is required
  if confirmable_enabled? && !@redirect_url
    return render_create_error_missing_confirm_success_url
  end

  # if whitelist is set, validate redirect_url against whitelist
  return render_create_error_redirect_url_not_allowed if blacklisted_redirect_url?

  # override email confirmation, must be sent manually from ctrl
  resource_class.set_callback('create', :after, :send_on_create_confirmation_instructions)
  resource_class.skip_callback('create', :after, :send_on_create_confirmation_instructions)

  if @resource.respond_to? :skip_confirmation_notification!
    # Fix duplicate e-mails by disabling Devise confirmation e-mail
    @resource.skip_confirmation_notification!
  end

  if @resource.save
    if params[:farmer]
      Farmer.create(
        user: @resource
      )
    else
      Client.create(
        user: @resource
      )
    end

    yield @resource if block_given?

    unless @resource.confirmed?
      # user will require email authentication
      @resource.send_confirmation_instructions({
        client_config: params[:config_name],
        redirect_url: @redirect_url
      })
    end

    if active_for_authentication?
      # email auth has been bypassed, authenticate user
      @client_id, @token = @resource.create_token
      @resource.save!
      update_auth_header
    end

    render_create_success
  else
    clean_up_passwords @resource
    render_create_error
  end
end

0 个答案:

没有答案