Omniauth сеанс потерян во время аутентификации - PullRequest
0 голосов
/ 04 октября 2019

Я работаю над приложением, которое использует Discord OAuth в качестве метода аутентификации. Поскольку этому приложению нужна учетная запись Discord, я просто использую omniauth-discord, а не какую-либо локальную методологию аутентификации. Но во время аутентификации после обратного вызова Discord я теряю сеанс. Пользователь будет создан в MongoDB, но после этого current_user вернет значение nil.

Я могу без проблем вызвать OAuth Discord и получить информацию из обратного вызова, сохранить вMongoDB, но, если я попытаюсь разрешить пользователю использовать сайт, сеанс недоступен, поэтому logininfo каждый раз будет возвращать 401. Если я пытаюсь войти снова, я всегда получаю страницу согласия Discord. Я уже пробовал много разных кодов из учебных пособий, но большинство из них использует Devise для локального входа в систему и аутентификации, а затем соединяет локального пользователя с Discord. Также безуспешно пытался инициировать сеанс в совсем другой части кода.

Я создал репозиторий github для текущей ситуации с кодом. Вы можете найти его здесь: https://github.com/montyx99/ppapi

Мои сеансы_contoller.rb:

require 'json'

class SessionsController < ApplicationController
    def new
        redirect_to '/auth/discord'
    end

    def current_user
        super
    end

    def create
        session[:init] = true
        auth = request.env["omniauth.auth"]
        user = User.where(:discord_id => auth.extra.raw_info.id).first || User.create_with_omniauth(auth)
        p user
        p user.discord_id
        # Reset the session after successful login, per
        # 2.8 Session Fixation – Countermeasures:
        # http://guides.rubyonrails.org/security.html#session-fixation-countermeasures
        reset_session
        session[:user_id] = user.discord_id
        p session[:user_id]
        redirect_to "http://localhost:3000", :notice => 'Signed in!'
    end

    def destroy
        reset_session
        redirect_to "http://localhost:3000", :notice => 'Signed out!'
    end

    def failure
        redirect_to "http://localhost:3000", :alert => "Authentication error: #{params[:message].humanize}"
    end

    def logininfo
        p current_user
        if current_user
            render :json => true, :status => 200
        else
            render :json => false, :status => 401
        end
    end
end

Application_controller.rb

class ApplicationController < ActionController::API
    def current_user
        begin
            @current_user ||= User.find(session[:user_id]) if session[:user_id]
        rescue Exception => e
            nil
        end
    end

    def user_signed_in?
        return true if current_user
    end

    def correct_user?
        @user = User.find(params[:id])
        unless current_user == @user
            redirect_to root_url, :alert => "Access denied."
        end
    end

    def authenticate_user!
        if !current_user
            redirect_to root_url, :alert => 'You need to sign in for access to this page.'
        end
    end


    def logging
        id = ENV["DISCORD_CLIENT_ID"]
        secret = ENV["DISCORD_CLIENT_SECRET"]
    end
end

Ожидаемый:

После первого рукопожатия с Discord, пользователь должен иметь возможность снова войти в систему в следующий раз без страницы Discord Consent

...