decidim-suomifi 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +236 -0
- data/Rakefile +17 -0
- data/app/controllers/decidim/suomifi/omniauth_callbacks_controller.rb +267 -0
- data/app/controllers/decidim/suomifi/verification/authorizations_controller.rb +19 -0
- data/config/locales/en.yml +21 -0
- data/config/locales/fi.yml +20 -0
- data/config/locales/sv.yml +20 -0
- data/lib/decidim/suomifi.rb +141 -0
- data/lib/decidim/suomifi/engine.rb +101 -0
- data/lib/decidim/suomifi/mail_interceptors.rb +9 -0
- data/lib/decidim/suomifi/mail_interceptors/generated_recipients_interceptor.rb +25 -0
- data/lib/decidim/suomifi/test/cert_store.rb +26 -0
- data/lib/decidim/suomifi/test/runtime.rb +48 -0
- data/lib/decidim/suomifi/verification.rb +5 -0
- data/lib/decidim/suomifi/verification/engine.rb +43 -0
- data/lib/decidim/suomifi/verification/manager.rb +17 -0
- data/lib/decidim/suomifi/verification/metadata_collector.rb +110 -0
- data/lib/decidim/suomifi/version.rb +8 -0
- data/lib/generators/decidim/suomifi/install_generator.rb +135 -0
- data/lib/generators/templates/suomifi_initializer.rb +15 -0
- data/lib/generators/templates/suomifi_initializer_test.rb +3 -0
- data/lib/generators/templates/suomifi_localhost.crt +21 -0
- data/lib/generators/templates/suomifi_localhost.key +28 -0
- metadata +137 -0
data/README.md
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
# Decidim::Suomifi
|
2
|
+
|
3
|
+
[](https://travis-ci.com/mainio/decidim-module-suomifi)
|
4
|
+
[](https://codecov.io/gh/mainio/decidim-module-suomifi)
|
5
|
+
|
6
|
+
A [Decidim](https://github.com/decidim/decidim) module to add Suomi.fi
|
7
|
+
strong authentication to Decidim as a way to authenticate and authorize the
|
8
|
+
users.
|
9
|
+
|
10
|
+
The gem has been developed by [Mainio Tech](https://www.mainiotech.fi/).
|
11
|
+
|
12
|
+
The development has been sponsored by the
|
13
|
+
[City of Helsinki](https://www.hel.fi/).
|
14
|
+
|
15
|
+
The Population Register Centre (VRK) or the Suomi.fi maintainers are not related
|
16
|
+
to this gem in any way, nor do they provide technical support for it. Please
|
17
|
+
contact the gem maintainers in case you find any issues with it.
|
18
|
+
|
19
|
+
## Preparation
|
20
|
+
|
21
|
+
Please refer to the
|
22
|
+
[`omniauth-suomifi`](https://github.com/mainio/omniauth-suomifi) documentation
|
23
|
+
in order to learn more about the preparation and getting started with Suomi.fi.
|
24
|
+
|
25
|
+
## Installation
|
26
|
+
|
27
|
+
Add this line to your application's Gemfile:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
gem "decidim-suomifi"
|
31
|
+
```
|
32
|
+
|
33
|
+
And then execute:
|
34
|
+
|
35
|
+
```bash
|
36
|
+
$ bundle
|
37
|
+
```
|
38
|
+
|
39
|
+
After installation, you can add the initializer running the following command:
|
40
|
+
|
41
|
+
```bash
|
42
|
+
$ bundle exec rails generate decidim:suomifi:install
|
43
|
+
```
|
44
|
+
|
45
|
+
You need to set the following configuration options inside the initializer:
|
46
|
+
|
47
|
+
- `:scope_of_data` - The scope of data for Suomi.fi
|
48
|
+
* Default: `:medium_extensive`
|
49
|
+
* `:limited` - Limited scope (name and personal identity number)
|
50
|
+
* `:medium_extensive` - Medium extensive scope (limted + address information)
|
51
|
+
* `:extensive` - Extensive scope (medium extensive + Finnish citizenship
|
52
|
+
information)
|
53
|
+
- `:sp_entity_id` - The service provider entity ID, i.e. your applications
|
54
|
+
entity ID used to identify the service at the Suomi.fi SAML identity provider.
|
55
|
+
* Set this to the same ID that you use for the metadata sent to Suomi.fi.
|
56
|
+
* Default: depends on the application's URL, e.g.
|
57
|
+
`https://www.example.org/users/auth/suomifi/metadata`
|
58
|
+
- `:certificate_file` - Path to the local certificate included in the metadata
|
59
|
+
sent to Suomi.fi.
|
60
|
+
- `:private_key_file` - Path to the local private key (corresponding to the
|
61
|
+
certificate). Will be used to decrypt messages coming from Suomi.fi.
|
62
|
+
- `:auto_email_domain` - Defines the auto-email domain in case the user's domain
|
63
|
+
is not stored at Suomi.fi. In case this is not set (default), emails will not
|
64
|
+
be auto-generated and users will need to enter them manually in case Suomi.fi
|
65
|
+
does not report them.
|
66
|
+
* The auto-generated email format is similar to the following string:
|
67
|
+
`suomifi-756be91097ac490961fd04f121cb9550@example.org`. The email will
|
68
|
+
always have the `suomifi-` prefix and the domain part is defined by the
|
69
|
+
configuration option.
|
70
|
+
|
71
|
+
For more information about these options and possible other options, please
|
72
|
+
refer to the [`omniauth-suomifi`](https://github.com/mainio/omniauth-suomifi)
|
73
|
+
documentation.
|
74
|
+
|
75
|
+
Note that you will also need to generate a private key and a corresponding
|
76
|
+
certificate and configure them inside the generated initializer. For the testing
|
77
|
+
environment you can create a self signed certificate e.g. with the following
|
78
|
+
command:
|
79
|
+
|
80
|
+
```bash
|
81
|
+
$ mkdir config/cert
|
82
|
+
$ cd config/cert
|
83
|
+
$ openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 \
|
84
|
+
-keyout suomifi.key -out suomifi.crt
|
85
|
+
```
|
86
|
+
|
87
|
+
For the production environment you will need an actual certificate signed by
|
88
|
+
a trusted CA. The self signed certificate can be used for the Suomi.fi test
|
89
|
+
environment.
|
90
|
+
|
91
|
+
The install generator will also enable the Suomi.fi authentication method for
|
92
|
+
OmniAuth by default by adding these lines your `config/secrets.yml`:
|
93
|
+
|
94
|
+
```yml
|
95
|
+
default: &default
|
96
|
+
# ...
|
97
|
+
omniauth:
|
98
|
+
# ...
|
99
|
+
suomifi:
|
100
|
+
enabled: false
|
101
|
+
icon: globe
|
102
|
+
development:
|
103
|
+
# ...
|
104
|
+
omniauth:
|
105
|
+
# ...
|
106
|
+
suomifi:
|
107
|
+
enabled: true
|
108
|
+
mode: test
|
109
|
+
icon: globe
|
110
|
+
```
|
111
|
+
|
112
|
+
This will enable the Suomi.fi authentication for the development environment
|
113
|
+
only. In case you want to enable it for other environments as well, apply the
|
114
|
+
OmniAuth configuration keys accordingly to other environments as well.
|
115
|
+
|
116
|
+
The development environment is hooking into the Suomi.fi testing endpoints by
|
117
|
+
default which is defined by the `mode: test` option in the OmniAuth
|
118
|
+
configuration. For environments that you want to hook into the Suomi.fi
|
119
|
+
production environment, you can omit this configuration option completely.
|
120
|
+
|
121
|
+
The example configuration will set the `globe` icon for the the authentication
|
122
|
+
button from the Decidim's own iconset. In case you want to have a better and
|
123
|
+
more formal styling for the sign in button, you will need to customize the sign
|
124
|
+
in / sign up views.
|
125
|
+
|
126
|
+
## Usage
|
127
|
+
|
128
|
+
After the installation steps, you will need to enable the Suomi.fi authorization
|
129
|
+
from Decidim's system management panel. After enabled, you can start using it.
|
130
|
+
|
131
|
+
This gem also provides a Suomi.fi sign in method which will automatically
|
132
|
+
authorize the user accounts. In case the users already have an account, they
|
133
|
+
can still authorize themselves using the Suomi.fi authorization.
|
134
|
+
|
135
|
+
## Customization
|
136
|
+
|
137
|
+
For some specific needs, you may need to store extra metadata for the Suomi.fi
|
138
|
+
authorization or add new authorization configuration options for the
|
139
|
+
authorization.
|
140
|
+
|
141
|
+
This can be achieved by applying the following configuration to the module
|
142
|
+
inside the initializer described above:
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
# config/initializers/suomifi.rb
|
146
|
+
|
147
|
+
Decidim::Suomifi.configure do |config|
|
148
|
+
# ... keep the default configuration as is ...
|
149
|
+
# Add this extra configuration:
|
150
|
+
config.workflow_configurator = lambda do |workflow|
|
151
|
+
# When expiration is set to 0 minutes, it will never expire.
|
152
|
+
workflow.expires_in = 0.minutes
|
153
|
+
workflow.action_authorizer = "CustomSuomifiActionAuthorizer"
|
154
|
+
workflow.options do |options|
|
155
|
+
options.attribute :custom_option, type: :string, required: false
|
156
|
+
end
|
157
|
+
end
|
158
|
+
config.metadata_collector_class = CustomSuomifiMetadataCollector
|
159
|
+
end
|
160
|
+
```
|
161
|
+
|
162
|
+
For the workflow configuration options, please refer to the
|
163
|
+
[decidim-verifications documentation](https://github.com/decidim/decidim/tree/master/decidim-verifications).
|
164
|
+
|
165
|
+
For the custom metadata collector, please extend the default class as follows:
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
# frozen_string_literal: true
|
169
|
+
|
170
|
+
class CustomSuomifiMetadataCollector < Decidim::Suomifi::Verification::MetadataCollector
|
171
|
+
def metadata
|
172
|
+
base = super
|
173
|
+
|
174
|
+
base.tap do |data|
|
175
|
+
# You can access the SAML attributes using the `saml_attributes` accessor:
|
176
|
+
postal_code = saml_attributes[:permanent_domestic_address_postal_code]
|
177
|
+
|
178
|
+
# Or you can access the base attributes already defined through the
|
179
|
+
# default metadata collector:
|
180
|
+
postal_code = base[:postal_code]
|
181
|
+
|
182
|
+
unless postal_code.blank?
|
183
|
+
# This will actually add the data to the user's authorization metadata
|
184
|
+
# hash.
|
185
|
+
data[:extra] = "Custom data for: #{postal_code}"
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
```
|
191
|
+
|
192
|
+
## Contributing
|
193
|
+
|
194
|
+
See [Decidim](https://github.com/decidim/decidim).
|
195
|
+
|
196
|
+
### Testing
|
197
|
+
|
198
|
+
To run the tests run the following in the gem development path:
|
199
|
+
|
200
|
+
```bash
|
201
|
+
$ bundle
|
202
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bundle exec rake test_app
|
203
|
+
$ DATABASE_USERNAME=<username> DATABASE_PASSWORD=<password> bundle exec rspec
|
204
|
+
```
|
205
|
+
|
206
|
+
Note that the database user has to have rights to create and drop a database in
|
207
|
+
order to create the dummy test app database.
|
208
|
+
|
209
|
+
In case you are using [rbenv](https://github.com/rbenv/rbenv) and have the
|
210
|
+
[rbenv-vars](https://github.com/rbenv/rbenv-vars) plugin installed for it, you
|
211
|
+
can add these environment variables to the root directory of the project in a
|
212
|
+
file named `.rbenv-vars`. In this case, you can omit defining these in the
|
213
|
+
commands shown above.
|
214
|
+
|
215
|
+
### Test code coverage
|
216
|
+
|
217
|
+
If you want to generate the code coverage report for the tests, you can use
|
218
|
+
the `SIMPLECOV=1` environment variable in the rspec command as follows:
|
219
|
+
|
220
|
+
```bash
|
221
|
+
$ SIMPLECOV=1 bundle exec rspec
|
222
|
+
```
|
223
|
+
|
224
|
+
This will generate a folder named `coverage` in the project root which contains
|
225
|
+
the code coverage report.
|
226
|
+
|
227
|
+
### Localization
|
228
|
+
|
229
|
+
If you would like to see this module in your own language, you can help with its
|
230
|
+
translation at Crowdin:
|
231
|
+
|
232
|
+
https://crowdin.com/project/decidim-suomifi
|
233
|
+
|
234
|
+
## License
|
235
|
+
|
236
|
+
See [LICENSE-AGPLv3.txt](LICENSE-AGPLv3.txt).
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "decidim/dev/common_rake"
|
4
|
+
|
5
|
+
desc "Generates a dummy app for testing"
|
6
|
+
task test_app: "decidim:generate_external_test_app" do
|
7
|
+
Dir.chdir("spec/decidim_dummy_app") do
|
8
|
+
system("bundle exec rails generate decidim:suomifi:install --test-initializer true")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Generates a development app."
|
13
|
+
task development_app: "decidim:generate_external_development_app" do
|
14
|
+
Dir.chdir("development_app") do
|
15
|
+
system("bundle exec rails generate decidim:suomifi:install --dummy-cert true")
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,267 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Suomifi
|
5
|
+
class OmniauthCallbacksController < ::Decidim::Devise::OmniauthRegistrationsController
|
6
|
+
# Make the view helpers available needed in the views
|
7
|
+
helper Decidim::Suomifi::Engine.routes.url_helpers
|
8
|
+
helper_method :omniauth_registrations_path
|
9
|
+
|
10
|
+
skip_before_action :verify_authenticity_token, only: [:suomifi, :failure]
|
11
|
+
skip_after_action :verify_same_origin_request, only: [:suomifi, :failure]
|
12
|
+
|
13
|
+
# This is called always after the user returns from the authentication
|
14
|
+
# flow from the Suomi.fi identity provider.
|
15
|
+
def suomifi
|
16
|
+
if user_signed_in?
|
17
|
+
# The user is most likely returning from an authorization request
|
18
|
+
# because they are already signed in. In this case, add the
|
19
|
+
# authorization and redirect the user back to the authorizations view.
|
20
|
+
|
21
|
+
# Make sure the user has an identity created in order to aid future
|
22
|
+
# Suomi.fi sign ins.
|
23
|
+
identity = current_user.identities.find_by(
|
24
|
+
organization: current_organization,
|
25
|
+
provider: oauth_data[:provider],
|
26
|
+
uid: user_identifier
|
27
|
+
)
|
28
|
+
unless identity
|
29
|
+
# Check that the identity is not already bound to another user.
|
30
|
+
id = Decidim::Identity.find_by(
|
31
|
+
organization: current_organization,
|
32
|
+
provider: oauth_data[:provider],
|
33
|
+
uid: user_identifier
|
34
|
+
)
|
35
|
+
return fail_authorize(:identity_bound_to_other_user) if id
|
36
|
+
|
37
|
+
current_user.identities.create!(
|
38
|
+
organization: current_organization,
|
39
|
+
provider: oauth_data[:provider],
|
40
|
+
uid: user_identifier
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Add the authorization for the user
|
45
|
+
return fail_authorize unless authorize_user(current_user)
|
46
|
+
|
47
|
+
# Show the success message and redirect back to the authorizations
|
48
|
+
flash[:notice] = t(
|
49
|
+
"authorizations.create.success",
|
50
|
+
scope: "decidim.suomifi.verification"
|
51
|
+
)
|
52
|
+
return redirect_to(
|
53
|
+
stored_location_for(resource || :user) ||
|
54
|
+
decidim_verifications.authorizations_path
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Normal authentication request, proceed with Decidim's internal logic.
|
59
|
+
send(:create)
|
60
|
+
end
|
61
|
+
|
62
|
+
def failure
|
63
|
+
strategy = failed_strategy
|
64
|
+
saml_response = strategy.response_object if strategy
|
65
|
+
return super unless saml_response
|
66
|
+
|
67
|
+
# In case we want more info about the returned status codes, use the
|
68
|
+
# code below.
|
69
|
+
#
|
70
|
+
# Status codes:
|
71
|
+
# Requester = A problem with the request OR the user cancelled the
|
72
|
+
# request at the identity provider.
|
73
|
+
# Responder = The handling of the request failed.
|
74
|
+
# VersionMismatch = Wrong version in the request.
|
75
|
+
#
|
76
|
+
# Additional state codes:
|
77
|
+
# AuthnFailed = The authentication failed OR the user cancelled
|
78
|
+
# the process at the identity provider.
|
79
|
+
# RequestDenied = The authenticating endpoint (which the
|
80
|
+
# identity provider redirects to) rejected the
|
81
|
+
# authentication.
|
82
|
+
# if !saml_response.send(:validate_success_status) && !saml_response.status_code.nil?
|
83
|
+
# codes = saml_response.status_code.split(" | ").map do |full_code|
|
84
|
+
# full_code.split(":").last
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
|
88
|
+
# Some extra validation checks
|
89
|
+
validations = [
|
90
|
+
# The success status validation fails in case the response status
|
91
|
+
# code is something else than "Success". This is most likely because
|
92
|
+
# of one the reasons explained above. In general there are few
|
93
|
+
# possible explanations for this:
|
94
|
+
# 1. The user cancelled the request and returned to the service.
|
95
|
+
# 2. The underlying identity service the IdP redirects to rejected
|
96
|
+
# the request for one reason or another. E.g. the user cancelled
|
97
|
+
# the request at the identity service.
|
98
|
+
# 3. There is some technical problem with the identity provider
|
99
|
+
# service or the XML request sent to there is malformed.
|
100
|
+
:success_status,
|
101
|
+
# Checks if the local session should be expired, i.e. if the user
|
102
|
+
# took too long time to go through the authorization endpoint.
|
103
|
+
:session_expiration,
|
104
|
+
# The NotBefore and NotOnOrAfter conditions failed, i.e. whether the
|
105
|
+
# request is handled within the allowed timeframe by the IdP.
|
106
|
+
:conditions
|
107
|
+
]
|
108
|
+
validations.each do |key|
|
109
|
+
next if saml_response.send("validate_#{key}")
|
110
|
+
|
111
|
+
flash[:alert] = t(".#{key}")
|
112
|
+
return redirect_to after_omniauth_failure_path_for(resource_name)
|
113
|
+
end
|
114
|
+
|
115
|
+
super
|
116
|
+
end
|
117
|
+
|
118
|
+
# This is overridden method from the Devise controller helpers
|
119
|
+
# This is called when the user is successfully authenticated which means
|
120
|
+
# that we also need to add the authorization for the user automatically
|
121
|
+
# because a succesful Suomi.fi authentication means the user has been
|
122
|
+
# successfully authorized as well.
|
123
|
+
def sign_in_and_redirect(resource_or_scope, *args)
|
124
|
+
# Add authorization for the user
|
125
|
+
if resource_or_scope.is_a?(::Decidim::User)
|
126
|
+
return fail_authorize unless authorize_user(resource_or_scope)
|
127
|
+
end
|
128
|
+
|
129
|
+
super
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def authorize_user(user)
|
135
|
+
authorization = Decidim::Authorization.find_by(
|
136
|
+
name: "suomifi_eid",
|
137
|
+
unique_id: user_signature
|
138
|
+
)
|
139
|
+
if authorization
|
140
|
+
return nil if authorization.user != user
|
141
|
+
else
|
142
|
+
authorization = Decidim::Authorization.find_or_initialize_by(
|
143
|
+
name: "suomifi_eid",
|
144
|
+
user: user
|
145
|
+
)
|
146
|
+
end
|
147
|
+
|
148
|
+
authorization.attributes = {
|
149
|
+
unique_id: user_signature,
|
150
|
+
metadata: authorization_metadata
|
151
|
+
}
|
152
|
+
authorization.save!
|
153
|
+
|
154
|
+
# This will update the "granted_at" timestamp of the authorization which
|
155
|
+
# will postpone expiration on re-authorizations in case the
|
156
|
+
# authorization is set to expire (by default it will not expire).
|
157
|
+
authorization.grant!
|
158
|
+
|
159
|
+
authorization
|
160
|
+
end
|
161
|
+
|
162
|
+
def fail_authorize(failure_message_key = :already_authorized)
|
163
|
+
flash[:alert] = t(
|
164
|
+
"failure.#{failure_message_key}",
|
165
|
+
scope: "decidim.suomifi.omniauth_callbacks"
|
166
|
+
)
|
167
|
+
redirect_to stored_location_for(resource || :user) || decidim.root_path
|
168
|
+
end
|
169
|
+
|
170
|
+
# Data that is stored against the authorization "permanently" (i.e. as
|
171
|
+
# long as the authorization is valid).
|
172
|
+
def authorization_metadata
|
173
|
+
metadata_collector.metadata
|
174
|
+
end
|
175
|
+
|
176
|
+
# Needs to be specifically defined because the core engine routes are not
|
177
|
+
# all properly loaded for the view and this helper method is needed for
|
178
|
+
# defining the omniauth registration form's submit path.
|
179
|
+
def omniauth_registrations_path(resource)
|
180
|
+
Decidim::Core::Engine.routes.url_helpers.omniauth_registrations_path(resource)
|
181
|
+
end
|
182
|
+
|
183
|
+
# Private: Create form params from omniauth hash
|
184
|
+
# Since we are using trusted omniauth data we are generating a valid signature.
|
185
|
+
def user_params_from_oauth_hash
|
186
|
+
return nil if oauth_data.empty?
|
187
|
+
return nil if saml_attributes.empty?
|
188
|
+
return nil if user_identifier.blank?
|
189
|
+
|
190
|
+
{
|
191
|
+
provider: oauth_data[:provider],
|
192
|
+
uid: user_identifier,
|
193
|
+
name: user_full_name,
|
194
|
+
# The nickname is automatically "parametrized" by Decidim core from
|
195
|
+
# the name string, i.e. it will be in correct format.
|
196
|
+
nickname: user_full_name,
|
197
|
+
oauth_signature: user_signature,
|
198
|
+
avatar_url: oauth_data[:info][:image],
|
199
|
+
raw_data: oauth_hash
|
200
|
+
}
|
201
|
+
end
|
202
|
+
|
203
|
+
def user_full_name
|
204
|
+
return oauth_data[:info][:name] if oauth_data[:info][:name]
|
205
|
+
|
206
|
+
@user_full_name ||= begin
|
207
|
+
first_name = begin
|
208
|
+
saml_attributes[:given_name] ||
|
209
|
+
saml_attributes[:first_names] ||
|
210
|
+
saml_attributes[:eidas_first_names]
|
211
|
+
end
|
212
|
+
last_name = begin
|
213
|
+
saml_attributes[:last_name] ||
|
214
|
+
saml_attributes[:eidas_family_name]
|
215
|
+
end
|
216
|
+
|
217
|
+
"#{first_name} #{last_name}"
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def user_signature
|
222
|
+
@user_signature ||= OmniauthRegistrationForm.create_signature(
|
223
|
+
oauth_data[:provider],
|
224
|
+
user_identifier
|
225
|
+
)
|
226
|
+
end
|
227
|
+
|
228
|
+
# See the omniauth-suomi gem's notes about the UID. It should be always
|
229
|
+
# unique per person as long as it can be determined from the user's data.
|
230
|
+
# This consists of one of the following in this order:
|
231
|
+
# - The person's electronic identifier (SATU ID, sähköinen asiointitunnus)
|
232
|
+
# - The person's personal identifier (HETU ID, henkilötunnus) in hashed
|
233
|
+
# format
|
234
|
+
# - The person's eIDAS personal identifier (eIDAS PID) in hashed format
|
235
|
+
# - The SAML NameID in the SAML response in case no unique personal data
|
236
|
+
# is available as defined above
|
237
|
+
def user_identifier
|
238
|
+
@user_identifier ||= oauth_data[:uid]
|
239
|
+
end
|
240
|
+
|
241
|
+
def person_identifier_digest
|
242
|
+
metadata_collector.person_identifier_digest
|
243
|
+
end
|
244
|
+
|
245
|
+
def metadata_collector
|
246
|
+
@metadata_collector ||= Decidim::Suomifi::Verification::Manager.metadata_collector_for(
|
247
|
+
saml_attributes
|
248
|
+
)
|
249
|
+
end
|
250
|
+
|
251
|
+
def verified_email
|
252
|
+
@verified_email ||= begin
|
253
|
+
if saml_attributes[:email]
|
254
|
+
saml_attributes[:email]
|
255
|
+
elsif Decidim::Suomifi.auto_email_domain
|
256
|
+
domain = Decidim::Suomifi.auto_email_domain
|
257
|
+
"suomifi-#{person_identifier_digest}@#{domain}"
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def saml_attributes
|
263
|
+
@saml_attributes ||= oauth_hash[:extra][:saml_attributes]
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|