diff --git a/CHANGELOG.md b/CHANGELOG.md index 0293ae5..82ca4ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog ## [Unreleased] +### Added +- Fetch all identity provider from https://registry.spid.gov.it +- Parse and store metadata from single Identity Provider ## [0.2.2] - 2018-07-02 ### Fixed diff --git a/lib/spid.rb b/lib/spid.rb index 19d5e60..e350c24 100644 --- a/lib/spid.rb +++ b/lib/spid.rb @@ -2,7 +2,9 @@ require "spid/authn_request" require "spid/generate_authn_request" +require "spid/identity_providers" require "spid/metadata" +require "spid/idp_metadata" require "spid/version" module Spid # :nodoc: diff --git a/lib/spid/identity_providers.rb b/lib/spid/identity_providers.rb new file mode 100644 index 0000000..56715ae --- /dev/null +++ b/lib/spid/identity_providers.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require "faraday" +require "faraday_middleware" + +module Spid + class IdentityProviders # :nodoc: + def self.fetch_all + new.fetch_all + end + + def fetch_all + spid_idp_entities.map do |idp| + { + name: idp["entity_name"].gsub(/ ID$/, "").downcase, + metadata_url: idp["metadata_url"], + entity_id: idp["entity_id"] + } + end + end + + private + + def spid_idp_entities + return [] if response.body["spidFederationRegistry"].blank? + response.body["spidFederationRegistry"]["entities"] + end + + def response + connection.get do |req| + req.url "/api/identity-providers" + req.headers["Accept"] = "application/json" + end + end + + def connection + Faraday.new("https://registry.spid.gov.it") do |conn| + conn.response :json, content_type: /\bjson$/ + + conn.adapter Faraday.default_adapter + end + end + end +end diff --git a/lib/spid/idp_metadata.rb b/lib/spid/idp_metadata.rb new file mode 100644 index 0000000..4e512ea --- /dev/null +++ b/lib/spid/idp_metadata.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require "singleton" +require "onelogin/ruby-saml/idp_metadata_parser" + +module Spid + class IdpMetadata # :nodoc: + include Singleton + + def initialize + @identity_providers = Spid::IdentityProviders.fetch_all + @metadata = {} + end + + def [](idp_name) + return @metadata[idp_name] if @metadata[idp_name].present? + idp_hash = identity_provider_hash(idp_name) + + @metadata[idp_name] = parser.parse_remote_to_hash( + idp_hash[:metadata_url], + idp_hash[:metadata_url].start_with?("https://") + ) + @metadata[idp_name] + end + + def identity_provider_hash(idp_name) + @identity_providers.find do |idp| + idp[:name] == idp_name.to_s + end + end + + private + + def parser + @parser ||= ::OneLogin::RubySaml::IdpMetadataParser.new + end + end +end diff --git a/spec/cassettes/Spid_IdentityProviders/_fetch_all/returns_an_array_of_identity_providers.yml b/spec/cassettes/Spid_IdentityProviders/_fetch_all/returns_an_array_of_identity_providers.yml new file mode 100644 index 0000000..274dbf2 --- /dev/null +++ b/spec/cassettes/Spid_IdentityProviders/_fetch_all/returns_an_array_of_identity_providers.yml @@ -0,0 +1,113 @@ +--- +http_interactions: +- request: + method: get + uri: https://registry.spid.gov.it/api/identity-providers + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v0.15.2 + Accept: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.10.3 (Ubuntu) + Date: + - Fri, 06 Jul 2018 14:01:51 GMT + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Api-Version: + - '1' + Cache-Control: + - no-cache + Vary: + - accept-encoding + Strict-Transport-Security: + - max-age=15768000; preload + X-Frame-Options: + - DENY + X-Content-Type-Options: + - nosniff + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"spidFederationRegistry":{"totalEntities":8,"date":"06/07/2018 16:01:51","entities":[{"ipa_entity_code":"idp_1","entity_id":"https://identity.infocert.it","entity_name":"Infocert + ID","metadata_url":"https://identity.infocert.it/metadata/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_2","entity_id":"https://posteid.poste.it","entity_name":"Poste + ID","metadata_url":"http://posteid.poste.it/jod-fs/metadata/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_3","entity_id":"https://login.id.tim.it/affwebservices/public/saml2sso","entity_name":"Tim + ID","metadata_url":"https://login.id.tim.it/spid-services/MetadataBrowser/idp","entity_type":"IdP"},{"ipa_entity_code":"idp_4","entity_id":"https://identity.sieltecloud.it","entity_name":"Sielte + ID","metadata_url":"https://identity.sieltecloud.it/simplesaml/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_5","entity_id":"https://loginspid.aruba.it","entity_name":"Aruba + ID","metadata_url":"https://loginspid.aruba.it/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_6","entity_id":"https://idp.namirialtsp.com/idp","entity_name":"Namirial + ID","metadata_url":"https://idp.namirialtsp.com/idp/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_7","entity_id":"https://spid.register.it","entity_name":"SPIDItalia + Register.it","metadata_url":"https://spid.register.it/login/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_8","entity_id":"https://spid.intesa.it","entity_name":"Intesa + ID","metadata_url":"https://spid.intesa.it/metadata/metadata.xml","entity_type":"IdP"}]}}' + http_version: + recorded_at: Fri, 06 Jul 2018 14:01:51 GMT +- request: + method: get + uri: https://registry.spid.gov.it/api/identity-providers + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - Faraday v0.15.2 + Accept: + - application/json + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.10.3 (Ubuntu) + Date: + - Fri, 06 Jul 2018 14:01:51 GMT + Content-Type: + - application/json; charset=utf-8 + Transfer-Encoding: + - chunked + Connection: + - keep-alive + X-Api-Version: + - '1' + Cache-Control: + - no-cache + Vary: + - accept-encoding + Strict-Transport-Security: + - max-age=15768000; preload + X-Frame-Options: + - DENY + X-Content-Type-Options: + - nosniff + X-Xss-Protection: + - 1; mode=block + body: + encoding: ASCII-8BIT + string: '{"spidFederationRegistry":{"totalEntities":8,"date":"06/07/2018 16:01:51","entities":[{"ipa_entity_code":"idp_1","entity_id":"https://identity.infocert.it","entity_name":"Infocert + ID","metadata_url":"https://identity.infocert.it/metadata/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_2","entity_id":"https://posteid.poste.it","entity_name":"Poste + ID","metadata_url":"http://posteid.poste.it/jod-fs/metadata/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_3","entity_id":"https://login.id.tim.it/affwebservices/public/saml2sso","entity_name":"Tim + ID","metadata_url":"https://login.id.tim.it/spid-services/MetadataBrowser/idp","entity_type":"IdP"},{"ipa_entity_code":"idp_4","entity_id":"https://identity.sieltecloud.it","entity_name":"Sielte + ID","metadata_url":"https://identity.sieltecloud.it/simplesaml/metadata.xml","entity_type":"IdP"},{"ipa_entity_code":"idp_5","entity_id":"https://loginspid.aruba.it","entity_name":"Aruba + ID","metadata_url":"https://loginspid.aruba.it/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_6","entity_id":"https://idp.namirialtsp.com/idp","entity_name":"Namirial + ID","metadata_url":"https://idp.namirialtsp.com/idp/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_7","entity_id":"https://spid.register.it","entity_name":"SPIDItalia + Register.it","metadata_url":"https://spid.register.it/login/metadata","entity_type":"IdP"},{"ipa_entity_code":"idp_8","entity_id":"https://spid.intesa.it","entity_name":"Intesa + ID","metadata_url":"https://spid.intesa.it/metadata/metadata.xml","entity_type":"IdP"}]}}' + http_version: + recorded_at: Fri, 06 Jul 2018 14:01:52 GMT +recorded_with: VCR 4.0.0 diff --git a/spec/cassettes/Spid_IdpMetadata/_/returns_metadata_of_selected_provider.yml b/spec/cassettes/Spid_IdpMetadata/_/returns_metadata_of_selected_provider.yml new file mode 100644 index 0000000..f3137df --- /dev/null +++ b/spec/cassettes/Spid_IdpMetadata/_/returns_metadata_of_selected_provider.yml @@ -0,0 +1,47 @@ +--- +http_interactions: +- request: + method: get + uri: https://loginspid.aruba.it/metadata + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Server: + - nginx/1.10.3 + Date: + - Fri, 06 Jul 2018 14:27:12 GMT + Content-Type: + - text/xml + Transfer-Encoding: + - chunked + Connection: + - keep-alive + Cache-Control: + - no-cache + - no-cache, no-store, must-revalidate + Pragma: + - no-cache + - no-cache + Expires: + - "-1" + Content-Disposition: + - inline + body: + encoding: ASCII-8BIT + string: !binary |- + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1kOkVudGl0eURlc2NyaXB0b3IgSUQ9Il84OWMwZmUyYi1jOTMzLTRhODItOGQ0NS1mMWMxYmEwMjIxMjUiIGVudGl0eUlEPSJodHRwczovL2xvZ2luc3BpZC5hcnViYS5pdCIgeG1sbnM6bWQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDptZXRhZGF0YSI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIvPjxkczpSZWZlcmVuY2UgVVJJPSIjXzg5YzBmZTJiLWM5MzMtNGE4Mi04ZDQ1LWYxYzFiYTAyMjEyNSI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+PGRzOkRpZ2VzdFZhbHVlPnBKN1I5dFFvRVl1ZWR1dVE0NWpwMk5Nc2ZUbit2WWJ4ZzZyL3FZalpuZXM9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8+PGRzOlNpZ25hdHVyZVZhbHVlPlZRYStnRVUrbnJ1Wk5OVU1yK01ZN2Zab0Q3TUF5aUhkVlRGOGZVS3lhZjFmTmpGM2dWTEZtSElFUXltRmVWRXpCZjB4SlM3Y1JwRHpFR1RYZFpQSmk2NFU0a3BHWDQ1RXlBbm9RQk9wRy91d053bnJuaGZxck82UjBVQ2w0ZUNvd2JJeEZuRlJBczQ4c3NodU5YWXJtV2prNXJLN0MrdTZZTENSdll5bUVoV202cmg1K1ErMGRyODJlUFA0N0ovcFVkU2JJUUp4dDlEaEZtUDluR2Z4cWQvc1ZubFA0dEd5Zit2dTF1MW5RS1BqL1FwTjQ0RlgrNG5BS0F3Z0kzSm11ekFReWZWMUJJRnNlRG1qRVdhVUpwWVNHalEwYjQ1a0JDSUc4Rk1yS2dnUHpXbTlBRDM2NTYwT2hmUmtrQVNIdk00dVg1NjlMSlFDQ3QxZWQyVU1sUT09PC9kczpTaWduYXR1cmVWYWx1ZT48ZHM6S2V5SW5mbz48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlFeFRDQ0E2MmdBd0lCQWdJUUlIdEV2RWhHTTc3SHdxc3V2U2JpOXpBTkJna3Foa2lHOXcwQkFRc0ZBREJzTVFzd0NRWURWUVFHCkV3SkpWREVZTUJZR0ExVUVDZ3dQUVhKMVltRlFSVU1nVXk1d0xrRXVNU0V3SHdZRFZRUUxEQmhEWlhKMGFXWnBZMkYwYVc5dUlFRjEKZEdodmNtbDBlVUl4SURBZUJnTlZCQU1NRjBGeWRXSmhVRVZESUZNdWNDNUJMaUJPUnlCRFFTQXlNQjRYRFRFM01ERXlNekF3TURBdwpNRm9YRFRJd01ERXlNekl6TlRrMU9Wb3dnYUF4Q3pBSkJnTlZCQVlUQWtsVU1SWXdGQVlEVlFRS0RBMUJjblZpWVNCUVJVTWdjM0JoCk1SRXdEd1lEVlFRTERBaFFjbTlrYjNSMGJ6RVdNQlFHQTFVRUF3d05jR1ZqTG1sMElIQmxZeTVwZERFWk1CY0dBMVVFQlJNUVdGaFkKV0ZoWU1EQllNREJZTURBd1dERVBNQTBHQTFVRUtnd0djR1ZqTG1sME1ROHdEUVlEVlFRRURBWndaV011YVhReEVUQVBCZ05WQkM0VApDREUyTXpRMU16Z3pNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXF0Mm9ISmhjcDAzbDczcCtRWXBFCkorZjNqWVlqMFcwZ29zMFJJdFp4L3c0dnBzaUtCeWdhcUROVldTd2ZvMWFQZFZESVgxM2Y2Mk8rbEJraTI5S1R0K1FXdjVLNlNHSEQKVVhZUG50UmRFUWxpY0lCaDJaMEhmck03ZkRsK3hlSnJNcDFzNGRzU1FBdUI1VEpPbEZacTd4Q1F1dWt5dEdXQlR2amZjTi9vczVhRQpzRWcrUmJ0WkhKUjI2U2JiVWNJcVdiMjdTd2dqLzlqd0srdHZ6TG5QNHc4Rk52RU9yTmZSMFh3VE1OREZyd2JPQ3VXZ3RodjVqTkJzClZaYW9xTndpQS9NeFl0K2dUT01qL281UFdLazhXcG02by83LytsV0FveGgwdjh4OU9rYklpK1lhRnBJeHVDY1Vxc3JKSms2M3gyZ0gKQ2MybnIreWNsWVVoc0tEL0F3SURBUUFCbzRJQkxEQ0NBU2d3RGdZRFZSMFBBUUgvQkFRREFnZUFNQjBHQTFVZERnUVdCQlRLUTMrTgpQR2NYRms4blg5OTR2TVRWcGJhMUV6QkhCZ05WSFNBRVFEQStNRHdHQ3lzR0FRUUJnZWd0QVFFQk1DMHdLd1lJS3dZQkJRVUhBZ0VXCkgyaDBkSEJ6T2k4dlkyRXVZWEoxWW1Gd1pXTXVhWFF2WTNCekxtaDBiV3d3V0FZRFZSMGZCRkV3VHpCTm9FdWdTWVpIYUhSMGNEb3YKTDJOeWJDNWhjblZpWVhCbFl5NXBkQzlCY25WaVlWQkZRMU53UVVObGNuUnBabWxqWVhScGIyNUJkWFJvYjNKcGRIbENMMHhoZEdWegpkRU5TVEM1amNtd3dId1lEVlIwakJCZ3dGb0FVOHY5alFCd1JRdjNNMy9GWjltN29tWWN4UjNrd013WUlLd1lCQlFVSEFRRUVKekFsCk1DTUdDQ3NHQVFVRkJ6QUJoaGRvZEhSd09pOHZiMk56Y0M1aGNuVmlZWEJsWXk1cGREQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUEKbkV3ME51YXNwYnBEakE1d2dnd0Z0ZlF5ZFU2YjNCdzIvS1hQUktTMkpvcUdteDBTWUtqK0wxN0EyS1VCYTJjN2dEdEtYWXowRkxUNgowQnYwcG1CTi9vWUNnVk1FQkpLcXdSd2RraTlZakVCd3lDWndORXgxa0RBeXlxRkVWVTl2dy9PUWZyQWRwN01UYnVaR0ZLa25WdDdiCjl3T1l5L09wOUZpVWFUZzZTdU95MGVwK3JxaGlobHRZTkFBbDRMNmZZNDVtSHZxYTV2dlZHMzBPdkxXL1M0dXZSWVVYWXdZNktoV3YKTmREZjVDbkZ1Z251RVp0SEpyVmU0d3g5YU81R3ZGTEZaL21RMzVDNW1YUFE3bkliMENEZExCSmR6ODJuVW9MU0E1QlViZVhBVWtmYQpoVy9oTHhMZGhrczY4L1RLNjk0eFZJdWlCNDBwdk1tSnd4SXlEQT09PC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PG1kOklEUFNTT0Rlc2NyaXB0b3IgV2FudEF1dGhuUmVxdWVzdHNTaWduZWQ9InRydWUiIHByb3RvY29sU3VwcG9ydEVudW1lcmF0aW9uPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiPjxtZDpLZXlEZXNjcmlwdG9yIHVzZT0ic2lnbmluZyI+PGRzOktleUluZm8geG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUV4VENDQTYyZ0F3SUJBZ0lRSUh0RXZFaEdNNzdId3FzdXZTYmk5ekFOQmdrcWhraUc5dzBCQVFzRkFEQnNNUXN3Q1FZRFZRUUcKRXdKSlZERVlNQllHQTFVRUNnd1BRWEoxWW1GUVJVTWdVeTV3TGtFdU1TRXdId1lEVlFRTERCaERaWEowYVdacFkyRjBhVzl1SUVGMQpkR2h2Y21sMGVVSXhJREFlQmdOVkJBTU1GMEZ5ZFdKaFVFVkRJRk11Y0M1QkxpQk9SeUJEUVNBeU1CNFhEVEUzTURFeU16QXdNREF3Ck1Gb1hEVEl3TURFeU16SXpOVGsxT1Zvd2dhQXhDekFKQmdOVkJBWVRBa2xVTVJZd0ZBWURWUVFLREExQmNuVmlZU0JRUlVNZ2MzQmgKTVJFd0R3WURWUVFMREFoUWNtOWtiM1IwYnpFV01CUUdBMVVFQXd3TmNHVmpMbWwwSUhCbFl5NXBkREVaTUJjR0ExVUVCUk1RV0ZoWQpXRmhZTURCWU1EQllNREF3V0RFUE1BMEdBMVVFS2d3R2NHVmpMbWwwTVE4d0RRWURWUVFFREFad1pXTXVhWFF4RVRBUEJnTlZCQzRUCkNERTJNelExTXpnek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcXQyb0hKaGNwMDNsNzNwK1FZcEUKSitmM2pZWWowVzBnb3MwUkl0WngvdzR2cHNpS0J5Z2FxRE5WV1N3Zm8xYVBkVkRJWDEzZjYyTytsQmtpMjlLVHQrUVd2NUs2U0dIRApVWFlQbnRSZEVRbGljSUJoMlowSGZyTTdmRGwreGVKck1wMXM0ZHNTUUF1QjVUSk9sRlpxN3hDUXV1a3l0R1dCVHZqZmNOL29zNWFFCnNFZytSYnRaSEpSMjZTYmJVY0lxV2IyN1N3Z2ovOWp3Syt0dnpMblA0dzhGTnZFT3JOZlIwWHdUTU5ERnJ3Yk9DdVdndGh2NWpOQnMKVlphb3FOd2lBL014WXQrZ1RPTWovbzVQV0trOFdwbTZvLzcvK2xXQW94aDB2OHg5T2tiSWkrWWFGcEl4dUNjVXFzckpKazYzeDJnSApDYzJucit5Y2xZVWhzS0QvQXdJREFRQUJvNElCTERDQ0FTZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CMEdBMVVkRGdRV0JCVEtRMytOClBHY1hGazhuWDk5NHZNVFZwYmExRXpCSEJnTlZIU0FFUURBK01Ed0dDeXNHQVFRQmdlZ3RBUUVCTUMwd0t3WUlLd1lCQlFVSEFnRVcKSDJoMGRIQnpPaTh2WTJFdVlYSjFZbUZ3WldNdWFYUXZZM0J6TG1oMGJXd3dXQVlEVlIwZkJGRXdUekJOb0V1Z1NZWkhhSFIwY0RvdgpMMk55YkM1aGNuVmlZWEJsWXk1cGRDOUJjblZpWVZCRlExTndRVU5sY25ScFptbGpZWFJwYjI1QmRYUm9iM0pwZEhsQ0wweGhkR1Z6CmRFTlNUQzVqY213d0h3WURWUjBqQkJnd0ZvQVU4djlqUUJ3UlF2M00zL0ZaOW03b21ZY3hSM2t3TXdZSUt3WUJCUVVIQVFFRUp6QWwKTUNNR0NDc0dBUVVGQnpBQmhoZG9kSFJ3T2k4dmIyTnpjQzVoY25WaVlYQmxZeTVwZERBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQQpuRXcwTnVhc3BicERqQTV3Z2d3RnRmUXlkVTZiM0J3Mi9LWFBSS1MySm9xR214MFNZS2orTDE3QTJLVUJhMmM3Z0R0S1hZejBGTFQ2CjBCdjBwbUJOL29ZQ2dWTUVCSktxd1J3ZGtpOVlqRUJ3eUNad05FeDFrREF5eXFGRVZVOXZ3L09RZnJBZHA3TVRidVpHRktrblZ0N2IKOXdPWXkvT3A5RmlVYVRnNlN1T3kwZXArcnFoaWhsdFlOQUFsNEw2Zlk0NW1IdnFhNXZ2VkczME92TFcvUzR1dlJZVVhZd1k2S2hXdgpOZERmNUNuRnVnbnVFWnRISnJWZTR3eDlhTzVHdkZMRlovbVEzNUM1bVhQUTduSWIwQ0RkTEJKZHo4Mm5Vb0xTQTVCVWJlWEFVa2ZhCmhXL2hMeExkaGtzNjgvVEs2OTR4Vkl1aUI0MHB2TW1Kd3hJeURBPT08L2RzOlg1MDlDZXJ0aWZpY2F0ZT48L2RzOlg1MDlEYXRhPjwvZHM6S2V5SW5mbz48L21kOktleURlc2NyaXB0b3I+PG1kOlNpbmdsZUxvZ291dFNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUE9TVCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW5zcGlkLmFydWJhLml0L1NlcnZpY2VMb2dvdXRSZXF1ZXN0Ii8+PG1kOlNpbmdsZUxvZ291dFNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUmVkaXJlY3QiIExvY2F0aW9uPSJodHRwczovL2xvZ2luc3BpZC5hcnViYS5pdC9TZXJ2aWNlTG9nb3V0UmVxdWVzdCIvPjxtZDpOYW1lSURGb3JtYXQ+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50PC9tZDpOYW1lSURGb3JtYXQ+PG1kOlNpbmdsZVNpZ25PblNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUE9TVCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW5zcGlkLmFydWJhLml0L1NlcnZpY2VMb2dpbldlbGNvbWUiLz48bWQ6U2luZ2xlU2lnbk9uU2VydmljZSBCaW5kaW5nPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YmluZGluZ3M6SFRUUC1SZWRpcmVjdCIgTG9jYXRpb249Imh0dHBzOi8vbG9naW5zcGlkLmFydWJhLml0L1NlcnZpY2VMb2dpbldlbGNvbWUiLz48c2FtbDI6QXR0cmlidXRlIEZyaWVuZGx5TmFtZT0iQ29kaWNlIGlkZW50aWZpY2F0aXZvIFNQSUQiIE5hbWU9InNwaWRDb2RlIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJOb21lIiBOYW1lPSJuYW1lIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJDb2dub21lIiBOYW1lPSJmYW1pbHlOYW1lIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJMdW9nbyBkaSBuYXNjaXRhIiBOYW1lPSJwbGFjZU9mQmlydGgiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IlByb3ZpbmNpYSBkaSBuYXNjaXRhIiBOYW1lPSJjb3VudHlPZkJpcnRoIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJEYXRhIGRpIG5hc2NpdGEiIE5hbWU9ImRhdGVPZkJpcnRoIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJTZXNzbyIgTmFtZT0iZ2VuZGVyIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJSYWdpb25lIG8gZGVub21pbmF6aW9uZSBzb2NpYWxlIiBOYW1lPSJjb21wYW55TmFtZSIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iLz48c2FtbDI6QXR0cmlidXRlIEZyaWVuZGx5TmFtZT0iU2VkZSBsZWdhbGUiIE5hbWU9InJlZ2lzdGVyZWRPZmZpY2UiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IkNvZGljZSBmaXNjYWxlIiBOYW1lPSJmaXNjYWxOdW1iZXIiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IlBhcnRpdGEgSVZBIiBOYW1lPSJpdmFDb2RlIiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIvPjxzYW1sMjpBdHRyaWJ1dGUgRnJpZW5kbHlOYW1lPSJEb2N1bWVudG8gZCdpZGVudGl0w6AiIE5hbWU9ImlkQ2FyZCIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iLz48c2FtbDI6QXR0cmlidXRlIEZyaWVuZGx5TmFtZT0iTnVtZXJvIGRpIHRlbGVmb25vIG1vYmlsZSIgTmFtZT0ibW9iaWxlUGhvbmUiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IkluZGlyaXp6byBkaSBwb3N0YSBlbGV0dHJvbmljYSIgTmFtZT0iZW1haWwiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IkRvbWljaWxpbyBmaXNpY28iIE5hbWU9ImFkZHJlc3MiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIi8+PHNhbWwyOkF0dHJpYnV0ZSBGcmllbmRseU5hbWU9IkRhdGEgZGkgc2NhZGVuemEgaWRlbnRpdMOgIiBOYW1lPSJleHBpcmF0aW9uRGF0ZSIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iLz48c2FtbDI6QXR0cmlidXRlIEZyaWVuZGx5TmFtZT0iRG9taWNpbGlvIGRpZ2l0YWxlIiBOYW1lPSJkaWdpdGFsQWRkcmVzcyIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iLz48L21kOklEUFNTT0Rlc2NyaXB0b3I+PG1kOk9yZ2FuaXphdGlvbj48bWQ6T3JnYW5pemF0aW9uTmFtZSB4bWw6bGFuZz0iaXQiPkFydWJhUEVDIFMucC5BLjwvbWQ6T3JnYW5pemF0aW9uTmFtZT48bWQ6T3JnYW5pemF0aW9uRGlzcGxheU5hbWUgeG1sOmxhbmc9Iml0Ij5BcnViYVBFQyBTLnAuQS48L21kOk9yZ2FuaXphdGlvbkRpc3BsYXlOYW1lPjxtZDpPcmdhbml6YXRpb25VUkwgeG1sOmxhbmc9Iml0Ij5odHRwczovL3d3dy5wZWMuaXQvPC9tZDpPcmdhbml6YXRpb25VUkw+PC9tZDpPcmdhbml6YXRpb24+PC9tZDpFbnRpdHlEZXNjcmlwdG9yPg== + http_version: + recorded_at: Fri, 06 Jul 2018 14:27:13 GMT +recorded_with: VCR 4.0.0 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 0957269..e967ed3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -18,11 +18,18 @@ require "bundler/setup" require "spid" require "nokogiri" +require "vcr" Dir[File.join("./spec/support/**/*.rb")].each { |f| require f } ENV["ruby-saml/testing"] = "true" # disable ruby-saml logging +VCR.configure do |c| + c.cassette_library_dir = "spec/cassettes" + c.hook_into :webmock + c.configure_rspec_metadata! +end + RSpec.configure do |config| # Enable flags like --only-failures and --next-failure config.example_status_persistence_file_path = ".rspec_status" diff --git a/spec/spid/identity_providers_spec.rb b/spec/spid/identity_providers_spec.rb new file mode 100644 index 0000000..13ea5f1 --- /dev/null +++ b/spec/spid/identity_providers_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Spid::IdentityProviders do + it { is_expected.to be_a described_class } + + describe ".fetch_all" do + let(:result) { described_class.fetch_all } + + it "returns an array of identity providers", :vcr do + expect(result).to include a_hash_including( + name: "aruba", + entity_id: "https://loginspid.aruba.it", + metadata_url: "https://loginspid.aruba.it/metadata" + ) + end + end +end diff --git a/spec/spid/idp_metadata_spec.rb b/spec/spid/idp_metadata_spec.rb new file mode 100644 index 0000000..c21b054 --- /dev/null +++ b/spec/spid/idp_metadata_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "spec_helper" + +RSpec.describe Spid::IdpMetadata do + subject(:idp_metadata) { described_class.instance } + + before do + allow(Spid::IdentityProviders).to receive(:fetch_all).and_return( + [ + { + name: "aruba", + entity_id: "https://loginspid.aruba.it", + metadata_url: "https://loginspid.aruba.it/metadata" + } + ] + ) + end + + it { is_expected.to be_a described_class } + + describe ".[]" do + it "returns metadata of selected provider", :vcr do + aruba_metadata = idp_metadata[:aruba] + expect(aruba_metadata).to be_a Object + end + + xcontext "providing a non existing identity provider code" + end +end diff --git a/spid.gemspec b/spid.gemspec index 6ecaae6..5665a96 100644 --- a/spid.gemspec +++ b/spid.gemspec @@ -30,10 +30,14 @@ Gem::Specification.new do |spec| spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "bundler-audit", "~> 0" spec.add_development_dependency "coveralls", "~> 0" + spec.add_development_dependency "faraday", "~> 0" + spec.add_development_dependency "faraday_middleware", "~> 0" spec.add_development_dependency "nokogiri", "~> 1.8", ">= 1.8.3" spec.add_development_dependency "pry", "~> 0" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "rspec", "~> 3.0" spec.add_development_dependency "rubocop", "0.57.2" spec.add_development_dependency "rubocop-rspec", "1.27.0" + spec.add_development_dependency "vcr", "~> 4.0", ">= 4.0.0" + spec.add_development_dependency "webmock", "~> 3.4", ">= 3.4.2" end