spid-rails 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|