forked from nicolasblanco/devise_rpx_connectable
/
strategy.rb
executable file
·64 lines (50 loc) · 1.98 KB
/
strategy.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# encoding: utf-8
module Devise #:nodoc:
module RpxConnectable #:nodoc:
module Strategies #:nodoc:
# Default strategy for signing in a user using RPX.
# Redirects to sign_in page if it's not authenticated
#
class RpxConnectable < ::Devise::Strategies::Base
def valid?
valid_controller? && valid_params? && mapping.to.respond_to?('authenticate_with_rpx')
end
# Authenticate user with RPX.
#
def authenticate!
klass = mapping.to
raise StandardError, "RPXNow API key is not defined, please see the documentation of RPXNow gem to setup it." unless RPXNow.api_key.present?
begin
request_keys = klass.request_keys.inject({}) do |res, k|
res[k] = params[k]
res
end rescue {}
rpx_user = (RPXNow.user_data(params[:token], :extended => klass.rpx_extended_user_data, :additional => klass.rpx_additional_user_data) rescue nil)
fail!(:rpx_invalid) and return unless rpx_user
if user = klass.authenticate_with_rpx(:identifier => rpx_user["identifier"], :request_keys => request_keys )
user.on_before_rpx_success(rpx_user)
success!(user)
return
end
fail!(:rpx_invalid) and return unless klass.rpx_auto_create_account?
user = klass.new
user.store_rpx_credentials!(rpx_user.merge(:request_keys => request_keys))
user.on_before_rpx_auto_create(rpx_user)
user.save(:validate => false)
user.on_before_rpx_success(rpx_user)
success!(user)
rescue
fail!(:rpx_invalid)
end
end
protected
def valid_controller?
params[:controller].to_s =~ /sessions/
end
def valid_params?
params[:token].present?
end
end
end
end
end