class J1WardenOmniAuth
~/lib/j1_auth_manager/auth_manager/.rb Provides Warden authentication strategy based on OmniAuth Product/Info: https://jekyll.one Copyright (C) 2021 Juergen Adams J1 Template is licensed under the MIT License. See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
NOTES
Constants
- DEFAULT_CALLBACK
- SCOPE_KEY
- SESSION_KEY
Public Class Methods
new(app) { |self| ... }
click to toggle source
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 101 def initialize(app) # setup all warden strategies to wrap supported omniauth ones names = OmniAuth::Strategies.constants.map do |konstant| name = konstant.to_s.downcase end J1WardenOmniAuth.setup_strategies(*names) yield self if block_given? @app = app end
on_callback(&blk)
click to toggle source
Setup a callback to transform the user from the OmniAuth
user hash to what warden to store as the user object @example
J1WardenOmniAuth.on_callback do |omni_user| User.find_or_create_by_uid(omni_user['uid']) end
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 42 def self.on_callback(&blk) @on_callback = blk if blk @on_callback || DEFAULT_CALLBACK end
setup_strategies(*names)
click to toggle source
Create a warden strategy to wrap OmniAuth
strategies configured NOTE: Warden strategy is prefixed by 'omni_' for OmniAuth
@param name - The name of the omniauth strategy @example
J1WardenOmniAuth.setup_strategies(:twitter, :facebook)
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 53 def self.setup_strategies(*names) names.map do |name| full_name = :"omni_#{name}" unless Warden::Strategies[full_name] klass = Class.new(J1WardenOmniAuth::Strategy) klass.omni_name = name Warden::Strategies.add(full_name, klass) end Warden::Strategies[full_name] end end
Public Instance Methods
call(env)
click to toggle source
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 120 def call(env) request = Rack::Request.new(env) prefix = OmniAuth::Configuration.instance.path_prefix if request.path =~ /^#{prefix}\/(.+?)\/callback$/i strategy_name = Regexp.last_match(1) strategy = Warden::Strategies._strategies.keys.detect { |k| k.to_s == "omni_#{strategy_name}" } if !strategy Rack::Response.new('Unknown Handler', 401).finish else # Warden needs to use a hash for looking up scope and strategy names session = env[SESSION_KEY] scope = session[SCOPE_KEY] if scope.nil? || scope.to_s.length < 100 # have to protect against symbols - need a hash args = [strategy] args << { scope: scope.to_sym } if scope response = Rack::Response.new if env['warden'].authenticate? *args response.redirect(redirect_after_callback_path) response.finish else auth_path = request.path.gsub(/\/callback$/, '') response.redirect(auth_path) response.finish end else Rack::Response.new('Bad Session', 400).finish end end else @app.call(env) end end
redirect_after_callback=(path)
click to toggle source
redirect after a callback
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 112 def redirect_after_callback=(path) @redirect_after_callback_path = path end
redirect_after_callback_path()
click to toggle source
# File lib/j1_app/j1_auth_manager/warden_omniauth.rb, line 116 def redirect_after_callback_path @redirect_after_callback_path ||= '/' end