spid-rails 0.1.3 → 0.2.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 +5 -5
- data/README.md +26 -138
- data/lib/generators/spid/rails/templates/spid-rails.rb +19 -21
- data/lib/spid-rails.rb +4 -38
- data/lib/spid-rails/engine.rb +2 -6
- data/lib/spid-rails/railtie.rb +11 -0
- data/lib/spid-rails/route_helper.rb +52 -0
- data/lib/spid-rails/version.rb +1 -3
- metadata +34 -29
- data/app/controllers/spid/rails/application_controller.rb +0 -9
- data/app/controllers/spid/rails/metadata_controller.rb +0 -17
- data/app/controllers/spid/rails/single_logout_operations_controller.rb +0 -45
- data/app/controllers/spid/rails/single_sign_ons_controller.rb +0 -38
- data/app/helpers/spid/rails/application_helper.rb +0 -8
- data/app/jobs/spid/rails/application_job.rb +0 -8
- data/app/mailers/spid/rails/application_mailer.rb +0 -10
- data/app/models/spid/certificate.rb +0 -45
- data/app/models/spid/idp.rb +0 -34
- data/app/models/spid/metadata.rb +0 -74
- data/app/models/spid/rails/application_record.rb +0 -9
- data/app/models/spid/settings.rb +0 -92
- data/app/models/spid/settings/metadata.rb +0 -11
- data/app/models/spid/settings/slo.rb +0 -13
- data/app/models/spid/settings/sso.rb +0 -17
- data/app/models/spid/slo_request.rb +0 -22
- data/app/models/spid/slo_response.rb +0 -27
- data/app/models/spid/sso_request.rb +0 -46
- data/app/models/spid/sso_response.rb +0 -31
- data/app/views/layouts/spid-rails/application.html.erb +0 -14
- data/config/routes.rb +0 -16
- data/lib/generators/spid/rails/idp_importer_generator.rb +0 -21
- data/lib/generators/spid/rails/keys_generator.rb +0 -45
- data/lib/generators/spid/rails/templates/idp_import.yml +0 -11
- data/lib/spid-rails/onelogin/rubysaml/authrequest.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 765a5591bc3e28e62861921b202fdd7c20576c6c4337fe5563009b8551bc9ad5
|
4
|
+
data.tar.gz: 47643cdc4f367b10a4df58675d6e4fbfecade78fcf373ed4cddb2c56fbbdf65a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 007c881caef48afc8c8f879167f3fec615203eefaf7b5dfec8831d9c6c0ad820f9d1cf951b6c0ca219cbe41d212bd375042250647c6b80b8d61e8ebdd8babe31
|
7
|
+
data.tar.gz: 0635115efc70d49c7e131e4e09d74b5a732ab50f35959940b1735097131a0caac19a04a40ac62cf64417f400d0193a9ff72cfed14949c6aabf4d63bcb8356958
|
data/README.md
CHANGED
@@ -12,28 +12,20 @@ repository: https://github.com/rubynetti/rubynetti-rails
|
|
12
12
|
- [X] Sistema di configurazione
|
13
13
|
- [ ] Integrazione con omniauth
|
14
14
|
- [ ] Integrazione o esempio di integrazione con devise
|
15
|
-
- [
|
15
|
+
- [X] Configurazione richiesta attributi utente
|
16
16
|
|
17
17
|
|
18
18
|
## Installazione
|
19
|
-
|
20
|
-
|
19
|
+
Aggiungere nel Gemfile
|
21
20
|
```ruby
|
22
21
|
gem 'spid-rails'
|
23
22
|
```
|
24
|
-
|
25
|
-
Eseguire
|
23
|
+
ed eseguire
|
26
24
|
|
27
25
|
```bash
|
28
26
|
$ bundle
|
29
27
|
```
|
30
28
|
|
31
|
-
|
32
|
-
## Come si usa?
|
33
|
-
La gemma può essere aggiunta a qualunque applicazione Rails al fine di utilizzare il sistema di login Spid.
|
34
|
-
Il metadata generato può essere utilizzato per farsi accreditare e in seguito dialogare con qualunque Identity Provider Spid accreditato.
|
35
|
-
|
36
|
-
|
37
29
|
### Configurazione
|
38
30
|
|
39
31
|
Per creare il file di configurazione:
|
@@ -41,145 +33,41 @@ Per creare il file di configurazione:
|
|
41
33
|
```bash
|
42
34
|
$ rails g spid:rails:config
|
43
35
|
```
|
36
|
+
che creerà il file `config/initializer/spid-rails.rb` con la configurazione default.
|
44
37
|
|
45
|
-
|
46
|
-
|
47
|
-
Le restanti impostazioni permettono di configurare il percorso di sistema dove reperire la coppia chiave privata/certificato e il livello di crittografia per l'eventuale signature.
|
38
|
+
Una volta creata la configurazione bisogna aggiungere il middleware **dopo** il middleware di gestione della sessione. In `config/application.rb`
|
48
39
|
|
49
40
|
```ruby
|
50
|
-
# config/
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
# Url alla quale e' disponibile il metadata del provider
|
61
|
-
# default: 'metadata'
|
62
|
-
# config.metadata_path = 'metadata'
|
63
|
-
|
64
|
-
# Url alla quale ricevere le risposte di autenticazione Saml
|
65
|
-
# default: 'sso'
|
66
|
-
# config.sso_path = 'sso'
|
67
|
-
|
68
|
-
# Url alla quale ricevere le risposte di logout Saml
|
69
|
-
# default: 'slo'
|
70
|
-
# config.slo_path = 'slo'
|
71
|
-
|
72
|
-
# Percorso relativo alla root dell'app
|
73
|
-
# al quale reperire la coppia chiave privata - certificato
|
74
|
-
# default: 'lib/.keys'
|
75
|
-
# config.keys_path = 'lib/.keys/'
|
76
|
-
|
77
|
-
# Livello di crittografia SHA per la generazione delle signature
|
78
|
-
# default: 256
|
79
|
-
# config.sha = 256
|
80
|
-
|
41
|
+
# config/application.rb
|
42
|
+
|
43
|
+
module MyApplication
|
44
|
+
class Application < ::Rails::Application
|
45
|
+
config.middleware.insert_after(
|
46
|
+
::ActionDispatch::Session::CookieStore,
|
47
|
+
::Spid::Rack
|
48
|
+
)
|
49
|
+
end
|
81
50
|
end
|
82
51
|
```
|
83
52
|
|
53
|
+
Questa gemma è un wrapper della gemma [spid-ruby](https://github.com/italia/spid-ruby) con funzionalità per semplificare l'utilizzo con rails
|
84
54
|
|
85
|
-
Per utilizzare Identity provider custom o modificare quelli presenti:
|
86
|
-
|
87
|
-
```bash
|
88
|
-
$ rails g spid:rails:idp_importer
|
89
|
-
```
|
90
|
-
|
91
|
-
Il file viene aggiunto alla cartella _config/spid-rails_ e permette di specificare idp per i diversi ambienti dell'applicazione.
|
92
|
-
|
93
|
-
```YAML
|
94
|
-
# app/config/spid-rails/idp_import.yml
|
95
55
|
|
96
|
-
|
97
|
-
|
98
|
-
metadata_url: 'https://localhost:8080'
|
99
|
-
validate_cert: false
|
56
|
+
### Helpers
|
57
|
+
La gemma fornirà una serie di helpers per la generazione dei paths:
|
100
58
|
|
101
|
-
|
102
|
-
|
103
|
-
agid:
|
104
|
-
metadata_url: 'https://idp.spid.gov.it:8080/assets/idp-metadata.xml'
|
105
|
-
validate_cert: false
|
59
|
+
#### spid_login_path
|
60
|
+
`spid_login_path(idp_name: idp_entity_id, authn_context: Spid::L1, attribute_service_index: 0)`
|
106
61
|
|
107
|
-
|
108
|
-
<<: *shared
|
109
|
-
```
|
110
|
-
|
111
|
-
|
112
|
-
### Nelle view
|
113
|
-
|
114
|
-
Una volta installata la gemma, verranno creati una serie di helper utilizzabili nelle view e nei controller.
|
115
|
-
|
116
|
-
```spid_rails.metadata_path``` e ```spid_rails.metadata_url``` restituiscono il percorso al quale è reperibile il metadata del Service Provider.
|
117
|
-
```ruby
|
118
|
-
# Esempio di link al metadata del ServiceProvider
|
119
|
-
link_to "Metadata SP", spid_rails.metadata_path
|
120
|
-
```
|
121
|
-
|
122
|
-
|
123
|
-
```spid_rails.new_sso_path``` e ```spid_rails.new_sso_url``` restituiscono il percorso tramite il quale inizializzare una richiesa di autenticazione all'Identity Provider.
|
124
|
-
È necessario fornire come parametro l'Idp cui indirizzare la richiesta, facoltativo il livello di autenticazione Spid (default: '1') e i bindings della richiesta all' Idp (default: ['redirect']).
|
125
|
-
```ruby
|
126
|
-
# Esempio di link al login tramite l'Idp di test https:://idp.spid.gov.it
|
127
|
-
link_to "Login con Spid", spid_rails.new_sso_path(sso: { idp: :agid_test, spid_level: 2 })
|
128
|
-
```
|
129
|
-
|
130
|
-
Gli Identity Provider attualmente supportati sono:
|
131
|
-
- 'aruba' : servizio Idp di Aruba Pec S.p.A.
|
132
|
-
- 'infocert' : servizio Idp di Infocert S.p.A
|
133
|
-
- 'namirial' : servizio Idp di Namirial S.p.A.
|
134
|
-
- 'poste' : servizio Idp di Poste Italiane S.p.A.
|
135
|
-
- 'spiditalia' : servizio Idp di REGISTER.IT S.p.A.
|
136
|
-
- 'sielte' : servizio Idp di Sielte S.p.A.
|
137
|
-
- 'tim' : servizio Idp di TI Trust Technologies S.r.l.
|
138
|
-
- 'agid_test' : servizio idp di test di Agid
|
139
|
-
- 'poste_test' : servizio Idp di test di Poste Italiane S.p.A.
|
140
|
-
|
141
|
-
|
142
|
-
```spid_rails.new_slo_path``` e ```spid_rails.new_slo_url``` infine restituiscono il percorso tramite il quale inizializzare una richiesa di logout all'Identity Provider che ha autenticato la sessione corrente.
|
143
|
-
```ruby
|
144
|
-
# Esempio di link al logout
|
145
|
-
link_to "Logout", spid_rails.new_slo_path
|
146
|
-
```
|
147
|
-
|
148
|
-
|
149
|
-
### Nei controller
|
150
|
-
|
151
|
-
Dopo l'autenticazione e fino al logout vengono aggiunte alla sessione le seguenti variabili:
|
152
|
-
|
153
|
-
```session[:sso_params]``` che restituisce i parametri coi quali è stata effettuata l'ultima richiesta di autenticazione, in particolare l'idp
|
154
|
-
|
155
|
-
```session[:spid_index]``` che restituisce l'identificativo dell'attuale sessione Spid e viene utilizzato nella procedura di logout
|
156
|
-
|
157
|
-
```session[:spid_login_time]``` che restituisce il _time_ in cui è avvenuto il login
|
158
|
-
|
159
|
-
È inoltre possibile settare la variabile ```session[:spid_relay_state]```, contenente l'indirizzo al quale si vuole essere reindirizzati in caso l'autenticazione abbia successo
|
160
|
-
|
161
|
-
Un esempio rudimentale di verifica del login dell'utente all'interno di un'azione del controller potrebbe essere il seguente
|
162
|
-
```ruby
|
163
|
-
# app/controllers/my_controller.rb
|
164
|
-
class MyController < Application controller
|
165
|
-
before_action :validate_spid_session
|
166
|
-
|
167
|
-
...
|
168
|
-
|
169
|
-
private
|
170
|
-
|
171
|
-
def validate_spid_session
|
172
|
-
if session[:spid_index].blank?
|
173
|
-
session[:spid_relay_state] = request.path
|
174
|
-
redirect_to login_path
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
end
|
179
|
-
```
|
62
|
+
che genera un url per iniziare il processo di autenticazione con un identity provider:
|
180
63
|
|
181
|
-
|
64
|
+
* idp_name: Obbligatorio, è l'entity_id dell'IdP con cui vogliamo instaurare l'autenticazione
|
65
|
+
* authn_context: E' il valore del tipo di autenticazione richiesta. Default: `https://www.spid.gov.id/L1`
|
66
|
+
* attribute_service_index: Nel caso in cui l'applicazione disponga di più `AttributeConsumingService`, l'indice del servizio che vogliamo utilizzare. Default: 0
|
182
67
|
|
68
|
+
#### spid_logout_path
|
69
|
+
`spid_logout_path(idp_name: idp_entity_id)`
|
70
|
+
Come sopra, crea un link per iniziare il processo di logout verso l'IdP
|
183
71
|
|
184
72
|
## License
|
185
73
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -1,26 +1,24 @@
|
|
1
|
-
|
2
|
-
# Mount point di Spid sull'applicazione
|
3
|
-
# default: 'spid'
|
4
|
-
# config.mount_point = 'spid'
|
1
|
+
# frozen_string_literal: true
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
# config.metadata_path = 'metadata'
|
3
|
+
Spid.configure do |config|
|
4
|
+
config.hostname = ENV.fetch('HOST')
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
config.idp_metadata_dir_path = Rails.root.join('config/idp_metadata')
|
7
|
+
config.private_key_pem = ENV.fetch('PRIVATE_KEY')
|
8
|
+
config.certificate_pem = ENV.fetch('CERTIFICATE')
|
13
9
|
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
config.metadata_path = '/spid/metadata'
|
11
|
+
config.login_path = '/spid/login'
|
12
|
+
config.logout_path = '/spid/logout'
|
13
|
+
config.acs_path = '/spid/sso'
|
14
|
+
config.slo_path = '/spid/slo'
|
15
|
+
config.default_relay_state_path = '/'
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# config.sha = 256
|
17
|
+
config.digest_method = Spid::SHA512
|
18
|
+
config.signature_method = Spid::RSA_SHA512
|
19
|
+
config.acs_binding = Spid::BINDINGS_HTTP_POST
|
20
|
+
config.slo_binding = Spid::BINDINGS_HTTP_REDIRECT
|
21
|
+
config.attribute_services = [
|
22
|
+
{ name: 'Service1', fields: ['email'] }
|
23
|
+
]
|
26
24
|
end
|
data/lib/spid-rails.rb
CHANGED
@@ -1,44 +1,10 @@
|
|
1
|
+
require 'spid'
|
2
|
+
require 'spid-rails/railtie'
|
1
3
|
require 'spid-rails/engine'
|
4
|
+
require 'spid-rails/route_helper'
|
5
|
+
require 'spid-rails/version'
|
2
6
|
|
3
7
|
module Spid
|
4
8
|
module Rails
|
5
|
-
|
6
|
-
# Mount point di Spid sull'applicazione
|
7
|
-
mattr_accessor :mount_point
|
8
|
-
@@mount_point = 'spid'
|
9
|
-
|
10
|
-
# Url alla quale e' disponibile il metadata del provider
|
11
|
-
mattr_accessor :metadata_path
|
12
|
-
@@metadata_path = 'metadata'
|
13
|
-
|
14
|
-
# Url alla quale ricevere le risposte di autenticazione Saml
|
15
|
-
mattr_accessor :sso_path
|
16
|
-
@@sso_path = 'sso'
|
17
|
-
|
18
|
-
# Url alla quale ricevere le risposte di logout Saml
|
19
|
-
mattr_accessor :slo_path
|
20
|
-
@@slo_path = 'slo'
|
21
|
-
|
22
|
-
# Percorso relativo alla root dell'app
|
23
|
-
# al quale reperire la coppia chiave privata - certificato
|
24
|
-
mattr_accessor :keys_path
|
25
|
-
@@keys_path = 'lib/.keys/'
|
26
|
-
|
27
|
-
# Livello di crittografia SHA per la generazione delle signature
|
28
|
-
mattr_accessor :sha
|
29
|
-
@@sha = 256
|
30
|
-
|
31
|
-
def self.app_metadata_path
|
32
|
-
"#{mount_point}/#{@@metadata_path}"
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.app_sso_path
|
36
|
-
"#{mount_point}/#{@@sso_path}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.app_slo_path
|
40
|
-
"#{mount_point}/#{@@slo_path}"
|
41
|
-
end
|
42
|
-
|
43
9
|
end
|
44
10
|
end
|
data/lib/spid-rails/engine.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
1
|
require 'onelogin/ruby-saml'
|
2
|
-
require 'spid-rails/onelogin/rubysaml/authrequest'
|
3
2
|
|
4
3
|
module Spid
|
5
4
|
module Rails
|
6
5
|
|
7
6
|
class Engine < ::Rails::Engine
|
8
|
-
|
9
|
-
|
10
|
-
initializer 'spid-rails.load_custom_idp_list' do
|
11
|
-
path_to_list = ::Rails.root.join('config', 'spid-rails', 'idp_import.yml')
|
12
|
-
Spid::Idp.import(path_to_list) if File.exist?(path_to_list)
|
7
|
+
initializer 'spid_rails_engine' do |_app|
|
8
|
+
ActionView::Base.send :include, ::Spid::Rails::RouteHelper
|
13
9
|
end
|
14
10
|
|
15
11
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Spid
|
2
|
+
module Rails
|
3
|
+
module RouteHelper
|
4
|
+
def metadata_path
|
5
|
+
Spid.configuration.metadata_path
|
6
|
+
end
|
7
|
+
|
8
|
+
def metadata_url
|
9
|
+
URI.join(
|
10
|
+
Spid.configuration.hostname,
|
11
|
+
metadata_path
|
12
|
+
).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def spid_login_path(
|
16
|
+
idp_name:,
|
17
|
+
authn_context: nil,
|
18
|
+
attribute_service_index: nil
|
19
|
+
)
|
20
|
+
options = { idp_name: idp_name }
|
21
|
+
options[:authn_context] = authn_context if authn_context.present?
|
22
|
+
options[:attribute_service_index] = attribute_service_index if attribute_service_index.present?
|
23
|
+
[
|
24
|
+
Spid.configuration.login_path,
|
25
|
+
options.to_param
|
26
|
+
].join('?')
|
27
|
+
end
|
28
|
+
|
29
|
+
def spid_logout_path(idp_name:)
|
30
|
+
options = { idp_name: idp_name }
|
31
|
+
[
|
32
|
+
Spid.configuration.logout_path,
|
33
|
+
options.to_param
|
34
|
+
].join('?')
|
35
|
+
end
|
36
|
+
|
37
|
+
def spid_login_url(options)
|
38
|
+
URI.join(
|
39
|
+
Spid.configuration.hostname,
|
40
|
+
spid_login_path(options)
|
41
|
+
).to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def spid_logout_url(options)
|
45
|
+
URI.join(
|
46
|
+
Spid.configuration.hostname,
|
47
|
+
spid_logout_path(options)
|
48
|
+
).to_s
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/spid-rails/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spid-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alessandro Descovi, Giacomo Bertoldi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -64,6 +64,20 @@ dependencies:
|
|
64
64
|
- - ">="
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: 1.0.4
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: spid
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.18.0
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.18.0
|
67
81
|
- !ruby/object:Gem::Dependency
|
68
82
|
name: bundler-audit
|
69
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,7 +93,7 @@ dependencies:
|
|
79
93
|
- !ruby/object:Gem::Version
|
80
94
|
version: '0'
|
81
95
|
- !ruby/object:Gem::Dependency
|
82
|
-
name:
|
96
|
+
name: pry-byebug
|
83
97
|
requirement: !ruby/object:Gem::Requirement
|
84
98
|
requirements:
|
85
99
|
- - ">="
|
@@ -92,6 +106,20 @@ dependencies:
|
|
92
106
|
- - ">="
|
93
107
|
- !ruby/object:Gem::Version
|
94
108
|
version: '0'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: rubocop
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - '='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.57.2
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - '='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 0.57.2
|
95
123
|
- !ruby/object:Gem::Dependency
|
96
124
|
name: simplecov
|
97
125
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,36 +163,13 @@ files:
|
|
135
163
|
- app/assets/javascripts/spid-rails/metadata.js
|
136
164
|
- app/assets/stylesheets/spid-rails/application.css
|
137
165
|
- app/assets/stylesheets/spid-rails/metadata.css
|
138
|
-
- app/controllers/spid/rails/application_controller.rb
|
139
|
-
- app/controllers/spid/rails/metadata_controller.rb
|
140
|
-
- app/controllers/spid/rails/single_logout_operations_controller.rb
|
141
|
-
- app/controllers/spid/rails/single_sign_ons_controller.rb
|
142
|
-
- app/helpers/spid/rails/application_helper.rb
|
143
|
-
- app/jobs/spid/rails/application_job.rb
|
144
|
-
- app/mailers/spid/rails/application_mailer.rb
|
145
|
-
- app/models/spid/certificate.rb
|
146
|
-
- app/models/spid/idp.rb
|
147
|
-
- app/models/spid/metadata.rb
|
148
|
-
- app/models/spid/rails/application_record.rb
|
149
|
-
- app/models/spid/settings.rb
|
150
|
-
- app/models/spid/settings/metadata.rb
|
151
|
-
- app/models/spid/settings/slo.rb
|
152
|
-
- app/models/spid/settings/sso.rb
|
153
|
-
- app/models/spid/slo_request.rb
|
154
|
-
- app/models/spid/slo_response.rb
|
155
|
-
- app/models/spid/sso_request.rb
|
156
|
-
- app/models/spid/sso_response.rb
|
157
|
-
- app/views/layouts/spid-rails/application.html.erb
|
158
|
-
- config/routes.rb
|
159
166
|
- config/spid-rails/idp_list.yml
|
160
167
|
- lib/generators/spid/rails/config_generator.rb
|
161
|
-
- lib/generators/spid/rails/idp_importer_generator.rb
|
162
|
-
- lib/generators/spid/rails/keys_generator.rb
|
163
|
-
- lib/generators/spid/rails/templates/idp_import.yml
|
164
168
|
- lib/generators/spid/rails/templates/spid-rails.rb
|
165
169
|
- lib/spid-rails.rb
|
166
170
|
- lib/spid-rails/engine.rb
|
167
|
-
- lib/spid-rails/
|
171
|
+
- lib/spid-rails/railtie.rb
|
172
|
+
- lib/spid-rails/route_helper.rb
|
168
173
|
- lib/spid-rails/version.rb
|
169
174
|
- lib/tasks/spid-rails_tasks.rake
|
170
175
|
homepage: https://github.com/italia/spid-rails
|
@@ -187,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
192
|
version: '0'
|
188
193
|
requirements: []
|
189
194
|
rubyforge_project:
|
190
|
-
rubygems_version: 2.
|
195
|
+
rubygems_version: 2.7.7
|
191
196
|
signing_key:
|
192
197
|
specification_version: 4
|
193
198
|
summary: SPID, il Sistema Pubblico di Identita' Digitale
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require_dependency 'spid/rails/application_controller'
|
2
|
-
|
3
|
-
# Metadata del Service Provider
|
4
|
-
module Spid
|
5
|
-
module Rails
|
6
|
-
|
7
|
-
class MetadataController < ApplicationController
|
8
|
-
|
9
|
-
def show
|
10
|
-
metadata = Metadata.create(host: main_app.root_url)
|
11
|
-
render xml: metadata.to_xml
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require_dependency 'spid/rails/application_controller'
|
2
|
-
|
3
|
-
module Spid
|
4
|
-
module Rails
|
5
|
-
|
6
|
-
class SingleLogoutOperationsController < ApplicationController
|
7
|
-
skip_before_action :verify_authenticity_token, only: :create
|
8
|
-
|
9
|
-
def new
|
10
|
-
logout_request = SloRequest.new(slo_params)
|
11
|
-
redirect_to logout_request.to_saml
|
12
|
-
session[:spid_slo_id] = logout_request.uuid
|
13
|
-
end
|
14
|
-
|
15
|
-
def create
|
16
|
-
_logout_response = SloResponse.new(params[:SAMLResponse],
|
17
|
-
session[:spid_slo_id],
|
18
|
-
slo_params)
|
19
|
-
# TODO: approfondire validazione logout
|
20
|
-
destroy_spid_session
|
21
|
-
redirect_to main_app.root_path, notice: 'Logout utente eseguito con successo'
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def slo_params
|
27
|
-
{
|
28
|
-
host: main_app.root_url,
|
29
|
-
idp: session[:sso_params]['idp'],
|
30
|
-
session_index: session[:spid_index]
|
31
|
-
}
|
32
|
-
end
|
33
|
-
|
34
|
-
def destroy_spid_session
|
35
|
-
session[:sso_params] = nil
|
36
|
-
session[:spid_index] = nil
|
37
|
-
session[:spid_slo_id] = nil
|
38
|
-
session[:spid_relay_state] = nil
|
39
|
-
session[:spid_login_time] = nil
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require_dependency 'spid/rails/application_controller'
|
2
|
-
|
3
|
-
module Spid
|
4
|
-
module Rails
|
5
|
-
|
6
|
-
class SingleSignOnsController < ApplicationController
|
7
|
-
skip_before_action :verify_authenticity_token, only: :create
|
8
|
-
|
9
|
-
def new
|
10
|
-
request = SsoRequest.new(sso_params)
|
11
|
-
redirect_to request.to_saml
|
12
|
-
session[:sso_params] = sso_params
|
13
|
-
end
|
14
|
-
|
15
|
-
def create
|
16
|
-
response = SsoResponse.new(params[:SAMLResponse], session[:sso_params])
|
17
|
-
if response.valid?
|
18
|
-
session[:spid_index] = response.session_index
|
19
|
-
session[:spid_login_time] = Time.now
|
20
|
-
redirect_to session[:relay_state] || main_app.root_path, notice: 'Utente autenticato con successo'
|
21
|
-
else
|
22
|
-
redirect_to main_app.root_path, notice: 'Autenticazione fallita'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def sso_params
|
29
|
-
sso_params = params.require(:sso).permit(:idp, :spid_level, bindings: [])
|
30
|
-
sso_params[:host] = main_app.root_url
|
31
|
-
sso_params[:relay_state] = session[:spid_relay_state] || main_app.root_url
|
32
|
-
sso_params
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class Certificate
|
4
|
-
|
5
|
-
def self.signature_algorithm sha
|
6
|
-
case sha.to_s
|
7
|
-
when '256'
|
8
|
-
XMLSecurity::Document::RSA_SHA256
|
9
|
-
when '384'
|
10
|
-
XMLSecurity::Document::RSA_SHA384
|
11
|
-
when '512'
|
12
|
-
XMLSecurity::Document::RSA_SHA512
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.digest_algorithm sha
|
17
|
-
case sha.to_s
|
18
|
-
when '256'
|
19
|
-
XMLSecurity::Document::SHA256
|
20
|
-
when '384'
|
21
|
-
XMLSecurity::Document::SHA384
|
22
|
-
when '512'
|
23
|
-
XMLSecurity::Document::SHA512
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.signature_algorithms
|
28
|
-
[
|
29
|
-
XMLSecurity::Document::RSA_SHA256,
|
30
|
-
XMLSecurity::Document::RSA_SHA384,
|
31
|
-
XMLSecurity::Document::RSA_SHA512,
|
32
|
-
]
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.digest_algorithms
|
36
|
-
[
|
37
|
-
XMLSecurity::Document::SHA256,
|
38
|
-
XMLSecurity::Document::SHA384,
|
39
|
-
XMLSecurity::Document::SHA512,
|
40
|
-
]
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
data/app/models/spid/idp.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class Idp
|
4
|
-
@list = YAML.load_file(
|
5
|
-
Spid::Rails::Engine.root.join('config', 'spid-rails', 'idp_list.yml')
|
6
|
-
)
|
7
|
-
|
8
|
-
attr_reader :metadata_url
|
9
|
-
|
10
|
-
def self.find(name)
|
11
|
-
raise 'Idp not found' unless @list.key?(name)
|
12
|
-
idp_attributes = @list[name]
|
13
|
-
new(idp_attributes.symbolize_keys)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.import(file_path)
|
17
|
-
list = YAML.load_file(file_path)[::Rails.env]
|
18
|
-
list.each do |name, params|
|
19
|
-
@list[name] = params
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def initialize(metadata_url:, validate_cert: true)
|
24
|
-
@metadata_url = metadata_url
|
25
|
-
@validate_cert = validate_cert
|
26
|
-
end
|
27
|
-
|
28
|
-
def validate_cert?
|
29
|
-
@validate_cert
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
data/app/models/spid/metadata.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class Metadata
|
4
|
-
attr_accessor :settings
|
5
|
-
|
6
|
-
def self.create **settings
|
7
|
-
obj = self.new(**settings)
|
8
|
-
obj.save if obj.valid?
|
9
|
-
end
|
10
|
-
|
11
|
-
def initialize spid_params
|
12
|
-
spid_settings = Settings::Metadata.new(spid_params)
|
13
|
-
@settings = spid_settings.to_hash
|
14
|
-
end
|
15
|
-
|
16
|
-
def valid?
|
17
|
-
raise 'EntityID deve essere presente (impostare issuer)' if settings[:issuer].blank?
|
18
|
-
raise 'Signature deve essere presente (impostare private_key)' if settings[:private_key].blank?
|
19
|
-
raise 'Signature deve essere presente (impostare certificate)' if settings[:certificate].blank?
|
20
|
-
validate_signature_encryption
|
21
|
-
validate_digest_encryption
|
22
|
-
validate_key_size
|
23
|
-
|
24
|
-
true
|
25
|
-
end
|
26
|
-
|
27
|
-
def validate_signature_encryption
|
28
|
-
signature_algorithms = Certificate.signature_algorithms
|
29
|
-
if signature_algorithms.exclude?(settings[:security][:signature_method])
|
30
|
-
raise 'Signature deve essere presente (impostare encryption sha a 256, 384, 512)'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def validate_digest_encryption
|
35
|
-
digest_algorithms = Certificate.digest_algorithms
|
36
|
-
if digest_algorithms.exclude?(settings[:security][:digest_method])
|
37
|
-
raise 'Signature deve essere presente (impostare encryption sha a 256, 384, 512)'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def validate_key_size
|
42
|
-
key = OpenSSL::PKey::RSA.new settings[:private_key]
|
43
|
-
key_size = key.n.num_bytes * 8
|
44
|
-
if key_size < 1024
|
45
|
-
raise 'Signature deve essere presente (impostare una chiave di almeno a 1024 bit'
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def save
|
50
|
-
valid?
|
51
|
-
metadata = OneLogin::RubySaml::Metadata.new
|
52
|
-
saml_settings = OneLogin::RubySaml::Settings.new @settings
|
53
|
-
@to_xml = metadata.generate(saml_settings)
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_xml
|
58
|
-
save and @to_xml
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.xml_namespaces
|
62
|
-
{
|
63
|
-
saml: 'urn:oasis:names:tc:SAML:2.0:assertion',
|
64
|
-
samlp: 'urn:oasis:names:tc:SAML:2.0:protocol',
|
65
|
-
md: 'urn:oasis:names:tc:SAML:2.0:metadata',
|
66
|
-
ds: 'http://www.w3.org/2000/09/xmldsig#',
|
67
|
-
xenc: 'http://www.w3.org/2001/04/xmlenc#',
|
68
|
-
xs: 'http://www.w3.org/2001/XMLSchema'
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
data/app/models/spid/settings.rb
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class Settings
|
4
|
-
|
5
|
-
attr_accessor :host
|
6
|
-
|
7
|
-
attr_accessor :metadata_path
|
8
|
-
|
9
|
-
attr_accessor :sso_path
|
10
|
-
|
11
|
-
attr_accessor :slo_path
|
12
|
-
|
13
|
-
attr_accessor :keys_path
|
14
|
-
|
15
|
-
attr_accessor :sha
|
16
|
-
|
17
|
-
attr_accessor :idp
|
18
|
-
|
19
|
-
attr_accessor :bindings
|
20
|
-
|
21
|
-
attr_accessor :spid_level
|
22
|
-
|
23
|
-
attr_accessor :session_index
|
24
|
-
|
25
|
-
attr_accessor :relay_state
|
26
|
-
|
27
|
-
def initialize spid_params
|
28
|
-
@metadata_path = Spid::Rails.app_metadata_path
|
29
|
-
@sso_path = Spid::Rails.app_sso_path
|
30
|
-
@slo_path = Spid::Rails.app_slo_path
|
31
|
-
@keys_path = Spid::Rails.keys_path
|
32
|
-
@sha = Spid::Rails.sha
|
33
|
-
@bindings = [:redirect]
|
34
|
-
@spid_level = 1
|
35
|
-
spid_params.each do |k, v|
|
36
|
-
send("#{k}=", v)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def security_attributes
|
41
|
-
dig_alg = Certificate.digest_algorithm(@sha)
|
42
|
-
sig_alg = Certificate.signature_algorithm(@sha)
|
43
|
-
{
|
44
|
-
metadata_signed: true,
|
45
|
-
digest_method: dig_alg,
|
46
|
-
signature_method: sig_alg,
|
47
|
-
authn_requests_signed: true,
|
48
|
-
want_assertions_signed: true
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
def sp_attributes
|
53
|
-
{
|
54
|
-
issuer: host,
|
55
|
-
assertion_consumer_service_url: host + sso_path,
|
56
|
-
single_logout_service_url: host + slo_path,
|
57
|
-
private_key: File.read("#{::Rails.root}/#{keys_path}/private_key.pem"),
|
58
|
-
certificate: File.read("#{::Rails.root}/#{keys_path}/certificate.pem"),
|
59
|
-
security: security_attributes
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
def idp_attributes
|
64
|
-
idp = Spid::Idp.find(@idp.to_s)
|
65
|
-
bindings = @bindings.map { |verb| self.class.saml_bindings[verb] }
|
66
|
-
parser = OneLogin::RubySaml::IdpMetadataParser.new
|
67
|
-
parser.parse_remote_to_hash idp.metadata_url,
|
68
|
-
idp.validate_cert?,
|
69
|
-
sso_binding: bindings
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
def authn_context
|
75
|
-
"https://www.spid.gov.it/SpidL#{@spid_level}"
|
76
|
-
end
|
77
|
-
|
78
|
-
def force_authn
|
79
|
-
return true if @spid_level != 1
|
80
|
-
end
|
81
|
-
|
82
|
-
# TODO spostare in utils
|
83
|
-
def self.saml_bindings
|
84
|
-
{
|
85
|
-
post: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
|
86
|
-
redirect: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect'
|
87
|
-
}
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class Settings::Sso < Settings
|
4
|
-
|
5
|
-
def to_hash
|
6
|
-
sso_attributes = sp_attributes.merge(idp_attributes)
|
7
|
-
sso_attributes[:authn_context] = authn_context
|
8
|
-
sso_attributes[:authn_context_comparison] = 'minimum'
|
9
|
-
sso_attributes[:force_authn] = force_authn
|
10
|
-
sso_attributes[:protocol_binding] = self.class.saml_bindings[:post]
|
11
|
-
sso_attributes[:relay_state] = relay_state
|
12
|
-
sso_attributes
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class SloRequest
|
4
|
-
|
5
|
-
def initialize slo_params
|
6
|
-
spid_settings = Settings::Slo.new(slo_params)
|
7
|
-
@settings = spid_settings.to_hash
|
8
|
-
@request = OneLogin::RubySaml::Logoutrequest.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def uuid
|
12
|
-
@request.uuid
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_saml
|
16
|
-
saml_settings = OneLogin::RubySaml::Settings.new(@settings)
|
17
|
-
@request.create(saml_settings)
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class SloResponse
|
4
|
-
|
5
|
-
def initialize saml_response, slo_id, slo_params
|
6
|
-
spid_settings = Settings::Slo.new(slo_params)
|
7
|
-
settings = OneLogin::RubySaml::Settings.new(spid_settings.to_hash)
|
8
|
-
@response = OneLogin::RubySaml::Logoutresponse.new(saml_response,
|
9
|
-
settings,
|
10
|
-
matches_request_id: slo_id)
|
11
|
-
end
|
12
|
-
|
13
|
-
def valid?
|
14
|
-
@response.validate
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
@response.inspect
|
19
|
-
end
|
20
|
-
|
21
|
-
def errors
|
22
|
-
@response.errors
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class SsoRequest
|
4
|
-
|
5
|
-
attr_accessor :settings
|
6
|
-
|
7
|
-
def initialize spid_params
|
8
|
-
spid_settings = Settings::Sso.new(spid_params)
|
9
|
-
@settings = spid_settings.to_hash
|
10
|
-
end
|
11
|
-
|
12
|
-
def valid?
|
13
|
-
if settings[:idp_sso_target_url].blank?
|
14
|
-
raise 'Destination deve essere presente (impostare idp_sso_target_url)'
|
15
|
-
end
|
16
|
-
if settings[:authn_context].last != '1' && settings[:force_authn] != true
|
17
|
-
raise 'ForceAuthn deve essere presente per livelli di aitenticazione diversi da SPIDL1 (impostare force_authn a true)'
|
18
|
-
end
|
19
|
-
if settings[:authn_context_comparison] != 'minimum'
|
20
|
-
raise "AuthnContextComparison deve essere settato a 'minimum' (impostare authn_context_comparison a 'minimum')"
|
21
|
-
end
|
22
|
-
if settings[:protocol_binding] != Settings.saml_bindings[:post]
|
23
|
-
raise "Issuer deve contenere l'attributo ProtocolBinding con binding POST (impostare protocl_binding a ':post')"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def save
|
28
|
-
valid?
|
29
|
-
request = OneLogin::RubySaml::Authrequest.new
|
30
|
-
saml_settings = OneLogin::RubySaml::Settings.new @settings
|
31
|
-
@to_saml = request.create(saml_settings)
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def to_saml
|
36
|
-
save and @to_saml
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.create **settings
|
40
|
-
obj = self.new(**settings)
|
41
|
-
obj.save
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
|
3
|
-
class SsoResponse
|
4
|
-
|
5
|
-
def initialize saml_response, sso_params
|
6
|
-
response = OneLogin::RubySaml::Response.new(saml_response)
|
7
|
-
settings = Settings::Sso.new(sso_params)
|
8
|
-
saml_settings = OneLogin::RubySaml::Settings.new(settings.to_hash)
|
9
|
-
response.settings = saml_settings
|
10
|
-
@response = response
|
11
|
-
end
|
12
|
-
|
13
|
-
def valid?
|
14
|
-
@response.is_valid?
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
@response.inspect
|
19
|
-
end
|
20
|
-
|
21
|
-
def session_index
|
22
|
-
@response.sessionindex
|
23
|
-
end
|
24
|
-
|
25
|
-
def errors
|
26
|
-
@response.errors
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>Spid rails</title>
|
5
|
-
<%= stylesheet_link_tag "spid-rails/application", media: "all" %>
|
6
|
-
<%= javascript_include_tag "spid-rails/application" %>
|
7
|
-
<%= csrf_meta_tags %>
|
8
|
-
</head>
|
9
|
-
<body>
|
10
|
-
|
11
|
-
<%= yield %>
|
12
|
-
|
13
|
-
</body>
|
14
|
-
</html>
|
data/config/routes.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
Rails.application.routes.draw do
|
2
|
-
mount Spid::Rails::Engine, at: Spid::Rails.mount_point
|
3
|
-
end
|
4
|
-
|
5
|
-
Spid::Rails::Engine.routes.draw do
|
6
|
-
resource :metadata, only: :show,
|
7
|
-
path: Spid::Rails.metadata_path
|
8
|
-
resource :sso, only: [:new, :create],
|
9
|
-
controller: :single_sign_ons,
|
10
|
-
path: Spid::Rails.sso_path
|
11
|
-
resource :slo, only: [:new, :create],
|
12
|
-
controller: :single_logout_operations,
|
13
|
-
path: Spid::Rails.slo_path do
|
14
|
-
get '/', to: 'single_logout_operations#create'
|
15
|
-
end
|
16
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
module Rails
|
3
|
-
|
4
|
-
module Generators
|
5
|
-
|
6
|
-
class IdpImporterGenerator < ::Rails::Generators::Base
|
7
|
-
|
8
|
-
source_root File.expand_path('templates', __dir__)
|
9
|
-
|
10
|
-
desc 'Crea il file di import custom degli Idp (config/spid-rails/idp_import.yml).'
|
11
|
-
|
12
|
-
def create_import_file
|
13
|
-
template 'idp_import.yml', './config/spid-rails/idp_import.yml'
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Spid
|
2
|
-
module Rails
|
3
|
-
|
4
|
-
module Generators
|
5
|
-
|
6
|
-
class KeysGenerator < ::Rails::Generators::Base
|
7
|
-
class_option :cn, type: :string, default: 'spid-rails-test', desc: 'Common name for the X509 certificate'
|
8
|
-
class_option :size, type: :numeric, default: 1024, desc: 'RSA key bit size'
|
9
|
-
class_option :digest, type: :string, default: 'SHA256', desc: 'Digest algorithm for signing the certificate'
|
10
|
-
class_option :validity, type: :numeric, default: 1, desc: 'Certificate validity expressed in months'
|
11
|
-
|
12
|
-
desc "Description:\n" +
|
13
|
-
" Generate a RSA key and use it to generate a self-signed certificate in the keys path\n" +
|
14
|
-
' WARNING: this generator is ment to be used only for testing purpose.'
|
15
|
-
|
16
|
-
def create_key
|
17
|
-
@key = OpenSSL::PKey::RSA.new options[:size]
|
18
|
-
end
|
19
|
-
|
20
|
-
def create_certificate
|
21
|
-
name = OpenSSL::X509::Name.parse "CN=#{options[:cn]}"
|
22
|
-
sha_alg = OpenSSL::Digest.const_get(options[:digest]).new
|
23
|
-
@cert = OpenSSL::X509::Certificate.new
|
24
|
-
@cert.version = 2
|
25
|
-
@cert.serial = 0
|
26
|
-
@cert.not_before = Time.now
|
27
|
-
@cert.not_after = @cert.not_before + options[:validity].months
|
28
|
-
@cert.public_key = @key.public_key
|
29
|
-
@cert.subject = name
|
30
|
-
@cert.issuer = name
|
31
|
-
@cert.sign @key, sha_alg
|
32
|
-
end
|
33
|
-
|
34
|
-
def write_keys
|
35
|
-
path = './' + Spid::Rails.keys_path
|
36
|
-
create_file path + 'private_key.pem', @key.to_pem
|
37
|
-
create_file path + 'certificate.pem', @cert.to_pem
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# Identity Providers are loaded on a per environment basis
|
2
|
-
|
3
|
-
development:
|
4
|
-
agid_test:
|
5
|
-
metadata_url: https://idp.spid.gov.it:8080/assets/idp-metadata.xml
|
6
|
-
validate_cert: false
|
7
|
-
|
8
|
-
test:
|
9
|
-
local_test:
|
10
|
-
metadata_url: https://localhost:8080/assets/idp-metadata.xml
|
11
|
-
validate_cert: false
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# Necessario override della classe originaria della libreria,
|
2
|
-
# al fine di rendere conforme il nodo Issuer alle regole tecniche SPID,
|
3
|
-
# (aggiunte righe 32 e 33)
|
4
|
-
|
5
|
-
module OneLogin
|
6
|
-
module RubySaml
|
7
|
-
class Authrequest
|
8
|
-
|
9
|
-
def create_xml_document(settings)
|
10
|
-
time = Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
|
11
|
-
|
12
|
-
request_doc = XMLSecurity::Document.new
|
13
|
-
request_doc.uuid = uuid
|
14
|
-
|
15
|
-
root = request_doc.add_element 'samlp:AuthnRequest', { 'xmlns:samlp' => 'urn:oasis:names:tc:SAML:2.0:protocol', 'xmlns:saml' => 'urn:oasis:names:tc:SAML:2.0:assertion' }
|
16
|
-
root.attributes['ID'] = uuid
|
17
|
-
root.attributes['IssueInstant'] = time
|
18
|
-
root.attributes['Version'] = '2.0'
|
19
|
-
root.attributes['Destination'] = settings.idp_sso_target_url unless settings.idp_sso_target_url.nil?
|
20
|
-
root.attributes['IsPassive'] = settings.passive unless settings.passive.nil?
|
21
|
-
root.attributes['ProtocolBinding'] = settings.protocol_binding unless settings.protocol_binding.nil?
|
22
|
-
root.attributes['AttributeConsumingServiceIndex'] = settings.attributes_index unless settings.attributes_index.nil?
|
23
|
-
root.attributes['ForceAuthn'] = settings.force_authn unless settings.force_authn.nil?
|
24
|
-
|
25
|
-
# Conditionally defined elements based on settings
|
26
|
-
if settings.assertion_consumer_service_url != nil
|
27
|
-
root.attributes['AssertionConsumerServiceURL'] = settings.assertion_consumer_service_url
|
28
|
-
end
|
29
|
-
# NameQualifier e Format da requisiti SPID
|
30
|
-
if settings.issuer != nil
|
31
|
-
issuer = root.add_element 'saml:Issuer', {
|
32
|
-
'NameQualifier' => settings.issuer,
|
33
|
-
'Format' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:entity'
|
34
|
-
}
|
35
|
-
issuer.text = settings.issuer
|
36
|
-
end
|
37
|
-
if settings.name_identifier_format != nil
|
38
|
-
root.add_element 'samlp:NameIDPolicy', {
|
39
|
-
# Might want to make AllowCreate a setting?
|
40
|
-
'AllowCreate' => 'true',
|
41
|
-
'Format' => settings.name_identifier_format
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
if settings.authn_context || settings.authn_context_decl_ref
|
46
|
-
|
47
|
-
if settings.authn_context_comparison != nil
|
48
|
-
comparison = settings.authn_context_comparison
|
49
|
-
else
|
50
|
-
comparison = 'exact'
|
51
|
-
end
|
52
|
-
|
53
|
-
requested_context = root.add_element 'samlp:RequestedAuthnContext', {
|
54
|
-
'Comparison' => comparison,
|
55
|
-
}
|
56
|
-
|
57
|
-
if settings.authn_context != nil
|
58
|
-
authn_contexts_class_ref = settings.authn_context.is_a?(Array) ? settings.authn_context : [settings.authn_context]
|
59
|
-
authn_contexts_class_ref.each do |authn_context_class_ref|
|
60
|
-
class_ref = requested_context.add_element 'saml:AuthnContextClassRef'
|
61
|
-
class_ref.text = authn_context_class_ref
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
if settings.authn_context_decl_ref != nil
|
66
|
-
authn_contexts_decl_refs = settings.authn_context_decl_ref.is_a?(Array) ? settings.authn_context_decl_ref : [settings.authn_context_decl_ref]
|
67
|
-
authn_contexts_decl_refs.each do |authn_context_decl_ref|
|
68
|
-
decl_ref = requested_context.add_element 'saml:AuthnContextDeclRef'
|
69
|
-
decl_ref.text = authn_context_decl_ref
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
request_doc
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|