Class: OmniAuth::Strategies::OpenID

Inherits:
Object
  • Object
show all
Includes:
OmniAuth::Strategy
Defined in:
lib/omniauth/strategies/open_id.rb

Overview

OmniAuth strategy for connecting via OpenID. This allows for connection to a wide variety of sites, some of which are listed on the OpenID website.

Constant Summary collapse

AX =
{
  :email => 'http://axschema.org/contact/email',
  :name => 'http://axschema.org/namePerson',
  :nickname => 'http://axschema.org/namePerson/friendly',
  :first_name => 'http://axschema.org/namePerson/first',
  :last_name => 'http://axschema.org/namePerson/last',
  :city => 'http://axschema.org/contact/city/home',
  :state => 'http://axschema.org/contact/state/home',
  :website => 'http://axschema.org/contact/web/default',
  :image => 'http://axschema.org/media/image/aspect11'
}

Instance Method Summary collapse

Instance Method Details

#ax_user_infoObject



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/omniauth/strategies/open_id.rb', line 104

def 
  ax = ::OpenID::AX::FetchResponse.from_success_response(openid_response)
  return {} unless ax
  {
    'email' => ax.get_single(AX[:email]),
    'first_name' => ax.get_single(AX[:first_name]),
    'last_name' => ax.get_single(AX[:last_name]),
    'name' => (ax.get_single(AX[:name]) || [ax.get_single(AX[:first_name]), ax.get_single(AX[:last_name])].join(' ')).strip,
    'location' => ("#{ax.get_single(AX[:city])}, #{ax.get_single(AX[:state])}" if Array(ax.get_single(AX[:city])).any? && Array(ax.get_single(AX[:state])).any?),
    'nickname' => ax.get_single(AX[:nickname]),
    'urls' => ({'Website' => Array(ax.get_single(AX[:website])).first} if Array(ax.get_single(AX[:website])).any?)
  }.inject({}){|h,(k,v)| h[k] = Array(v).first; h}.reject{|k,v| v.nil? || v == ''}
end

#callback_phaseObject



79
80
81
82
# File 'lib/omniauth/strategies/open_id.rb', line 79

def callback_phase
  return fail!(:invalid_credentials) unless openid_response && openid_response.status == :success
  super
end

#dummy_appObject



31
32
33
34
35
36
37
38
39
# File 'lib/omniauth/strategies/open_id.rb', line 31

def dummy_app
  lambda{|env| [401, {"WWW-Authenticate" => Rack::OpenID.build_header(
    :identifier => identifier,
    :return_to => callback_url,
    :required => options.required,
    :optional => options.optional,
    :method => 'post'
  )}, []]}
end

#get_identifierObject



62
63
64
65
66
67
# File 'lib/omniauth/strategies/open_id.rb', line 62

def get_identifier
  f = OmniAuth::Form.new(:title => 'OpenID Authentication')
  f.label_field('OpenID Identifier', options.identifier_param)
  f.input_field('url', options.identifier_param)
  f.to_response
end

#identifierObject



41
42
43
44
45
# File 'lib/omniauth/strategies/open_id.rb', line 41

def identifier
  i = options.identifier || request.params[options.identifier_param.to_s]
  i = nil if i == ''
  i
end

#openid_responseObject



84
85
86
87
88
89
90
91
# File 'lib/omniauth/strategies/open_id.rb', line 84

def openid_response
  unless @openid_response
    openid = Rack::OpenID.new(lambda{|env| [200,{},[]]}, options[:store])
    openid.call(env)
    @openid_response = env.delete('rack.openid.response')
  end
  @openid_response
end

#request_phaseObject



47
48
49
# File 'lib/omniauth/strategies/open_id.rb', line 47

def request_phase
  identifier ? start : get_identifier
end

#sreg_user_infoObject



93
94
95
96
97
98
99
100
101
102
# File 'lib/omniauth/strategies/open_id.rb', line 93

def 
  sreg = ::OpenID::SReg::Response.from_success_response(openid_response)
  return {} unless sreg
  {
    'email' => sreg['email'],
    'name' => sreg['fullname'],
    'location' => sreg['postcode'],
    'nickname' => sreg['nickname']
  }.reject{|k,v| v.nil? || v == ''}
end

#startObject



51
52
53
54
55
56
57
58
59
60
# File 'lib/omniauth/strategies/open_id.rb', line 51

def start
  openid = Rack::OpenID.new(dummy_app, options[:store])
  response = openid.call(env)
  case env['rack.openid.response']
  when Rack::OpenID::MissingResponse, Rack::OpenID::TimeoutResponse
    fail!(:connection_failed)
  else
    response
  end
end