mumukit-login 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a3ee9172809ea39874cd16d18c98a2b180d645fb
4
+ data.tar.gz: d9abbc2b9dbc329c2e2e402330880c759fa12f07
5
+ SHA512:
6
+ metadata.gz: d1860be5880a0f25c6e408f8b8e60efaaae81eafd1d38e2a671368f4754a3bb574b79f31b196228aef83d8ba456370a6230aa717cafc7c1ef7bb9ab939cbb35c
7
+ data.tar.gz: fcc2e6f167b9235d77b7120ccfcebf713285897e65007d7819a959402d855ca2ca5d14fe7f8373e22ab41dbd76d7e586c901f558639f964a9cdcb5186a93dfc7
@@ -0,0 +1,83 @@
1
+ require 'rack/request'
2
+ require 'addressable/uri'
3
+
4
+ require 'omniauth'
5
+ require 'omniauth-auth0'
6
+ require 'omniauth-saml'
7
+
8
+ require 'mumukit/core'
9
+
10
+ module Mumukit::Login
11
+ def self.configure
12
+ @config ||= defaults
13
+ yield @config
14
+ end
15
+
16
+ def self.defaults
17
+ struct.tap do |config|
18
+ config.provider = Mumukit::Login::Provider.from_env
19
+ config.saml = struct base_url: ENV['MUMUKI_SAML_BASE_URL'],
20
+ idp_sso_target_url: ENV['MUMUKI_SAML_IDP_SSO_TARGET_URL'],
21
+ idp_slo_target_url: ENV['MUMUKI_SAML_IDP_SLO_TARGET_URL'],
22
+ translation_name: ENV['MUMUKI_SAML_TRANSLATION_NAME'] || 'name',
23
+ translation_email: ENV['MUMUKI_SAML_TRANSLATION_EMAIL'] || 'email',
24
+ translation_image: ENV['MUMUKI_SAML_TRANSLATION_IMAGE'] || 'image'
25
+ config.auth0 = struct client_id: ENV['MUMUKI_AUTH0_CLIENT_ID'],
26
+ client_secret: ENV['MUMUKI_AUTH0_CLIENT_SECRET'],
27
+ domain: ENV['MUMUKI_AUTH0_DOMAIN']
28
+ end
29
+ end
30
+
31
+ def self.config
32
+ @config
33
+ end
34
+ end
35
+
36
+ require_relative './login/controller'
37
+ require_relative './login/form'
38
+ require_relative './login/framework'
39
+ require_relative './login/origin_redirector'
40
+ require_relative './login/profile'
41
+ require_relative './login/provider'
42
+ require_relative './login/settings'
43
+ require_relative './login/helpers'
44
+ require_relative './login/version'
45
+
46
+
47
+ module Mumukit::Login
48
+
49
+ # Configures omniauth. This method typically configures
50
+ # and sets the omniauth provider. Typical config should look like this
51
+ #
52
+ # Rails.application.config.middleware.use OmniAuth::Builder do
53
+ # Mumukit::Login.configure_omniauth! self
54
+ # end
55
+ #
56
+ # @param [OmniAuth::Builder] omniauth
57
+ #
58
+ def self.configure_omniauth!(omniauth)
59
+ provider.configure_omniauth! omniauth
60
+ end
61
+
62
+ def self.configure_login_routes!(native)
63
+ framework.configure_login_routes! native
64
+ end
65
+
66
+ def self.configure_login_controller!(native)
67
+ framework.configure_login_controller!(native)
68
+ end
69
+
70
+ def self.configure_controller!(native)
71
+ framework.configure_controller! native
72
+ end
73
+
74
+ private
75
+
76
+ def self.framework
77
+ Mumukit::Login.config.framework
78
+ end
79
+
80
+ def self.provider
81
+ Mumukit::Login.config.provider
82
+ end
83
+ end
@@ -0,0 +1,30 @@
1
+ class Mumukit::Login::Controller
2
+ def initialize(framework, native)
3
+ @framework = framework
4
+ @native = native
5
+ end
6
+
7
+ def env
8
+ @framework.env @native
9
+ end
10
+
11
+ def redirect!(path)
12
+ @framework.redirect!(path, @native)
13
+ end
14
+
15
+ def render_html!(html)
16
+ @framework.render_html!(html, @native)
17
+ end
18
+
19
+ def request
20
+ Rack::Request.new(env)
21
+ end
22
+
23
+ def url_for(path)
24
+ URI.join(request.base_url, path).to_s
25
+ end
26
+
27
+ def session
28
+ request.session
29
+ end
30
+ end
@@ -0,0 +1,48 @@
1
+
2
+ class Mumukit::Login::Form
3
+
4
+ #######################
5
+ ## Visual components ##
6
+ #######################
7
+
8
+ # This object will configure the login button using the given login settings
9
+ # customizations, if possible
10
+ #
11
+ # @param [Mumukit::Login::Controller] controller a Mumukit::Login::Controller
12
+ # @param [Mumukit::Login::Settings] login_settings customizations for the login UI
13
+ def initialize(provider, controller, login_settings)
14
+ @provider = provider
15
+ @controller = controller
16
+ @login_settings = login_settings
17
+ end
18
+
19
+ # HTML <HEAD> customizations. Send this message
20
+ # in order to add login provider-specific code - like CSS and JS -
21
+ # to your page header.
22
+ #
23
+ def header_html
24
+ @provider.header_html(@controller, @login_settings)&.html_safe
25
+ end
26
+
27
+ def button_html(title, clazz)
28
+ @provider.button_html(@controller, title, clazz)&.html_safe
29
+ end
30
+
31
+ def footer_html
32
+ @provider.footer_html(@controller)&.html_safe
33
+ end
34
+
35
+ ###############################
36
+ ## Triggering Authentication ##
37
+ ###############################
38
+
39
+ # Ask the user for authentication, by either rendering
40
+ # the login form or redirecting to it
41
+ #
42
+ # This method should be called from a controller action
43
+ # or action filter.
44
+ #
45
+ def show!
46
+ @controller.redirect! @provider.login_path(@controller)
47
+ end
48
+ end
@@ -0,0 +1,4 @@
1
+ module Mumukit::Login::Framework
2
+ end
3
+
4
+ require_relative './framework/rails'
@@ -0,0 +1,56 @@
1
+ module Mumukit::Login::Framework::Rails
2
+
3
+ def self.env(rails_controller)
4
+ rails_controller.request.env
5
+ end
6
+
7
+ def self.redirect!(path, rails_controller)
8
+ rails_controller.redirect_to path
9
+ end
10
+
11
+ def self.render_html!(content, rails_controller)
12
+ rails_controller.render html: content.html_safe, layout: true
13
+ end
14
+
15
+ # Configures the login routes.
16
+ # This method should be used this way:
17
+ #
18
+ # controller :sessions do
19
+ # Mumukit::Login.configure_session_controller_routes! self
20
+ # end
21
+ #
22
+ # @param [RailsRouter] rails_router
23
+ #
24
+ def self.configure_login_routes!(rails_router)
25
+ rails_router.controller :login do
26
+ rails_router.match 'auth/:provider/callback' => :callback, via: [:get, :post], as: 'auth_callback'
27
+ rails_router.get 'auth/failure' => :failure
28
+ rails_router.get 'logout' => :destroy
29
+ rails_router.get 'login' => :login
30
+ end
31
+ end
32
+
33
+ def self.configure_login_controller!(controller_class)
34
+ controller_class.class_eval do
35
+ include Mumukit::Login::LoginControllerHelpers
36
+ end
37
+ end
38
+
39
+ # Configures forgery protection and mixes authentication methods.
40
+ #
41
+ # @param [ActionController::Base::Class] controller_class
42
+ #
43
+ def self.configure_controller!(controller_class)
44
+ Mumukit::Login.config.provider.configure_rails_forgery_protection!(controller_class)
45
+ controller_class.class_eval do
46
+ include Mumukit::Login::AuthenticationHelpers
47
+
48
+ helper_method :current_user,
49
+ :current_user?,
50
+ :current_user_uid,
51
+ :mumukit_controller,
52
+ :login_form
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,2 @@
1
+ require_relative './helpers/authentication_helpers'
2
+ require_relative './helpers/login_controller_helpers'
@@ -0,0 +1,46 @@
1
+ module Mumukit::Login::AuthenticationHelpers
2
+
3
+ def authenticate!
4
+ login_form.show! unless current_user?
5
+ end
6
+
7
+ def current_user?
8
+ current_user_uid.present?
9
+ end
10
+
11
+ def current_user
12
+ @current_user ||= Mumukit::Login.config.user_class.find_by_uid!(current_user_uid) if current_user?
13
+ end
14
+
15
+ private
16
+
17
+ # default
18
+ def current_user_uid
19
+ mumukit_controller.session[:user_uid]
20
+ end
21
+
22
+ # default
23
+ def login_settings
24
+ Mumukit::Login::Settings.new
25
+ end
26
+
27
+ def mumukit_controller
28
+ @mumukit_controller ||= Mumukit::Login::Controller.new login_framework, self
29
+ end
30
+
31
+ def login_form
32
+ @login_builder ||= Mumukit::Login::Form.new login_provider, mumukit_controller, login_settings
33
+ end
34
+
35
+ def origin_redirector
36
+ @after_login_redirector ||= Mumukit::Login::OriginRedirector.new mumukit_controller
37
+ end
38
+
39
+ def login_framework
40
+ Mumukit::Login.config.framework
41
+ end
42
+
43
+ def login_provider
44
+ Mumukit::Login.config.provider
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ module Mumukit::Login::LoginControllerHelpers
2
+
3
+ def login
4
+ origin_redirector.save_location!
5
+ login_provider.request_authentication! mumukit_controller, login_settings
6
+ end
7
+
8
+ def callback
9
+ profile = Mumukit::Login::Profile.from_omniauth(env['omniauth.auth'])
10
+ user = Mumukit::Login.config.user_class.for_profile profile
11
+ save_session_user_uid! user
12
+ origin_redirector.redirect!
13
+ end
14
+
15
+ def destroy
16
+ destroy_session_user_uid!
17
+ mumukit_controller.redirect! login_provider.logout_redirection_path
18
+ end
19
+
20
+ private
21
+
22
+ # default
23
+ def destroy_session_user_uid!
24
+ mumukit_controller.session[:user_uid] = nil
25
+ end
26
+
27
+ # default
28
+ def save_session_user_uid!(user)
29
+ mumukit_controller.session[:user_uid] = user.uid
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ class Mumukit::Login::OriginRedirector
2
+ def initialize(controller)
3
+ @controller = controller
4
+ end
5
+
6
+ def redirect!
7
+ location = @controller.session[:redirect_after_login]
8
+ @controller.session[:redirect_after_login] = nil
9
+ @controller.redirect!(location || '/')
10
+ end
11
+
12
+ def save_location!
13
+ @controller.session[:redirect_after_login] = Addressable::URI.heuristic_parse(origin).path
14
+ end
15
+
16
+ private
17
+
18
+ def origin
19
+ @controller.request.params['origin']
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ module Mumukit::Login::Profile
2
+ def self.from_omniauth(omniauth)
3
+ struct provider: omniauth.provider,
4
+ name: omniauth.info.nickname || omniauth.info.name,
5
+ social_id: omniauth.uid,
6
+ email: omniauth.info.email,
7
+ uid: omniauth.info.email || omniauth.uid,
8
+ image_url: omniauth.info.image
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ module Mumukit::Login::Provider
2
+ def self.from_env
3
+ parse_login_provider(login_provider_string).tap do |provider|
4
+ puts "[Mumukit::Login] Using #{provider} as login provider"
5
+ end
6
+ end
7
+
8
+ def self.login_provider_string
9
+ if ENV['MUMUKI_LOGIN_PROVIDER'].blank? || ENV['RACK_ENV'] == 'test' || ENV['RAILS_ENV'] == 'test'
10
+ 'developer'
11
+ else
12
+ ENV['MUMUKI_LOGIN_PROVIDER']
13
+ end
14
+ end
15
+
16
+ def self.parse_login_provider(login_provider)
17
+ case login_provider
18
+ when 'developer'
19
+ Mumukit::Login::Provider::Developer.new
20
+ when 'saml'
21
+ Mumukit::Login::Provider::Saml.new
22
+ when 'auth0'
23
+ Mumukit::Login::Provider::Auth0.new
24
+ else
25
+ raise "Unknown login_provider `#{login_provider}`"
26
+ end
27
+ end
28
+ end
29
+
30
+ require_relative './provider/base'
31
+ require_relative './provider/saml'
32
+ require_relative './provider/auth0'
33
+ require_relative './provider/developer'
@@ -0,0 +1,41 @@
1
+ class Mumukit::Login::Provider::Auth0 < Mumukit::Login::Provider::Base
2
+ def configure_omniauth!(omniauth)
3
+ omniauth.provider :auth0,
4
+ auth0_config.client_id,
5
+ auth0_config.client_secret,
6
+ auth0_config.domain,
7
+ callback_path: callback_path
8
+ end
9
+
10
+ def request_authentication!(controller, login_settings)
11
+ settings = lock_settings(controller, login_settings, {closable: false})
12
+ controller.render_html! <<HTML
13
+ <script type="text/javascript">
14
+ new Auth0Lock('#{auth0_config.client_id}', '#{auth0_config.domain}').show(#{settings});
15
+ </script>
16
+ HTML
17
+ end
18
+
19
+ def header_html(*)
20
+ <<HTML
21
+ <script src="https://cdn.auth0.com/js/lock-7.12.min.js"></script>
22
+ </script>
23
+ HTML
24
+ end
25
+
26
+ def footer_html(*)
27
+ '<a href="https://auth0.com/" target="_blank">
28
+ <img height="40" alt="JWT Auth for open source projects" src="//cdn.auth0.com/oss/badges/a0-badge-light.png"/>
29
+ </a>'
30
+ end
31
+
32
+ private
33
+
34
+ def auth0_config
35
+ Mumukit::Login.config.auth0
36
+ end
37
+
38
+ def lock_settings(controller, login_settings, options)
39
+ login_settings.to_lock_json(controller.url_for(callback_path), options)
40
+ end
41
+ end
@@ -0,0 +1,43 @@
1
+ class Mumukit::Login::Provider::Base
2
+ def name
3
+ @name ||= self.class.name.demodulize.downcase
4
+ end
5
+
6
+ required :configure_omniauth!
7
+
8
+ def request_authentication!(controller, _login_settings)
9
+ controller.redirect! auth_path
10
+ end
11
+
12
+ def configure_rails_forgery_protection!(action_controller)
13
+ action_controller.protect_from_forgery with: :exception
14
+ end
15
+
16
+ def login_path(controller)
17
+ "/login?origin=#{controller.request.path}"
18
+ end
19
+
20
+ def auth_path
21
+ "/auth/#{name}"
22
+ end
23
+
24
+ def callback_path
25
+ "/auth/#{name}/callback"
26
+ end
27
+
28
+ def logout_redirection_path
29
+ '/'
30
+ end
31
+
32
+ def button_html(controller, title, clazz)
33
+ %Q{<a class="#{clazz}" href="#{login_path(controller)}">#{title}</a>}
34
+ end
35
+
36
+ def footer_html(*)
37
+ nil
38
+ end
39
+
40
+ def header_html(*)
41
+ nil
42
+ end
43
+ end
@@ -0,0 +1,8 @@
1
+ class Mumukit::Login::Provider::Developer < Mumukit::Login::Provider::Base
2
+ def configure_omniauth!(omniauth)
3
+ omniauth.provider :developer
4
+ end
5
+
6
+ def configure_rails_forgery_protection!(*)
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ class Mumukit::Login::Provider::Saml < Mumukit::Login::Provider::Base
2
+ def saml_config
3
+ Mumukit::Login.config.saml
4
+ end
5
+
6
+ def configure_omniauth!(omniauth)
7
+ omniauth.provider :saml,
8
+ # TODO: change the :assertion_consumer_service_url, the :issuer and the :slo_default_relay_state:
9
+ # => 1. we can not call any Organization method since there is none instantiated yet and
10
+ # => 2. we must use the absolut path to generate the right SAML metadata to set up the federation with the IdP
11
+ assertion_consumer_service_url: "#{saml_config.base_url}#{callback_path}",
12
+ single_logout_service_url: "#{saml_config.base_url}#{auth_path}/slo",
13
+ issuer: "#{saml_config.base_url}#{auth_path}",
14
+ idp_sso_target_url: saml_config.idp_sso_target_url,
15
+ idp_slo_target_url: saml_config.idp_slo_target_url,
16
+ slo_default_relay_state: saml_config.base_url,
17
+ idp_cert: File.read('./saml.crt'),
18
+ attribute_service_name: 'Mumuki',
19
+ request_attributes: [
20
+ {name: 'email', name_format: 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic', friendly_name: 'Email address'},
21
+ {name: 'name', name_format: 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic', friendly_name: 'Full name'},
22
+ {name: 'image', name_format: 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic', friendly_name: 'Avatar image'}
23
+ ],
24
+ attribute_statements: {
25
+ name: [saml_config.translaton_name],
26
+ email: [saml_config.translaton_email],
27
+ image: [saml_config.translaton_image]
28
+ }
29
+ end
30
+
31
+ def configure_rails_forgery_protection!(_controller_class)
32
+ # FIXME this is big security issue
33
+ # Do nothing (do not protect): the IdP calls the assertion_url via POST and without the CSRF token
34
+ end
35
+
36
+ def logout_redirection_path
37
+ "#{auth_path}/spslo"
38
+ end
39
+ end
@@ -0,0 +1,56 @@
1
+
2
+ class Mumukit::Login::Settings
3
+ LOCK_LOGIN_METHODS = {
4
+ facebook: 'facebook',
5
+ github: 'github',
6
+ google: 'google-oauth2',
7
+ twitter: 'twitter',
8
+ user_pass: 'Username-Password-Authentication'
9
+ }
10
+
11
+ attr_accessor :login_methods
12
+
13
+ def initialize(login_methods = Mumukit::Login::Settings.default_methods)
14
+ @login_methods = login_methods.map(&:to_sym)
15
+ end
16
+
17
+ def many_methods?
18
+ user_pass? && social_login_methods.size > 1
19
+ end
20
+
21
+ def user_pass?
22
+ login_methods.include? :user_pass
23
+ end
24
+
25
+ def social_login_methods
26
+ login_methods - [:user_pass]
27
+ end
28
+
29
+ def to_lock_json(callback_url, options={})
30
+ lock_json
31
+ .merge(callbackURL: callback_url, responseType: 'code', authParams: {scope: 'openid profile'})
32
+ .merge(options)
33
+ .to_json
34
+ .html_safe
35
+ end
36
+
37
+ def lock_json
38
+ {dict: I18n.locale,
39
+ connections: lock_login_methods,
40
+ icon: '/logo-alt.png',
41
+ socialBigButtons: !many_methods?,
42
+ disableResetAction: false}
43
+ end
44
+
45
+ def lock_login_methods
46
+ login_methods.map { |it| LOCK_LOGIN_METHODS[it] }
47
+ end
48
+
49
+ def self.login_methods
50
+ LOCK_LOGIN_METHODS.keys
51
+ end
52
+
53
+ def self.default_methods
54
+ [:user_pass]
55
+ end
56
+ end
@@ -0,0 +1,5 @@
1
+ module Mumukit
2
+ module Login
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mumukit-login
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Franco Leonardo Bulgarelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: codeclimate-test-reporter
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: addressable
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: omniauth
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.2'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: omniauth-auth0
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: omniauth-saml
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.6'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: mumukit-core
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.5'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.5'
167
+ description:
168
+ email:
169
+ - franco@mumuki.org
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - lib/mumukit/login.rb
175
+ - lib/mumukit/login/controller.rb
176
+ - lib/mumukit/login/form.rb
177
+ - lib/mumukit/login/framework.rb
178
+ - lib/mumukit/login/framework/rails.rb
179
+ - lib/mumukit/login/helpers.rb
180
+ - lib/mumukit/login/helpers/authentication_helpers.rb
181
+ - lib/mumukit/login/helpers/login_controller_helpers.rb
182
+ - lib/mumukit/login/origin_redirector.rb
183
+ - lib/mumukit/login/profile.rb
184
+ - lib/mumukit/login/provider.rb
185
+ - lib/mumukit/login/provider/auth0.rb
186
+ - lib/mumukit/login/provider/base.rb
187
+ - lib/mumukit/login/provider/developer.rb
188
+ - lib/mumukit/login/provider/saml.rb
189
+ - lib/mumukit/login/settings.rb
190
+ - lib/mumukit/login/version.rb
191
+ homepage: http://github.com/mumuki/mumukit-login
192
+ licenses:
193
+ - MIT
194
+ metadata: {}
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubyforge_project:
211
+ rubygems_version: 2.5.1
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: Library for login mumuki requests
215
+ test_files: []