class J1WardenOmniAuth


~/lib/j1_auth_manager/auth_manager/.rb

Provides Warden authentication strategy based on OmniAuth

Product/Info:
https://jekyll-one.com

Copyright (C) 2019 Juergen Adams

J1 Template is licensed under the MIT License.
See: https://github.com/jekyll-one/j1_template_mde/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