Я работаю над приложением, которое использует 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