devise_g5_authenticatable 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +23 -0
- data/LICENSE +20 -0
- data/README.md +243 -0
- data/Rakefile +20 -0
- data/app/controllers/devise_g5_authenticatable/registrations_controller.rb +5 -0
- data/app/controllers/devise_g5_authenticatable/sessions_controller.rb +58 -0
- data/circle.yml +4 -0
- data/config/initializers/devise_g5_authenticatable.rb +3 -0
- data/config/locales/en.yml +6 -0
- data/devise_g5_authenticatable.gemspec +24 -0
- data/lib/devise_g5_authenticatable.rb +16 -0
- data/lib/devise_g5_authenticatable/controllers/helpers.rb +37 -0
- data/lib/devise_g5_authenticatable/controllers/url_helpers.rb +13 -0
- data/lib/devise_g5_authenticatable/engine.rb +11 -0
- data/lib/devise_g5_authenticatable/g5.rb +4 -0
- data/lib/devise_g5_authenticatable/g5/auth_password_validator.rb +30 -0
- data/lib/devise_g5_authenticatable/g5/auth_user_creator.rb +48 -0
- data/lib/devise_g5_authenticatable/g5/auth_user_updater.rb +43 -0
- data/lib/devise_g5_authenticatable/g5/user_exporter.rb +61 -0
- data/lib/devise_g5_authenticatable/models/g5_authenticatable.rb +99 -0
- data/lib/devise_g5_authenticatable/models/protected_attributes.rb +16 -0
- data/lib/devise_g5_authenticatable/omniauth.rb +9 -0
- data/lib/devise_g5_authenticatable/routes.rb +58 -0
- data/lib/devise_g5_authenticatable/version.rb +3 -0
- data/lib/tasks/g5/export_users.rake +13 -0
- data/spec/controllers/helpers_spec.rb +295 -0
- data/spec/controllers/sessions_controller_spec.rb +256 -0
- data/spec/controllers/url_helpers_spec.rb +332 -0
- data/spec/dummy/.gitignore +15 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/images/rails.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/javascripts/custom_sessions.js +2 -0
- data/spec/dummy/app/assets/javascripts/home.js +2 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/assets/stylesheets/custom_sessions.css +4 -0
- data/spec/dummy/app/assets/stylesheets/home.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/custom_registrations_controllers.rb +2 -0
- data/spec/dummy/app/controllers/custom_sessions_controller.rb +2 -0
- data/spec/dummy/app/controllers/home_controller.rb +4 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/custom_sessions_helper.rb +2 -0
- data/spec/dummy/app/helpers/home_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/admin.rb +3 -0
- data/spec/dummy/app/models/user.rb +10 -0
- data/spec/dummy/app/views/anonymous/new.html.erb +0 -0
- data/spec/dummy/app/views/home/index.html.erb +1 -0
- data/spec/dummy/app/views/layouts/application.html.erb +16 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +64 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml.ci +6 -0
- data/spec/dummy/config/database.yml.sample +13 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +39 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/devise.rb +259 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/devise.en.yml +60 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +70 -0
- data/spec/dummy/db/migrate/20131230235849_devise_create_users.rb +42 -0
- data/spec/dummy/db/migrate/20140102213131_drop_database_authenticatable.rb +16 -0
- data/spec/dummy/db/migrate/20140103032308_drop_recoverable.rb +16 -0
- data/spec/dummy/db/migrate/20140103042329_drop_rememberable.rb +13 -0
- data/spec/dummy/db/migrate/20140103174810_add_omniauth_columns_to_users.rb +18 -0
- data/spec/dummy/db/migrate/20140103191601_add_email_back_to_user.rb +8 -0
- data/spec/dummy/db/migrate/20140113202948_devise_create_admins.rb +42 -0
- data/spec/dummy/db/migrate/20140113233821_add_provider_and_uid_to_admins.rb +8 -0
- data/spec/dummy/db/schema.rb +50 -0
- data/spec/dummy/db/seeds.rb +7 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/tasks/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/dummy/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/dummy/vendor/plugins/.gitkeep +0 -0
- data/spec/factories/admin.rb +10 -0
- data/spec/factories/user.rb +10 -0
- data/spec/features/edit_registration_spec.rb +109 -0
- data/spec/features/registration_spec.rb +99 -0
- data/spec/features/sign_in_spec.rb +91 -0
- data/spec/features/sign_out_spec.rb +7 -0
- data/spec/g5/auth_password_validator_spec.rb +81 -0
- data/spec/g5/auth_user_creator_spec.rb +100 -0
- data/spec/g5/auth_user_updater_spec.rb +113 -0
- data/spec/g5/user_exporter_spec.rb +105 -0
- data/spec/models/g5_authenticatable_spec.rb +540 -0
- data/spec/models/protected_attributes_spec.rb +17 -0
- data/spec/routing/registrations_routing_spec.rb +107 -0
- data/spec/routing/sessions_routing_spec.rb +111 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/devise.rb +3 -0
- data/spec/support/omniauth.rb +3 -0
- data/spec/support/shared_contexts/oauth_error.rb +9 -0
- data/spec/support/shared_contexts/rake.rb +21 -0
- data/spec/support/shared_examples/registration_error.rb +15 -0
- data/spec/support/user_feature_methods.rb +26 -0
- data/spec/tasks/export_users_spec.rb +90 -0
- metadata +293 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'devise_g5_authenticatable/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'devise_g5_authenticatable'
|
|
8
|
+
spec.version = DeviseG5Authenticatable::VERSION
|
|
9
|
+
spec.authors = ['Maeve Revels']
|
|
10
|
+
spec.email = ['maeve.revels@getg5.com']
|
|
11
|
+
spec.description = 'Devise extension for the G5 Auth service'
|
|
12
|
+
spec.summary = 'Devise extension for the G5 Auth service'
|
|
13
|
+
spec.homepage = 'https://github.com/G5/devise_g5_authenticatable'
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
|
|
21
|
+
spec.add_dependency 'devise', '~> 3.0'
|
|
22
|
+
spec.add_dependency 'g5_authentication_client', '~> 0.2'
|
|
23
|
+
spec.add_dependency 'omniauth-g5', '~> 0.1'
|
|
24
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'devise_g5_authenticatable/version'
|
|
2
|
+
|
|
3
|
+
require 'devise'
|
|
4
|
+
|
|
5
|
+
require 'devise_g5_authenticatable/omniauth'
|
|
6
|
+
require 'devise_g5_authenticatable/routes'
|
|
7
|
+
require 'devise_g5_authenticatable/controllers/helpers'
|
|
8
|
+
require 'devise_g5_authenticatable/controllers/url_helpers'
|
|
9
|
+
|
|
10
|
+
require 'devise_g5_authenticatable/engine'
|
|
11
|
+
|
|
12
|
+
Devise.add_module(:g5_authenticatable,
|
|
13
|
+
strategy: false,
|
|
14
|
+
route: {session: [nil, :new, :destroy]},
|
|
15
|
+
controller: :sessions,
|
|
16
|
+
model: 'devise_g5_authenticatable/models/g5_authenticatable')
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module DeviseG5Authenticatable
|
|
2
|
+
module Helpers
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
def clear_blank_passwords
|
|
6
|
+
Devise.mappings.keys.each do |scope|
|
|
7
|
+
if params[scope].present?
|
|
8
|
+
password_params(scope).each { |p| clear_blank_param(scope, p) }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def password_params(scope)
|
|
14
|
+
params[scope].keys.select { |k| k =~ /password/ }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def clear_blank_param(scope, param_name)
|
|
18
|
+
params[scope].delete(param_name) if params[scope][param_name].blank?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def handle_resource_error(error)
|
|
22
|
+
resource.errors[:base] << error.message
|
|
23
|
+
respond_with(resource)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module ClassMethods
|
|
27
|
+
def define_helpers(mapping)
|
|
28
|
+
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
|
29
|
+
def set_updated_by_#{mapping}
|
|
30
|
+
resource_params = params[:#{mapping}] || params
|
|
31
|
+
resource_params[:updated_by] = current_#{mapping}
|
|
32
|
+
end
|
|
33
|
+
METHODS
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module DeviseG5Authenticatable
|
|
2
|
+
module UrlHelpers
|
|
3
|
+
def g5_authorize_path(resource_or_scope, *args)
|
|
4
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
5
|
+
_devise_route_context.send("#{scope}_g5_authorize_path", *args)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def g5_callback_path(resource_or_scope, *args)
|
|
9
|
+
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
|
10
|
+
_devise_route_context.send("#{scope}_g5_callback_path", *args)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'g5_authentication_client'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module G5
|
|
5
|
+
class AuthPasswordValidator
|
|
6
|
+
attr_reader :model
|
|
7
|
+
|
|
8
|
+
def initialize(authenticatable_model)
|
|
9
|
+
@model = authenticatable_model
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def valid_password?(password)
|
|
13
|
+
begin
|
|
14
|
+
auth_user = auth_client(password).me
|
|
15
|
+
rescue OAuth2::Error => error
|
|
16
|
+
raise unless error.code == 'invalid_resource_owner'
|
|
17
|
+
rescue RuntimeError => error
|
|
18
|
+
raise unless error.message =~ /Insufficient credentials/
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
!auth_user.nil?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
def auth_client(password)
|
|
26
|
+
G5AuthenticationClient::Client.new(username: model.email, password: password)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'g5_authentication_client'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module G5
|
|
5
|
+
class AuthUserCreator
|
|
6
|
+
attr_reader :model
|
|
7
|
+
|
|
8
|
+
def initialize(authenticatable_model)
|
|
9
|
+
@model = authenticatable_model
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def create
|
|
13
|
+
create_auth_user unless auth_user_exists?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
def create_auth_user
|
|
18
|
+
auth_user = auth_client.create_user(auth_user_args)
|
|
19
|
+
set_auth_attributes(auth_user)
|
|
20
|
+
auth_user
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def auth_user_exists?
|
|
24
|
+
!model.uid.blank?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def auth_client
|
|
28
|
+
G5AuthenticationClient::Client.new(access_token: updated_by.g5_access_token)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def updated_by
|
|
32
|
+
model.updated_by || model
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def auth_user_args
|
|
36
|
+
{email: model.email,
|
|
37
|
+
password: model.password,
|
|
38
|
+
password_confirmation: model.password_confirmation}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def set_auth_attributes(auth_user)
|
|
42
|
+
model.provider = 'g5'
|
|
43
|
+
model.uid = auth_user.id
|
|
44
|
+
model.clean_up_passwords
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'g5_authentication_client'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module G5
|
|
5
|
+
class AuthUserUpdater
|
|
6
|
+
attr_reader :model
|
|
7
|
+
|
|
8
|
+
def initialize(authenticatable_model)
|
|
9
|
+
@model = authenticatable_model
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def update
|
|
13
|
+
update_auth_user if credentials_changed?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
def update_auth_user
|
|
18
|
+
auth_user = auth_client.update_user(auth_user_args)
|
|
19
|
+
model.clean_up_passwords
|
|
20
|
+
auth_user
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def credentials_changed?
|
|
24
|
+
model.email_changed? || !model.password.blank?
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def auth_client
|
|
28
|
+
G5AuthenticationClient::Client.new(access_token: updated_by.g5_access_token)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def updated_by
|
|
32
|
+
model.updated_by || model
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def auth_user_args
|
|
36
|
+
{id: model.uid,
|
|
37
|
+
email: model.email,
|
|
38
|
+
password: model.password,
|
|
39
|
+
password_confirmation: model.password_confirmation}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'g5_authentication_client'
|
|
2
|
+
|
|
3
|
+
module G5
|
|
4
|
+
# Exports all users to the G5 auth server.
|
|
5
|
+
# Assumes presence of User model with uid and
|
|
6
|
+
# provider attributes.
|
|
7
|
+
class UserExporter
|
|
8
|
+
# @param [Hash] options the options to export users with.
|
|
9
|
+
# @option options [String] :client_id the G5 OAuth client ID
|
|
10
|
+
# @option options [String] :client_secret the G5 OAuth client secret
|
|
11
|
+
# @option options [String] :redirect_uri the redirect URI registered with G5
|
|
12
|
+
# @option options [String] :endpoint the endpoint for the G5 Auth server
|
|
13
|
+
# @option options [String] :authorization_code the G5 authorization code to obtain an access token
|
|
14
|
+
def initialize(options={})
|
|
15
|
+
@client_id = options[:client_id]
|
|
16
|
+
@client_secret = options[:client_secret]
|
|
17
|
+
@redirect_uri = options[:redirect_uri]
|
|
18
|
+
@endpoint = options[:endpoint]
|
|
19
|
+
@authorization_code = options[:authorization_code]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Export local users to the G5 Auth server.
|
|
23
|
+
# A record will be created in G5 Auth and associated with each
|
|
24
|
+
# local User. Password data is not automatically
|
|
25
|
+
# exported, but is returned in a dump of SQL update
|
|
26
|
+
# statements suitable for executing on the G5 Auth server.
|
|
27
|
+
#
|
|
28
|
+
# @return [String] SQL dump containing encrypted user passwords
|
|
29
|
+
def export
|
|
30
|
+
update_statements = User.all.collect do |user|
|
|
31
|
+
# The user won't actually be able to log in with their usual password,
|
|
32
|
+
# but at least it won't be set to a guessable value
|
|
33
|
+
auth_user = auth_client.create_user(email: user.email,
|
|
34
|
+
password: user.encrypted_password)
|
|
35
|
+
update_local_user(user, auth_user)
|
|
36
|
+
update_sql(auth_user.id, user.encrypted_password)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
update_statements.join("\n")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
def update_local_user(local_user, auth_user)
|
|
44
|
+
local_user.uid = auth_user.id
|
|
45
|
+
local_user.provider = 'g5'
|
|
46
|
+
local_user.save
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def update_sql(uid, password)
|
|
50
|
+
"update users set encrypted_password='#{password}' where id=#{uid};"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def auth_client
|
|
54
|
+
@oauth_client ||= G5AuthenticationClient::Client.new(client_id: @client_id,
|
|
55
|
+
client_secret: @client_secret,
|
|
56
|
+
redirect_uri: @redirect_uri,
|
|
57
|
+
endpoint: @endpoint,
|
|
58
|
+
authorization_code: @authorization_code)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'devise_g5_authenticatable/g5'
|
|
2
|
+
|
|
3
|
+
module Devise
|
|
4
|
+
module Models
|
|
5
|
+
# Authenticatable module, responsible for remote credential management
|
|
6
|
+
# in G5 Auth.
|
|
7
|
+
#
|
|
8
|
+
# The module assumes that the following attributes have already been defined
|
|
9
|
+
# on the model:
|
|
10
|
+
# * `provider`: the value will always be 'g5' for G5 Auth users
|
|
11
|
+
# * `uid`: the unique id for this user in G5 Auth
|
|
12
|
+
# * `g5_access_token`: the current OAuth access token, if one exists
|
|
13
|
+
module G5Authenticatable
|
|
14
|
+
extend ActiveSupport::Concern
|
|
15
|
+
|
|
16
|
+
included do
|
|
17
|
+
attr_accessor :password, :password_confirmation, :current_password,
|
|
18
|
+
:updated_by
|
|
19
|
+
|
|
20
|
+
before_save :auth_user
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def auth_user
|
|
24
|
+
begin
|
|
25
|
+
if new_record?
|
|
26
|
+
G5::AuthUserCreator.new(self).create
|
|
27
|
+
else
|
|
28
|
+
G5::AuthUserUpdater.new(self).update
|
|
29
|
+
end
|
|
30
|
+
rescue OAuth2::Error => e
|
|
31
|
+
logger.error("Couldn't save user credentials because: #{e}")
|
|
32
|
+
raise ActiveRecord::RecordNotSaved.new(e.code)
|
|
33
|
+
rescue StandardError => e
|
|
34
|
+
logger.error("Couldn't save user credentials because: #{e}")
|
|
35
|
+
raise ActiveRecord::RecordNotSaved.new(e.message)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def clean_up_passwords
|
|
40
|
+
self.password = self.password_confirmation = self.current_password = nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def valid_password?(password_to_check)
|
|
44
|
+
validator = Devise::G5::AuthPasswordValidator.new(self)
|
|
45
|
+
validator.valid_password?(password_to_check)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def update_with_password(params)
|
|
49
|
+
updated_attributes = params.reject { |k,v| k =~ /password/ && v.blank? }
|
|
50
|
+
current_password = updated_attributes.delete(:current_password)
|
|
51
|
+
|
|
52
|
+
if valid = valid_password?(current_password)
|
|
53
|
+
valid = update_attributes(updated_attributes)
|
|
54
|
+
elsif current_password.blank?
|
|
55
|
+
errors.add(:current_password, :blank)
|
|
56
|
+
else
|
|
57
|
+
errors.add(:current_password, :invalid)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
valid
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def update_g5_credentials(oauth_data)
|
|
64
|
+
self.g5_access_token = oauth_data.credentials.token
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def revoke_g5_credentials!
|
|
68
|
+
self.g5_access_token = nil
|
|
69
|
+
save!
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
module ClassMethods
|
|
73
|
+
def find_for_g5_oauth(oauth_data)
|
|
74
|
+
find_by_provider_and_uid(oauth_data.provider.to_s, oauth_data.uid.to_s)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def find_and_update_for_g5_oauth(oauth_data)
|
|
78
|
+
resource = find_for_g5_oauth(oauth_data)
|
|
79
|
+
if resource
|
|
80
|
+
resource.update_g5_credentials(oauth_data)
|
|
81
|
+
resource.save!
|
|
82
|
+
end
|
|
83
|
+
resource
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def new_with_session(params, session)
|
|
87
|
+
defaults = ActiveSupport::HashWithIndifferentAccess.new
|
|
88
|
+
if auth_data = session && session['omniauth.auth']
|
|
89
|
+
defaults[:email] = auth_data.info.email
|
|
90
|
+
defaults[:provider] = auth_data.provider
|
|
91
|
+
defaults[:uid] = auth_data.uid
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
new(defaults.merge(params))
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module DeviseG5Authenticatable
|
|
2
|
+
module Models
|
|
3
|
+
module ProtectedAttributes
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
attr_accessible :email, :password, :password_confirmation,
|
|
8
|
+
:current_password, :provider, :uid, :updated_by
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module Devise::Models::G5Authenticatable
|
|
15
|
+
include DeviseG5Authenticatable::Models::ProtectedAttributes
|
|
16
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require 'devise/omniauth'
|
|
2
|
+
require 'omniauth-g5'
|
|
3
|
+
|
|
4
|
+
OmniAuth.config.on_failure do |env|
|
|
5
|
+
env['devise.mapping'] = Devise::Mapping.find_by_path!(env['PATH_INFO'], :path)
|
|
6
|
+
controller_name = ActiveSupport::Inflector.camelize(env['devise.mapping'].controllers[:sessions])
|
|
7
|
+
controller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller")
|
|
8
|
+
controller_klass.action(:failure).call(env)
|
|
9
|
+
end
|