Class: WardenOmniAuth

Inherits:
Object
  • Object
show all
Defined in:
lib/warden_omniauth.rb

Defined Under Namespace

Classes: Strategy

Constant Summary collapse

DEFAULT_CALLBACK =
lambda do |user|
  u = {}
  u[:user_info] = user['user_info']
  u[:uid] = user['uid']
  u[:credentials] = user['credentials']
  u[:provider] = user['provider']
  u
end
SCOPE_KEY =
'warden_omni_auth.scope'
SESSION_KEY =
'rack.session'

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) {|_self| ... } ⇒ WardenOmniAuth

Returns a new instance of WardenOmniAuth.

Yields:

  • (_self)

Yield Parameters:



96
97
98
99
100
101
102
103
104
# File 'lib/warden_omniauth.rb', line 96

def initialize(app)
  # setup the warden strategies to wrap the omniauth ones
  names = OmniAuth::Strategies.constants.map do |konstant|
    name = WardenOmniAuth.snake_case(konstant.to_s)
  end
  WardenOmniAuth.setup_strategies(*names)
  yield self if block_given?
  @app = app
end

Class Method Details

.on_callback(&blk) ⇒ Object

Setup a callback to transform the user from the omni user hash to what you want warden to store as the user object

Examples:

WardenOmniAuth.on_callback do |omni_user|
  User.find_or_create_by_uid(omni_user['uid'])
end


23
24
25
26
# File 'lib/warden_omniauth.rb', line 23

def self.on_callback(&blk)
  @on_callback = blk if blk
  @on_callback || DEFAULT_CALLBACK
end

.setup_strategies(*names) ⇒ Object

Create a warden strategy to wrap an OmniAuth strategy

Examples:

WardenOmniAuth.setup_strategies(:twitter, :facebook)

Parameters:

  • name
    • The name of the omniauth strategy



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/warden_omniauth.rb', line 32

def self.setup_strategies(*names)
  names.map do |name|
    full_name = :"omni_#{name}"
    unless Warden::Strategies[full_name]
      klass = Class.new(WardenOmniAuth::Strategy)
      klass.omni_name = name
      Warden::Strategies.add(full_name, klass)
    end
    Warden::Strategies[full_name]
  end
end

.snake_case(string) ⇒ String

Pulled from extlib Convert to snake case.

"FooBar".snake_case           #=> "foo_bar"
"HeadlineCNNNews".snake_case  #=> "headline_cnn_news"
"CNN".snake_case              #=> "cnn"

Returns:

  • (String)

    Receiver converted to snake case.



89
90
91
92
93
94
# File 'lib/warden_omniauth.rb', line 89

def self.snake_case(string)
  return string.downcase if string.match(/\A[A-Z]+\z/)
  string.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
  gsub(/([a-z])([A-Z])/, '\1_\2').
  downcase
end

Instance Method Details

#call(env) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/warden_omniauth.rb', line 116

def call(env)
  request = Rack::Request.new(env)
  prefix = OmniAuth::Configuration.instance.path_prefix
  if request.path =~ /^#{prefix}\/(.+?)\/callback$/i
    strategy_name = $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 hashie 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 hashie
        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) ⇒ Object

redirect after a callback



107
108
109
# File 'lib/warden_omniauth.rb', line 107

def redirect_after_callback=(path)
  @redirect_after_callback_path = path
end

#redirect_after_callback_pathObject



112
113
114
# File 'lib/warden_omniauth.rb', line 112

def redirect_after_callback_path
  @redirect_after_callback_path ||= "/"
end