From cccaa24fcb76d3f4f7e6ea43f5e674276a21736f Mon Sep 17 00:00:00 2001 From: Mario Perrotta Date: Thu, 20 Jun 2024 12:08:19 +0200 Subject: [PATCH] feat: add qeea router --- .../features/it-wallet/qeea/authorize.ts | 0 .../features/it-wallet/qeea/callback.ts | 2 + .../features/it-wallet/qeea/credential.ts | 15 ++ src/payloads/features/it-wallet/qeea/par.ts | 17 +++ src/payloads/features/it-wallet/qeea/rp.ts | 2 + src/payloads/features/it-wallet/qeea/token.ts | 16 +++ .../features/it-wallet/qeea/well-known.ts | 2 + src/routers/features/it-wallet/qeea/index.ts | 130 ++++++++++++++++++ 8 files changed, 184 insertions(+) create mode 100644 src/payloads/features/it-wallet/qeea/authorize.ts create mode 100644 src/payloads/features/it-wallet/qeea/callback.ts create mode 100644 src/payloads/features/it-wallet/qeea/credential.ts create mode 100644 src/payloads/features/it-wallet/qeea/par.ts create mode 100644 src/payloads/features/it-wallet/qeea/rp.ts create mode 100644 src/payloads/features/it-wallet/qeea/token.ts create mode 100644 src/payloads/features/it-wallet/qeea/well-known.ts create mode 100644 src/routers/features/it-wallet/qeea/index.ts diff --git a/src/payloads/features/it-wallet/qeea/authorize.ts b/src/payloads/features/it-wallet/qeea/authorize.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/payloads/features/it-wallet/qeea/callback.ts b/src/payloads/features/it-wallet/qeea/callback.ts new file mode 100644 index 00000000..8f6b8de8 --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/callback.ts @@ -0,0 +1,2 @@ +export const CALLBACK_RESPONSE = + 'Submit This Form
'; diff --git a/src/payloads/features/it-wallet/qeea/credential.ts b/src/payloads/features/it-wallet/qeea/credential.ts new file mode 100644 index 00000000..9a46102f --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/credential.ts @@ -0,0 +1,15 @@ +import { CredentialResponse } from "../../../../../generated/definitions/itwallet/qeea/CredentialResponse"; +import { StatusResponse } from "../../../../../generated/definitions/itwallet/qeea/StatusResponse"; + +export const CREDENTIAL_RESPONSE: CredentialResponse = { + format: "vc+sd-jwt", + credential: + "eyJ0eXAiOiJ2YytzZC1qd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6ImM5NTBjMGU2ZmRlYjVkZTUwYTUwMDk2YjI0N2FmMDNjIn0.eyJfc2QiOlsiMFVzX2h1eE5OcFQ4SG5RRjVxQ1FpZGtzNHk5UXZVY01UMWt5VFZSUHJqZyIsImlUN2NzemFkM3dlZ1BSaDFNRVlRYUx0c0FVaFZsTFJqWVNLeUZXWnNqT2siLCI5bWpiVm1TQXFoQXZmOERkVVlmSWR0ZlRadHFnYzB1aTduQXVZV254N3UwIiwiTDZuTE9mVTZ2bWhoMks1U0wybVB3ZkRPRHB5TF85RGV6SDk4R2RacF91ayIsImNQUzVBek9pWEdpd2lqeF80ckpVVWV0TlpwSHNHT04wVGh2WmVuSmk4WjAiLCJlVktMZGZWU2gwaHgwM2lmaEhFLUVkZFRQVEpWRmlDRUZKbVVnUjhCbHJrIl0sImV4cCI6MTc0NjUxNTk3MiwiaXNzIjoiaHR0cHM6Ly9laWQtcHJvdmlkZXIud2FsbGV0LmlwenMuaXQiLCJzdWIiOiJOemJMc1hoOHVEQ2NkN25vV1hGWkFmSGt4WnNSR0M5WHMiLCJzdGF0dXMiOnsic3RhdHVzX2F0dGVzdGF0aW9uIjp7ImNyZWRlbnRpYWxfaGFzaF9hbGciOiJzaGEtMjU2In19LCJ2Y3QiOiJQZXJzb25JZGVudGlmaWNhdGlvbkRhdGEiLCJfc2RfYWxnIjoic2hhLTI1NiIsImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJwVlUzamF0dTRhM3RrOWM5YW93VmdMeUJCX3JKN00tM1dsamsxZWpVejJFIiwieSI6IlRMNU9OdlItSWdhcm5ncno1amR2c3BvZmZ6RndjalBSdEZVa2VuZUhFSTAifX19.EFko2YBVNGEIp2vupN9GuHaN15jpNhj0bIVTkewpbfEO-MHxHZTYSimTMMUQLMZUvDsp_47zuF90kmWifrOViQ~WyJScG9USnZ2bGw1aXhHU2MyYThqemZ3IiwiaWF0IiwiMTc0NzExOTU5NSJd~WyJOR0cxZkZGZjY1SzFLcU4tYUN1SmZnIiwiZ2l2ZW5fbmFtZSIsIk1hcmlvIl0~WyJ5NU54LTlyRGlmNVpqWDBMa0RJUGhRIiwiZmFtaWx5X25hbWUiLCJSb3NzaSJd~WyJtVW16VV9aejY1Y19iZ0hvSEx4OGp3IiwiYmlydGhfZGF0ZSIsIjE5ODAtMDEtMTAiXQ~WyI4MW1NTFhIcXZWOFRqUFdVOE5Lc1lRIiwidW5pcXVlX2lkIiwieHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Il0~WyJPX2JibDE0bjFmWDZVRHlxYnljMFZnIiwidGF4X2lkX2NvZGUiLCJSU1NNUkE4MFIwMUg1MDFCIl0", + c_nonce: "zz_EtUQs0ieiIS1NYNBHEQSoy3ct4gpy-45TKwHilfg", + c_nonce_expires_in: 86400 +}; + +export const STATUS_RESPONSE: StatusResponse = { + status_attestation: + "ewogICAgImFsZyI6ICJFUzI1NiIsCiAgICAidHlwIjogInN0YXR1cy1hdHRlc3RhdGlvbitqd3QiLAogICAgImtpZCI6ICJlTk4tZzVpNkNuTEtjbHRRQnA2YWJiaW9HTWJ6TTZtdVczdnV4dzZ1aDg4Igp9.ewogICAgImlzcyI6ICJld29nSUNBZ0ltTnVaaUk2SUhzS0lDQWdJQ0FnSUNBaWFuZHJJam9nZXdvZ0lDQWdJQ0FnSUNBZ0lDQWlhM1I1SWpvZ0lrVkRJaXdLSUNBZ0lDQWdJQ0FnSUNBZ0ltTnlkaUk2SUNKUUxUSTFOaUlzQ2lBZ0lDQWdJQ0FnSUNBZ0lDSjRJam9nSWxSRFFVVlNNVGxhZG5VelQwaEdOR28wVnpSMlpsTldiMGhKVURGSlRHbHNSR3h6TjNaRFpVZGxiV01pTEFvZ0lDQWdJQ0FnSUNBZ0lDQWllU0k2SUNKYWVHcHBWMWRpV2sxUlIwaFdWMHRXVVRSb1lsTkphWEp6Vm1aMVpXTkRSVFowTkdwVU9VWXlTRnBSSWdvZ0lDQWdJQ0FnSUgwS0lDQWdJSDBLZlEiLAogICAgImlhdCI6IDE1MDQ2OTkxMzYsCiAgICAiZXhwIjogMTUwNDcwMDEzNiwKICAgICJjcmVkZW50aWFsX2hhc2giOiAiMjExZjgwNDAwZWRlYWFmNjgzYmE2NTBlODJiOWFjZTI0NmQzNDM3Mjc4YjAxZTczYjc3OTM5YjFjYTZjYzgwZCIsCiAgICAiY3JlZGVudGlhbF9oYXNoX2FsZyI6ICJzaGEtMjU2IiwKICAgICJjbmYiOiB7CiAgICAgICAgImp3ayI6IHsKICAgICAgICAgICAgImt0eSI6ICJFQyIsCiAgICAgICAgICAgICJjcnYiOiAiUC0yNTYiLAogICAgICAgICAgICAieCI6ICJUQ0FFUjE5WnZ1M09IRjRqNFc0dmZTVm9ISVAxSUxpbERsczd2Q2VHZW1jIiwKICAgICAgICAgICAgInkiOiAiWnhqaVdXYlpNUUdIVldLVlE0aGJTSWlyc1ZmdWVjQ0U2dDRqVDlGMkhaUSIKICAgICAgICB9CiAgICB9Cn0.VyT25r23eO_ppWuw0ONV6GKjJFfvYtJKQSIngGwtyklmckhE3vg5U7Cws9V41GOU6F77MVifGfXf0l2HP3mW1Q" +}; diff --git a/src/payloads/features/it-wallet/qeea/par.ts b/src/payloads/features/it-wallet/qeea/par.ts new file mode 100644 index 00000000..2abb7021 --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/par.ts @@ -0,0 +1,17 @@ +import { ParRequest } from "../../../../../generated/definitions/itwallet/qeea/ParRequest"; +import { ParResponse } from "../../../../../generated/definitions/itwallet/qeea/ParResponse"; + +export const PAR_REQUEST: ParRequest = { + response_type: "code", + client_id: "client_id", + code_challenge: "code_challenge", + code_challenge_method: "code_challenge_method", + request: "request", + client_assertion_type: "client_assertion_type", + client_assertion: "client_assertion" +}; + +export const PAR_RESPONSE: ParResponse = { + request_uri: "urn:ietf:params:oauth:request_uri:bwc4JK-ESC0w8acc191e-Y1LTC2", + expires_in: 60 +}; diff --git a/src/payloads/features/it-wallet/qeea/rp.ts b/src/payloads/features/it-wallet/qeea/rp.ts new file mode 100644 index 00000000..d7db6391 --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/rp.ts @@ -0,0 +1,2 @@ +export const REQUEST_OBJECT = + "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6ImVlYmUzY2Y3YmFlNDllZjJkNDlmYWZhY2Q0YjIxZjk0In0.eyJzY29wZSI6IlBlcnNvbklkZW50aWZpY2F0aW9uRGF0YSBXYWxsZXRBdHRlc3RhdGlvbiIsImNsaWVudF9pZF9zY2hlbWUiOiJlbnRpdHlfaWQiLCJjbGllbnRfaWQiOiJodHRwczovL3dhbGxldC1ycC5pcHpzLml0IiwicmVzcG9uc2VfbW9kZSI6ImRpcmVjdF9wb3N0Lmp3dCIsInJlc3BvbnNlX3R5cGUiOiJ2cF90b2tlbiIsInJlc3BvbnNlX3VyaSI6Imh0dHBzOi8vd2FsbGV0LXJwLmlwenMuaXQvcmVzcG9uc2VfdXJpIiwibm9uY2UiOiIyYzEyOGU0ZC1mYzkxLTRjZDMtODZiOC0xOGJkZWEwOTg4Y2IiLCJzdGF0ZSI6IjNiZTM5YjY5LTZhYzEtNDFhYS05MjFiLTNlNmMwN2RkY2IwMyIsImlzcyI6Imh0dHBzOi8vd2FsbGV0LXJwLmlwenMuaXQiLCJpYXQiOjE2NzI0MTg0NjUsImV4cCI6MTY3MjQyMjA2NSwicmVxdWVzdF91cmlfbWV0aG9kIjoicG9zdCJ9.E0_SS7WAznjIpsPVCj5_U0HeYOKTp3iglcE3gXO69yHmR26M89FrwqxzAWf_iQoN9_fusuclSBnRtH80dLX0Wg"; diff --git a/src/payloads/features/it-wallet/qeea/token.ts b/src/payloads/features/it-wallet/qeea/token.ts new file mode 100644 index 00000000..6cb47dc7 --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/token.ts @@ -0,0 +1,16 @@ +import { TokenResponse } from "../../../../../generated/definitions/itwallet/qeea/TokenResponse"; + +export const TOKEN_RESPONSE: TokenResponse = { + access_token: + "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6ImM5NTBjMGU2ZmRlYjVkZTUwYTUwMDk2YjI0N2FmMDNjIn0.eyJpc3MiOiJodHRwczovL2VpZC1wcm92aWRlci53YWxsZXQuaXB6cy5pdCIsInN1YiI6ImQ0ZTBiYjM4N2FhMjU1NmZmMzA2OTI1ZmRmYjlhNzY1IiwiYXVkIjoiaHR0cHM6Ly9laWQtcHJvdmlkZXIud2FsbGV0LmlwenMuaXQvY3JlZGVudGlhbCIsImlhdCI6MTcxNTg0MjU2MCwiZXhwIjoxNzc4OTE0NTYwLCJqdGkiOiJmOTY1NWNlYi1jNjVjLTQwMjUtOTM3OC1iNjY3MmI2MTQ5YmciLCJjbGllbnRfaWQiOiI0N2I5ODIzNjk3OTFkMDgwMDNhNzI4M2YwNTljYjBkMSIsImNuZiI6eyJqa3QiOiI5NTE1NzRhZWUxYmI3OTA3YWUxZWMzMTA5ZGIyYjIyNSJ9fQ.d8Dd-pn2s3AlTX-CZltIlCDZhy6wdNJBUVs0b1S5hDtXdYIqlkqCs-6k-sXDoV0Uw3aUmM2m-slQM80lBkJfZQ", + token_type: "DPoP", + expires_in: 3600, + c_nonce: "ts_EtUQs0ieiIS1NYNBHEQSoy3ct4gpy-4FZKwHilkY", + c_nonce_expires_in: 86400, + authorization_details: [ + { + type: "openid_credential", + credential_configuration_id: "PersonIdentificationData" + } + ] +}; diff --git a/src/payloads/features/it-wallet/qeea/well-known.ts b/src/payloads/features/it-wallet/qeea/well-known.ts new file mode 100644 index 00000000..dcce146d --- /dev/null +++ b/src/payloads/features/it-wallet/qeea/well-known.ts @@ -0,0 +1,2 @@ +export const WELL_KNOWN_RESPONSE = + "eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImFsZyI6IkVTMjU2Iiwia2lkIjoiRkFORlMzWW5DOXRqaUNhaXZoV0xWVUozQXh3R0d6Xzk4dVJGYXFNRUVzIn0.eyJpc3MiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fSIsInN1YiI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9IiwiaWF0IjoxNjg3MTcxNzU5LCJleHAiOjE3MDkyOTAxNTksImF1dGhvcml0eV9oaW50cyI6W10sIm1ldGFkYXRhIjp7ImZlZGVyYXRpb25fZW50aXR5Ijp7ImhvbWVwYWdlX3VyaSI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9LyIsIm9yZ2FuaXphdGlvbl9uYW1lIjoiSXN0aXR1dG8gUG9saWdyYWZpY28gZSBaZWNjYSBkZWxsbyBTdGF0byIsImNvbnRhY3RzIjpbImluZm9ybWF6aW9uaUBpcHpzLml0IiwicHJvdG9jb2xsb0BwZWMuaXB6cy5pdCJdLCJ0b3NfdXJpIjoiJHtzZXJ2ZXIuc2NoZW1lfTovLyR7c2VydmVyLmRvbWFpbn06JHtzZXJ2ZXIucG9ydH0vcHVibGljL2luZm9fcG9saWN5Lmh0bWwiLCJwb2xpY3lfdXJpIjoiJHtzZXJ2ZXIuc2NoZW1lfTovLyR7c2VydmVyLmRvbWFpbn06JHtzZXJ2ZXIucG9ydH0vcHVibGljL3ByaXZhY3lfcG9saWN5Lmh0bWwiLCJsb2dvX3VyaSI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9L3B1YmxpYy9sb2dvLnN2ZyJ9LCJvYXV0aF9hdXRob3JpemF0aW9uX3NlcnZlciI6eyJpc3N1ZXIiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fSIsInB1c2hlZF9hdXRob3JpemF0aW9uX3JlcXVlc3RfZW5kcG9pbnQiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fS8ke2FwaS5jb250ZXh0fS8ke2FwaS52ZXJzaW9ufS9hcy9wYXIiLCJhdXRob3JpemF0aW9uX2VuZHBvaW50IjoiJHtzZXJ2ZXIuc2NoZW1lfTovLyR7c2VydmVyLmRvbWFpbn06JHtzZXJ2ZXIucG9ydH0vJHthcGkuY29udGV4dH0vJHthcGkudmVyc2lvbn0vYXV0aG9yaXplIiwidG9rZW5fZW5kcG9pbnQiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fS8ke2FwaS5jb250ZXh0fS8ke2FwaS52ZXJzaW9ufS90b2tlbiIsImNsaWVudF9yZWdpc3RyYXRpb25fdHlwZXNfc3VwcG9ydGVkIjpbImF1dG9tYXRpYyJdLCJjb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZCI6WyJTMjU2Il0sImFjcl92YWx1ZXNfc3VwcG9ydGVkIjpbImh0dHBzOi8vd3d3LnNwaWQuZ292Lml0L1NwaWRMMiIsImh0dHBzOi8vd3d3LnNwaWQuZ292Lml0L1NwaWRMMyJdLCJzY29wZXNfc3VwcG9ydGVkIjpbIlBlcnNvbklkZW50aWZpY2F0aW9uRGF0YSJdLCJncmFudF90eXBlc19zdXBwb3J0ZWQiOlsiYXV0aG9yaXphdGlvbl9jb2RlIl0sInRva2VuX2VuZHBvaW50X2F1dGhfbWV0aG9kc19zdXBwb3J0ZWQiOlsiYXR0ZXN0X2p3dF9jbGllbnRfYXV0aCJdLCJ0b2tlbl9lbmRwb2ludF9hdXRoX3NpZ25pbmdfYWxnX3ZhbHVlc19zdXBwb3J0ZWQiOlsiRVMyNTYiXSwicmVxdWVzdF9vYmplY3Rfc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCI6WyJFUzI1NiJdLCJqd2tzIjp7ImtleXMiOlt7ImtpZCI6Ijc0MTE5OTU1OTVkYzczMTBkMzAxZjczN2QyNjQzZDhiIiwia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiI1ZF95anc1aFhNeFBhYzNHb3l4NzhxcnBVcW9QckpmWl90V3hHa0t1anpnIiwieSI6ImNYS0ZMa3dxbHRRVXVHSHZHRGUzWWFuVjZqejBOM3RYZUxGSm1OQmNNbVEifSx7ImtpZCI6ImYxMGFjYTA5OTI2OTRiMzU4MWY2ZjY5OWJmYzhhMmM2Y2M2ODc3MjUiLCJrdHkiOiJFQyIsImNydiI6IlAtMjU2IiwieCI6ImpFMlJwY1FiRlF4S3BNcWVoYWhnWnY2c21tWEQwaS9MVFAyUVJ6TUFEazQiLCJ5IjoicWtNeDVpcXQ1UGhQdTV0ZmN0UzZIc1ArRm1MZ3J4ZnJ6VVYyR3dNUXVoOCJ9XX19LCJvcGVuaWRfY3JlZGVudGlhbF9pc3N1ZXIiOnsiY3JlZGVudGlhbF9pc3N1ZXIiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fSIsImNyZWRlbnRpYWxfZW5kcG9pbnQiOiIke3NlcnZlci5zY2hlbWV9Oi8vJHtzZXJ2ZXIuZG9tYWlufToke3NlcnZlci5wb3J0fS8ke2FwaS5jb250ZXh0fS8ke2FwaS52ZXJzaW9ufS9jcmVkZW50aWFsIiwicmV2b2NhdGlvbl9lbmRwb2ludCI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9LyR7YXBpLmNvbnRleHR9LyR7YXBpLnZlcnNpb259L3Jldm9rZSIsInN0YXR1c19hdHRlc3RhdGlvbl9lbmRwb2ludCI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9LyR7YXBpLmNvbnRleHR9LyR7YXBpLnZlcnNpb259L3N0YXR1cyIsImRpc3BsYXkiOlt7Im5hbWUiOiJlSUQgUHJvdmlkZXIiLCJsb2NhbGUiOiJpdC1JVCIsImxvZ28iOnsidXJsIjoiJHtzZXJ2ZXIuc2NoZW1lfTovLyR7c2VydmVyLmRvbWFpbn06JHtzZXJ2ZXIucG9ydH0vcHVibGljL2xvZ28uc3ZnIiwiYWx0X3RleHQiOiJsb2dvIGRpIHF1ZXN0byBlSUQgUHJvdmlkZXIifX0seyJuYW1lIjoiZUlEIFByb3ZpZGVyIiwibG9jYWxlIjoiZW4tVVMiLCJsb2dvIjp7InVybCI6IiR7c2VydmVyLnNjaGVtZX06Ly8ke3NlcnZlci5kb21haW59OiR7c2VydmVyLnBvcnR9L3B1YmxpYy9sb2dvLnN2ZyIsImFsdF90ZXh0IjoiZUlEIFByb3ZpZGVyJ3MgbG9nbyJ9fV0sImNyZWRlbnRpYWxfY29uZmlndXJhdGlvbnNfc3VwcG9ydGVkIjp7IlBlcnNvbklkZW50aWZpY2F0aW9uRGF0YSI6eyJmb3JtYXQiOiJ2YytzZC1qd3QiLCJzY29wZSI6Iml0LXdhbGxldCIsImRpc3BsYXkiOlt7Im5hbWUiOiJQZXJzb24gSWRlbnRpZmljYXRpb24gRGF0YSIsImxvY2FsZSI6Iml0LUlUIn0seyJuYW1lIjoiUGVyc29uIElkZW50aWZpY2F0aW9uIERhdGEiLCJsb2NhbGUiOiJlbi1VUyJ9XSwiY3JlZGVudGlhbF9kZWZpbml0aW9uIjp7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJQZXJzb25JZGVudGlmaWNhdGlvbkRhdGEiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZ2l2ZW5fbmFtZSI6eyJ2YWx1ZV90eXBlIjoic3RyaW5nIiwiZGlzcGxheSI6W3sibmFtZSI6Ik5vbWUiLCJsb2NhbGUiOiJpdC1JVCJ9LHsibmFtZSI6IkZpcnN0IE5hbWUiLCJsb2NhbGUiOiJlbi1VUyJ9XSwibWFuZGF0b3J5IjoidHJ1ZSJ9LCJmYW1pbHlfbmFtZSI6eyJ2YWx1ZV90eXBlIjoic3RyaW5nIiwiZGlzcGxheSI6W3sibmFtZSI6IkNvZ25vbWUiLCJsb2NhbGUiOiJpdC1JVCJ9LHsibmFtZSI6IkZhbWlseSBOYW1lIiwibG9jYWxlIjoiZW4tVVMifV0sIm1hbmRhdG9yeSI6InRydWUifSwiYmlydGhfZGF0ZSI6eyJ2YWx1ZV90eXBlIjoic3RyaW5nIiwiZGlzcGxheSI6W3sibmFtZSI6IkRhdGEgZGkgTmFzY2l0YSIsImxvY2FsZSI6Iml0LUlUIn0seyJuYW1lIjoiRGF0ZSBvZiBCaXJ0aCIsImxvY2FsZSI6ImVuLVVTIn1dLCJtYW5kYXRvcnkiOiJ0cnVlIn0sInVuaXF1ZV9pZCI6eyJ2YWx1ZV90eXBlIjoic3RyaW5nIiwiZGlzcGxheSI6W3sibmFtZSI6IklkZW50aWZpY2F0aXZvIHVuaXZvY28iLCJsb2NhbGUiOiJpdC1JVCJ9LHsibmFtZSI6IlVuaXF1ZSBJZGVudGlmaWVyIiwibG9jYWxlIjoiZW4tVVMifV0sIm1hbmRhdG9yeSI6InRydWUifSwidGF4X2lkX2NvZGUiOnsidmFsdWVfdHlwZSI6InN0cmluZyIsImRpc3BsYXkiOlt7Im5hbWUiOiJDb2RpY2UgRmlzY2FsZSIsImxvY2FsZSI6Iml0LUlUIn0seyJuYW1lIjoiVGF4IElkIE51bWJlciIsImxvY2FsZSI6ImVuLVVTIn1dLCJtYW5kYXRvcnkiOiJ0cnVlIn19fSwiY3J5cHRvZ3JhcGhpY19zdWl0ZXNfc3VwcG9ydGVkIjpbIkVTMjU2Il0sImNyeXB0b2dyYXBoaWNfYmluZGluZ19tZXRob2RzX3N1cHBvcnRlZCI6WyJqd2siXSwiY3JlZGVudGlhbF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2Il0sInByb29mX3R5cGVzX3N1cHBvcnRlZCI6eyJqd3QiOnsicHJvb2Zfc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCI6WyJFUzI1NiJdfX19fSwiandrcyI6eyJrZXlzIjpbeyJraWQiOiJmMTBhY2EwOTkyNjk0YjM1ODFmNmY2OTliZmM4YTJjNmNjNjg3NzI1Iiwia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJqRTJScGNRYkZReEtwTXFlaGFoZ1p2NnNtbVhEMGkvTFRQMlFSek1BRGs0IiwieSI6InFrTXg1aXF0NVBoUHU1dGZjdFM2SHNQK0ZtTGdyeGZyelVWMkd3TVF1aDgifV19fX0sImp3a3MiOnsia2V5cyI6W3sia2lkIjoiRkFORlMzWW5DOXRqaUNhaXZoV0xWVUozQXh3R0d6Xzk4dVJGYXFNRUVzIiwia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJqRTJScGNRYkZReEtwTXFlaGFoZ1p2NnNtbVhEMGkvTFRQMlFSek1BRGs0IiwieSI6InFrTXg1aXF0NVBoUHU1dGZjdFM2SHNQK0ZtTGdyeGZyelVWMkd3TVF1aDgifV19fQ.iBVTGYoiCmvguBkKKXgKIzR92WPiSOwYnSxdBvA2p98rMuwssKHZjNW0eB6tfISUYf6e8Q0AAtU_5SSIv_bKCw"; diff --git a/src/routers/features/it-wallet/qeea/index.ts b/src/routers/features/it-wallet/qeea/index.ts new file mode 100644 index 00000000..7d5f93c0 --- /dev/null +++ b/src/routers/features/it-wallet/qeea/index.ts @@ -0,0 +1,130 @@ +import { Router } from "express"; +import { addApiV1Prefix } from "../../../../utils/strings"; +import { addHandler } from "../../../../payloads/response"; +import { WELL_KNOWN_RESPONSE } from "../../../../payloads/features/it-wallet/qeea/well-known"; +import { PAR_RESPONSE } from "../../../../payloads/features/it-wallet/qeea/par"; +import { CALLBACK_RESPONSE } from "../../../../payloads/features/it-wallet/qeea/callback"; +import { TOKEN_RESPONSE } from "../../../../payloads/features/it-wallet/qeea/token"; +import { + CREDENTIAL_RESPONSE, + STATUS_RESPONSE +} from "../../../../payloads/features/it-wallet/qeea/credential"; +import { REQUEST_OBJECT } from "../../../../payloads/features/it-wallet/qeea/rp"; + +export const itwRouter = Router(); + +export const addItwPrefix = (path: string) => + addApiV1Prefix(`/itwallet/qeea${path}`); + +/** + * OpenID Connect Federation + */ +addHandler( + itwRouter, + "get", + addItwPrefix("/.well-know/openid-federation"), + (_, res) => { + res.status(200).json(WELL_KNOWN_RESPONSE); + } +); + +/** + * AS - PAR + */ +addHandler(itwRouter, "get", addItwPrefix("/as/par"), (req, res) => { + // TODO: extract request body params + res.status(201).json(PAR_RESPONSE); +}); + +/** + * AS - Authorize Endpoint + * @param client_id - The client_id + * @param request_uri - The request_uri + * @param idphint - The idphint user choice + */ +addHandler( + itwRouter, + "get", + addItwPrefix("/authorize/:client_id/:request_uri/:idphint"), + (_, res) => { + res.status(200).send("authorization_token"); + } +); + +/** + * AS -Callback Endpoint + */ +addHandler( + itwRouter, + "get", + addItwPrefix("/callback/:response_code"), + (_, res) => { + /* + The request header should contain this params + -H 'FamilyName: Rossi' \ + -H 'FirstName: Mario' \ + -H 'DateOfBirth: 1980-01-01' \ + -H 'PersonIdentifier: RSSMRA80A01H501U' \ + -H 'AuthnLevel: 2' \ */ + res.status(200).send(CALLBACK_RESPONSE); + } +); + +/** + * AS - Token Endpoint + */ +addHandler(itwRouter, "post", addItwPrefix("/token"), (_, res) => { + res.status(200).send(TOKEN_RESPONSE); +}); + +/** + * Credential - Issuing Endpoint + */ +addHandler(itwRouter, "post", addItwPrefix("/credential"), (_, res) => { + res.status(200).send(CREDENTIAL_RESPONSE); +}); + +/** + * Credential - Status endpoint + */ +addHandler(itwRouter, "post", addItwPrefix("/status"), (_, res) => { + res.status(200).send(STATUS_RESPONSE); +}); + +/** + * Credential - Revoke endpoint + */ +addHandler(itwRouter, "post", addItwPrefix("/revoke"), (_, res) => { + res.sendStatus(204); +}); + +/** + * RP - login + */ +addHandler(itwRouter, "get", addItwPrefix("/login/:state"), (_, res) => { + res.sendStatus(200); // TODO: add response +}); + +/** + * RP - request uri + * endpoint to download RequestObject + */ +addHandler( + itwRouter, + "get", + addItwPrefix("/request_uri/:random_value"), + (_, res) => { + res.status(200).send(REQUEST_OBJECT); // TODO: add response + } +); + +/** + * RP - The RP Wallet endpoint for presenting the WTE and the eID Verifiable Credential + */ +addHandler(itwRouter, "post", addItwPrefix("/response_uri"), (req, res) => { + const response_code = req.body.response; + // TODO make response object + res.status(200).send({ + redirect_uri: `https://it-wallet-eaa-provider.example.it/callback#response_code=${response_code}` + }); // TODO: add response +});