Skip to content

Commit

Permalink
Bump version
Browse files Browse the repository at this point in the history
  • Loading branch information
jsuchal committed Dec 14, 2021
1 parent 5624185 commit cbfa1ef
Show file tree
Hide file tree
Showing 10 changed files with 62 additions and 162 deletions.
4 changes: 2 additions & 2 deletions .env.test.with_upvs_sso
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ UPVS_ENV=dev
SSO_SP_SUBJECT=
SSO_PROXY_SUBJECT=

LOGIN_CALLBACK_URLS=https://example.com/login-callback
LOGOUT_CALLBACK_URLS=https://example.com/logout-callback
LOGIN_CALLBACK_URL=https://example.com/login-callback
LOGOUT_CALLBACK_URL=https://example.com/logout-callback
2 changes: 1 addition & 1 deletion .github/workflows/slovensko_digital_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ jobs:

strategy:
matrix:
upvs_env: [dev, fix]
upvs_env: [fix]
fail-fast: false

steps:
Expand Down
6 changes: 3 additions & 3 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
**Inštalačná príručka popisuje komponent verzie [2.2.1](https://github.com/slovensko-digital/slovensko-sk-api/releases/tag/v2.2.1), uistite sa, že čítate príručku [verzie komponentu](https://github.com/slovensko-digital/slovensko-sk-api/releases), ktorý používate.**
**Inštalačná príručka popisuje komponent verzie [3.0.0](https://github.com/slovensko-digital/slovensko-sk-api/releases/tag/v3.0.0), uistite sa, že čítate príručku [verzie komponentu](https://github.com/slovensko-digital/slovensko-sk-api/releases), ktorý používate.**

# slovensko.sk API - Inštalačná príručka

Expand Down Expand Up @@ -94,8 +94,8 @@ Premenná | Popis | Hodnota
`EFORM_SYNC_SUBJECT` | Subjekt ukazujúci na STS certifikát pre automatickú synchronizáciu eForm formulárov<sup>7</sup> | `{sub}` (potrebná iba pre eForm Sync)
`SSO_SP_SUBJECT` | Subjekt ukazujúci na SP certifikát pre podpisovanie pri autentifikácii cez ÚPVS SSO<sup>8</sup> | `{sub}` (potrebná iba pre ÚPVS SSO)
`SSO_PROXY_SUBJECT` | Subjekt ukazujúci na STS certifikát pre OBO prístup pri autentifikácii cez ÚPVS SSO | `{sub}` (potrebná iba pre ÚPVS SSO)
`LOGIN_CALLBACK_URLS` | Základné URL oddelené čiarkou, na ktoré može byť používateľ presmerovaný po úspešnom prihlásení | bezpečná URL (potrebná iba pre ÚPVS SSO)
`LOGOUT_CALLBACK_URLS` | Základné URL oddelené čiarkou, na ktoré može byť používateľ presmerovaný po úspešnom odhlásení | bezpečná URL (potrebná iba pre ÚPVS SSO)
`LOGIN_CALLBACK_URL` | Základná URL, na ktorú može byť používateľ presmerovaný po úspešnom prihlásení | bezpečná URL (potrebná iba pre ÚPVS SSO)
`LOGOUT_CALLBACK_URL` | Základná URL, na ktorú može byť používateľ presmerovaný po úspešnom odhlásení | bezpečná URL (potrebná iba pre ÚPVS SSO)
`STS_HEALTH_SUBJECT` | Subjekt ukazujúci na STS certifikát pre kontrolu spojenia s ÚPVS STS | `{sub}` (potrebná iba pre STS Health)

<sup>1</sup> [Rails Environment Settings](https://guides.rubyonrails.org/configuring.html#rails-environment-settings)
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/health_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def index
status = :ok
health = {
description: 'slovensko.sk API',
version: '2.2.1',
version: '3.0.0',
status: 'pass',
checks: {
'environment:variables' => environment_variables,
Expand Down Expand Up @@ -44,7 +44,7 @@ def index
def environment_variables(keys = [])
keys += %w(DATABASE_URL REDIS_URL SECRET_KEY_BASE) if Rails.env.production? || Rails.env.staging?
keys += %w(UPVS_KS_SALT UPVS_PK_SALT) if Upvs.env.prod?
keys += %w(SSO_SP_SUBJECT SSO_PROXY_SUBJECT LOGIN_CALLBACK_URLS LOGOUT_CALLBACK_URLS) if UpvsEnvironment.sso_support?
keys += %w(SSO_SP_SUBJECT SSO_PROXY_SUBJECT LOGIN_CALLBACK_URL LOGOUT_CALLBACK_URL) if UpvsEnvironment.sso_support?
unset = keys.select { |v| ENV[v].blank? }
raise "Unset environment variables #{unset.to_sentence}" if unset.any?
{ status: 'pass' }
Expand Down
31 changes: 11 additions & 20 deletions app/controllers/upvs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,23 @@ class UpvsController < ApiController
before_action(only: [:assertion, :identity]) { authenticate(allow_obo_token: true, require_obo_token_scope: action_scope) }

def login
session[:login_callback_url] = fetch_callback_url(Environment.login_callback_urls)

redirect_to '/auth/saml'
end

def callback
response = request.env['omniauth.auth']['extra']['response_object']
token = Environment.obo_token_authenticator.generate_token(response, scopes: Environment.obo_token_scopes)

redirect_to callback_url_with_token(session[:login_callback_url], token)
redirect_to callback_url_with_token(Environment.login_callback_url, token)
end

def logout
if params[:SAMLRequest]
redirect_to "/auth/saml/slo?#{slo_request_params.to_query}"
redirect_to callback_url_with_sp_callback(Environment.logout_callback_url, slo_callback)
elsif params[:SAMLResponse]
redirect_to "/auth/saml/slo?#{slo_response_params(session[:logout_callback_url]).to_query}"
redirect_to "/auth/saml/slo?#{slo_response_params(Environment.logout_callback_url).to_query}"
else
Environment.api_token_authenticator.invalidate_token(authenticity_token, allow_obo_token: true)
session[:logout_callback_url] = fetch_callback_url(Environment.logout_callback_urls)

redirect_to '/auth/saml/spslo'
end
Expand All @@ -39,28 +36,18 @@ def identity
render partial: 'iam/identity', locals: { identity: iam_repository(upvs_identity).identity(obo_subject_id(upvs_identity[:obo])) }
end

include CallbackHelper

CallbackError = Class.new(StandardError)

rescue_from(CallbackError) { |error| render_bad_request(error.message, :callback) }

rescue_from(sk.gov.schemas.identity.service._1_7.GetIdentityFault) { |error| render_bad_request(:invalid, :identity_id, upvs_fault(error)) }

private

def fetch_callback_url(registered_urls)
raise CallbackError, :missing if params[:callback].blank?
raise CallbackError, :invalid if registered_urls.none? { |url| callback_match?(url, params[:callback]) }
params[:callback]
rescue URI::Error
raise CallbackError, :invalid
end

def callback_url_with_token(callback_url, token)
URI(callback_url).tap { |url| url.query = [url.query, "token=#{token}"].compact.join('&') }.to_s
end

def callback_url_with_sp_callback(callback_url, callback)
URI(callback_url).tap { |url| url.query = [url.query, "callback=#{callback}"].compact.join('&') }.to_s
end

def slo_request_params
params.permit(:SAMLRequest, :SigAlg, :Signature)
end
Expand All @@ -69,6 +56,10 @@ def slo_response_params(redirect_url)
params.permit(:SAMLResponse, :SigAlg, :Signature).merge(RelayState: redirect_url)
end

def slo_callback
"#{request.host_with_port}/auth/saml/slo?#{slo_request_params.to_query}"
end

def obo_subject_id(assertion)
Nokogiri::XML(assertion).at_xpath('//saml:Attribute[@Name="SubjectID"]/saml:AttributeValue').content
end
Expand Down
8 changes: 4 additions & 4 deletions app/services/environment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ module Environment
extend self

# TODO move to UpvsEnvironment and rename to #sso_callback_urls, also rename env var to SSO_CALLBACK_URLS as this is only UPVS SSO related configuration
def login_callback_urls
@login_callback_urls ||= ENV.fetch('LOGIN_CALLBACK_URLS').split(',')
def login_callback_url
@login_callback_url ||= ENV.fetch('LOGIN_CALLBACK_URL')
end

# TODO move to UpvsEnvironment and rename to #slo_callback_urls, also rename env var to SLO_CALLBACK_URLS as this is only UPVS SSO related configuration
def logout_callback_urls
@logout_callback_urls ||= ENV.fetch('LOGOUT_CALLBACK_URLS').split(',')
def logout_callback_url
@logout_callback_url ||= ENV.fetch('LOGOUT_CALLBACK_URL')
end

def api_token_authenticator
Expand Down
4 changes: 2 additions & 2 deletions doc/templates/.env.with_upvs_sso
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ UPVS_PK_SALT=
SSO_SP_SUBJECT=
SSO_PROXY_SUBJECT=

LOGIN_CALLBACK_URLS=localhost
LOGOUT_CALLBACK_URLS=localhost
LOGIN_CALLBACK_URL=localhost
LOGOUT_CALLBACK_URL=localhost
32 changes: 9 additions & 23 deletions public/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ openapi: 3.0.0

info:
title: slovensko.sk API
version: 2.2.1 (Komunitná verzia) 7.0.1 (Prémium verzia)
version: 3.0.0 (Komunitná verzia) 8.0.0 (Prémium verzia)

description: |
slovensko.sk API je proxy REST API komponent k službám www.slovensko.sk (Ústredný portál verejnej správy – ÚPVS), pomocou ktorých je možné:
Expand Down Expand Up @@ -46,23 +46,15 @@ paths:
description: |
Prihlási používateľa pomocou slovensko.sk (ÚPVS).
Po úspešnom prihlásení nasleduje presmerovanie späť na callback URL tretej strany.
Po úspešnom prihlásení nasleduje presmerovanie späť na callback URL tretej strany nastavený v premenných prostredia API (LOGIN_CALLBACK_URL).
V parametri `token` bude zaslaný OBO (On-Behalf-Of) token použiteľný na získanie údajov o prihlásenom používateľovi alebo na volanie ďaľších rozhraní v mene prihláseného používateľa.
parameters:
- name: callback
in: query
required: true
description: Callback URL, na ktorú bude používateľ presmerovaný po úspešnom prihlásení. Callback URL musí byť rovnaká ako niektorá z adries nastavených na úrovni API komponentu alebo musí byť rozšírením niektorej z týchto adries.
schema:
type: string
format: url
responses:
302:
description: Úspešné presmerovanie na prihlasovaciu stránku ÚPVS a následne na callback URL tretej strany.
callbacks:
login:
'{$request.query.callback}':
login_callback:
'{$LOGIN_CALLBACK_URL}':
get:
parameters:
- name: token
Expand Down Expand Up @@ -98,21 +90,15 @@ paths:
description: |
Odhlási používateľa pomocou slovensko.sk (ÚPVS).
Po úspešnom odhlásení nasleduje presmerovanie späť na callback URL tretej strany.
parameters:
- name: callback
in: query
required: true
description: Callback URL, na ktorú bude používateľ presmerovaný po úspešnom odhlásení. Callback URL musí byť rovnaká ako niektorá z adries nastavených na úrovni API komponentu alebo musí byť rozšírením niektorej z týchto adries.
schema:
type: string
format: url
Po úspešnom odhlásení nasleduje presmerovanie späť na callback URL tretej strany nastavený v premenných prostredia API (LOGOUT_CALLBACK_URL).
Ak URL obsahuje callback (pri odhlásení iniciovanom zo strany ÚPVS), je potrebné spraviť redirect na callback.
responses:
302:
description: Úspešné presmerovanie na callback URL tretej strany.
callbacks:
logout:
'{$request.query.callback}':
logout_callback:
'{$LOGOUT_CALLBACK_URL}':
get:
responses:
200:
Expand Down
2 changes: 1 addition & 1 deletion spec/requests/health_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def expect_fail(checks)
expect(response.status).to eq(200)
expect(response.object.with_indifferent_access).to match(
description: 'slovensko.sk API',
version: '2.2.1',
version: '3.0.0',
status: 'pass',
checks: hash_including(*checks),
links: {
Expand Down
Loading

0 comments on commit cbfa1ef

Please sign in to comment.