Fix signin with OmniAuth providers
This commit is contained in:
parent
f5430e48b4
commit
41a4785b85
2 changed files with 10 additions and 55 deletions
|
@ -16,7 +16,7 @@ OmniAuth.config.allowed_request_methods = [:post]
|
||||||
#In case of auto sign-in, the GET method is used (users don't get to click on a button)
|
#In case of auto sign-in, the GET method is used (users don't get to click on a button)
|
||||||
OmniAuth.config.allowed_request_methods << :get if Gitlab.config.omniauth.auto_sign_in_with_provider.present?
|
OmniAuth.config.allowed_request_methods << :get if Gitlab.config.omniauth.auto_sign_in_with_provider.present?
|
||||||
OmniAuth.config.before_request_phase do |env|
|
OmniAuth.config.before_request_phase do |env|
|
||||||
OmniAuth::RequestForgeryProtection.new(env).call
|
OmniAuth::RequestForgeryProtection.call(env)
|
||||||
end
|
end
|
||||||
|
|
||||||
if Gitlab.config.omniauth.enabled
|
if Gitlab.config.omniauth.enabled
|
||||||
|
|
|
@ -1,66 +1,21 @@
|
||||||
# Protects OmniAuth request phase against CSRF.
|
# Protects OmniAuth request phase against CSRF.
|
||||||
|
|
||||||
module OmniAuth
|
module OmniAuth
|
||||||
# Based on ActionController::RequestForgeryProtection.
|
module RequestForgeryProtection
|
||||||
class RequestForgeryProtection
|
class Controller < ActionController::Base
|
||||||
def initialize(env)
|
protect_from_forgery with: :exception
|
||||||
@env = env
|
|
||||||
end
|
|
||||||
|
|
||||||
def request
|
def index
|
||||||
@request ||= ActionDispatch::Request.new(@env)
|
head :ok
|
||||||
end
|
|
||||||
|
|
||||||
def session
|
|
||||||
request.session
|
|
||||||
end
|
|
||||||
|
|
||||||
def reset_session
|
|
||||||
request.reset_session
|
|
||||||
end
|
|
||||||
|
|
||||||
def params
|
|
||||||
request.params
|
|
||||||
end
|
|
||||||
|
|
||||||
def call
|
|
||||||
verify_authenticity_token
|
|
||||||
end
|
|
||||||
|
|
||||||
def verify_authenticity_token
|
|
||||||
if !verified_request?
|
|
||||||
Rails.logger.warn "Can't verify CSRF token authenticity" if Rails.logger
|
|
||||||
handle_unverified_request
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
def self.app
|
||||||
|
@app ||= Controller.action(:index)
|
||||||
def protect_against_forgery?
|
|
||||||
ApplicationController.allow_forgery_protection
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def request_forgery_protection_token
|
def self.call(env)
|
||||||
ApplicationController.request_forgery_protection_token
|
app.call(env)
|
||||||
end
|
|
||||||
|
|
||||||
def forgery_protection_strategy
|
|
||||||
ApplicationController.forgery_protection_strategy
|
|
||||||
end
|
|
||||||
|
|
||||||
def verified_request?
|
|
||||||
!protect_against_forgery? || request.get? || request.head? ||
|
|
||||||
form_authenticity_token == params[request_forgery_protection_token] ||
|
|
||||||
form_authenticity_token == request.headers['X-CSRF-Token']
|
|
||||||
end
|
|
||||||
|
|
||||||
def handle_unverified_request
|
|
||||||
forgery_protection_strategy.new(self).handle_unverified_request
|
|
||||||
end
|
|
||||||
|
|
||||||
# Sets the token value for the current session.
|
|
||||||
def form_authenticity_token
|
|
||||||
session[:_csrf_token] ||= SecureRandom.base64(32)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue