# ModĂšles de transaction - Liaison
API Tiers de Mojaloop
# Table des MatiĂšres
- Préface
1.1 Conventions utilisées dans ce document
1.2 Informations sur la version du document
1.3 Références - Introduction
2.1 Spécification de l'API Tiers - Liaison
3.1 Pré-liaison
3.2 Découverte
3.3 Demande de consentement
3.4 Authentification
3.5 Octroi du consentement
3.6 Enregistrement du justificatif - Déliaison
4.1 Déliaison sans service d'authentification hébergé par le Switch
4.2 Déliaison avec service d'authentification hébergé par le Switch - Scénarios d'Erreur
5.1 Découverte
5.2 Erreurs sur les demandes de consentement
5.3 Authentification
5.4 Octroi du consentement
# 1. Préface
Cette section contient des informations sur la façon d'utiliser ce document.
# 1.1. Conventions utilisées dans ce document
Les conventions suivantes sont utilisées dans ce document pour identifier les informations spécifiées.
| Type d'information | Convention | Exemple |
|---|---|---|
| ĂlĂ©ments de l'API, tels que les ressources | Gras | /authorization |
| Variables | Italique entre chevrons | {ID} |
| Termes du glossaire | Italique à la premiÚre occurrence ; défini dans Glossaire | Le but de l'API est de permettre des transactions financiÚres interopérables entre un Payeur (une personne qui paie dans une transaction) localisé dans un FSP (une entité qui fournit un service financier numérique à un utilisateur final) et un Bénéficiaire (une personne qui reçoit des fonds) localisé dans un autre FSP. |
| Documents de rĂ©fĂ©rence | Italique | Les informations sur l'utilisateur ne doivent gĂ©nĂ©ralement pas ĂȘtre utilisĂ©es par les dĂ©ploiements de l'API ; les mesures de sĂ©curitĂ© dĂ©taillĂ©es dans Signature API et Chiffrement API doivent ĂȘtre utilisĂ©es Ă la place. |
# 1.2. Informations sur la version du document
| Version | Date | Description des modifications |
|---|---|---|
| 1.0 | 2021-10-03 | Version initiale |
# 1.3. Références
Les références suivantes sont utilisées dans cette spécification :
| Référence | Description | Version | Lien |
|---|---|---|---|
| Réf. 1 | API Ouvert pour l'Interopérabilité FSP | 1.1 | Définition de l'API v1.1 (opens new window) |
# 2. Introduction
Ce document prĂ©sente les modĂšles de transaction supportĂ©s par lâAPI Tiers relatifs Ă lâĂ©tablissement dâune relation entre un Utilisateur, un DFSP et un PISP.
Le style architectural et la conception de cette API sont basés sur la Section 3 (opens new window) de la Réf. 1 ci-dessus.
# 2.1 Spécification de l'API Tiers
La spécification de l'API Tiers Mojaloop inclut les documents suivants :
- ModÚles de données
- ModĂšles de transactions - Liaison
- ModĂšles de transactions - Transfert
- DĂ©finition de l'API ouverte tierce partie â DFSP
- DĂ©finition de l'API ouverte tierce partie â PISP
# 3. Liaison
L'objectif du processus de liaison est d'expliquer comment les utilisateurs établissent la confiance entre les trois parties intéressées :
- Utilisateur
- DFSP oĂč l'utilisateur dĂ©tient un compte
- PISP sur lequel l'utilisateur veut compter pour initier les paiements
La liaison est divisée en plusieurs phases distinctes :
- Pré-liaison
Dans cette phase, un PISP demande quels DFSP sont disponibles pour ĂȘtre liĂ©s. - Demande de consentement
Dans cette phase, un PISP tente dâĂ©tablir la confiance entre les 3 parties. - Authentification
Dans cette phase, l'utilisateur prouve son identité à son DFSP. - Octroi du consentement
Dans cette phase, un PISP prouve au DFSP que l'utilisateur et le PISP ont établi la confiance, et ainsi, le DFSP confirme que la confiance mutuelle existe entre les 3 parties. - Enregistrement du justificatif
Dans cette phase, un utilisateur crée le justificatif qu'il utilisera pour consentir à des transferts futurs du DFSP initiés par le PISP.
# 3.1 Pré-liaison
Dans cette phase, un serveur PISP doit connaĂźtre les DFSP disponibles pour ĂȘtre liĂ©s. Ceci est peu probable dâĂȘtre fait Ă la demande (par exemple, quand un utilisateur clique sur "lier" dans lâapplication mobile du PISP), et plus probablement rĂ©alisĂ© pĂ©riodiquement et mis en cache par le serveur PISP. La raison est que de nouveaux DFSP ne rejoignent gĂ©nĂ©ralement pas le rĂ©seau Mojaloop trĂšs frĂ©quemment, donc appeler ceci plusieurs fois dans la mĂȘme journĂ©e donnerait probablement les mĂȘmes rĂ©sultats. Nous recommandons que le PISP fasse cette requĂȘte une fois par jour pour maintenir la liste des DFSPs Ă jour.
L'objectif final de cette phase est que le serveur PISP dispose d'une liste finale de DFSPs disponibles ainsi que de toutes les métadonnées utiles nécessaires pour débuter le processus de liaison.
Le PISP peut afficher cette liste de DFSPs à l'utilisateur, et l'utilisateur peut sélectionner le DFSP avec lequel il détient un compte à lier.
# 3.2 Découverte
Dans cette phase, on demande Ă l'utilisateur de sĂ©lectionner le type et la valeur de l'identifiant qu'il utilise avec le DFSP avec lequel il souhaite se lier. Cela peut ĂȘtre un nom d'utilisateur, un MSISDN (numĂ©ro de tĂ©lĂ©phone), ou une adresse e-mail.
Le résultat de cette phase est une liste de comptes potentiels disponibles pour la liaison. L'utilisateur choisira ensuite un ou plusieurs de ces comptes sources et le PISP les fournira au DFSP lors de la demande de consentement.
Le DFSP PEUT renvoyer un « accountNickname » au PISP dans la liste des comptes. Cette liste sera affichĂ©e Ă l'utilisateur dans lâapplication PISP pour quâil sĂ©lectionne quels comptes il souhaite lier. Un DFSP pourrait masquer une partie du surnom selon ses exigences pour afficher les informations sur le compte sans authentifier lâutilisateur.
REMARQUE : Lors de lâutilisation du canal dâauthentification Web, il est possible que les choix faits (câest Ă dire, les comptes Ă lier) soient remplacĂ©s par l'utilisateur dans une vue web. Lâutilisateur peut donc dĂ©cider, pendant la phase dâAuthentification, de lier un compte diffĂ©rent de celui dâorigine. Cela est parfaitement acceptable et doit ĂȘtre attendu de temps Ă autre.
# 3.3 Demande de consentement
Dans cette phase, un PISP demande Ă un DFSP spĂ©cifique de dĂ©marrer le processus dâĂ©tablissement du consentement entre trois parties :
- Le PISP
- Le DFSP spécifié
- Un utilisateur présumé client du DFSP ci-dessus
La demande de consentement du PISP doit inclure plusieurs éléments importants :
- Les canaux dâauthentification acceptables pour lâutilisateur
- Les Ă©tendues nĂ©cessaires dans le cadre du consentement (ici, presque toujours, seulement la possibilitĂ© de voir le solde dâun compte spĂ©cifique et dâenvoyer des fonds depuis un compte).
Certaines informations dĂ©pendent du canal dâauthentification utilisĂ© (Web ou OTP). Si le canal Web est utilisĂ©, les informations supplĂ©mentaires suivantes sont requises :
- Un URI de rappel vers lequel lâutilisateur peut ĂȘtre redirigĂ© avec toute information supplĂ©mentaire.
Le rĂ©sultat de cette phase dĂ©pend du canal dâauthentification utilisé :
# 3.3.1 Web
Dans le canal dâauthentification Web, le rĂ©sultat est que le PISP reçoit une URL spĂ©cifique oĂč cet utilisateur devrait ĂȘtre redirigĂ©. Cette URL doit ĂȘtre un endroit oĂč lâutilisateur peut prouver son identitĂ© (par exemple, via une connexion classique).
# 3.3.2 OTP / SMS
Dans le canal dâauthentification OTP, le DFSP envoie un message OTP « hors bande » Ă son utilisateur (par exemple, par SMS ou e-mail). Le PISP demande Ă l'utilisateur ce code OTP, et l'inclut dans le champ « authToken » lors du rappel PATCH /consentRequests/{ID}.
# 3.4 Authentification
Dans la phase dâauthentification, il est attendu de lâutilisateur quâil prouve son identitĂ© auprĂšs du DFSP. Une fois cela fait, le DFSP fournira Ă lâutilisateur un certain type de secret (par exemple, un OTP ou un token dâaccĂšs). Ce secret sera alors transmis au PISP afin que celui-ci puisse dĂ©montrer une chaĂźne de confiance :
- Le DFSP fait confiance Ă l'utilisateur
- Le DFSP donne un secret Ă l'utilisateur
- L'utilisateur fait confiance au PISP
- L'utilisateur transmet le secret reçu du DFSP au PISP
- Le PISP donne le secret au DFSP
- Le DFSP vérifie que le secret est correct
Cette chaĂźne aboutit Ă la conclusion suivante : le DFSP peut faire confiance au PISP pour agir pour le compte de lâutilisateur, et une confiance mutuelle existe entre les trois parties.
Le processus dâĂ©tablissement de cette chaĂźne de confiance dĂ©pend du canal dâauthentification utilisĂ© :
# 3.4.1 Web
Dans le canal Web, le PISP utilise le champ authUri renvoyĂ© lors du rappel PUT /consentRequests/{ID} pour rediriger lâutilisateur vers le site web du DFSP oĂč il pourra prouver son identitĂ© (probablement via un identifiant et mot de passe classique).
Remarque: Notez quâĂ ce stade, lâutilisateur peut modifier ses choix de comptes Ă lier. Le rĂ©sultat sera visible plus tard lors de la phase d'octroi du consentement, dans laquelle le DFSP fournira les bonnes valeurs au PISP dans le champ scopes.
# 3.4.2 OTP
Lors de lâutilisation du canal OTP, le DFSP enverra Ă lâutilisateur un mot de passe Ă usage unique via un canal préétabli (comme un SMS). Le PISP doit alors demander Ă lâutilisateur ce mot de passe Ă usage unique et le renvoyer au DFSP via lâappel API PATCH /consentRequests/{ID}.
# 3.5 Octroi du consentement
Maintenant que la confiance mutuelle a Ă©tĂ© Ă©tablie entre les trois parties, le DFSP est capable de crĂ©er un enregistrement de ce fait en crĂ©ant une nouvelle ressource Consent. Cette ressource enregistrera toutes les informations pertinentes sur la relation entre les trois parties, et contiendra Ă©ventuellement des informations supplĂ©mentaires sur la maniĂšre dont lâutilisateur pourra prouver son consentement pour chaque transfert futur.
Cette phase consiste exclusivement Ă ce que le DFSP demande Ă ce quâun nouveau consentement soit créé.
# 3.6 Enregistrement du justificatif
Une fois la ressource de consentement créée, le PISP tentera dâĂ©tablir avec le DFSP le justificatif qui devra ĂȘtre utilisĂ© pour vĂ©rifier que l'utilisateur donne son consentement pour chaque transfert futur.
Cela se fera en stockant un justificatif FIDO (par exemple, une clĂ© publique) sur le service Auth Ă l'intĂ©rieur de la ressource de consentement. Lors des futurs transferts, il sera demandĂ© que ces transferts soient signĂ©s numĂ©riquement par le credential FIDO (ici la clĂ© privĂ©e) pour ĂȘtre considĂ©rĂ©s comme valides.
Cet enregistrement du justificatif est composé de trois phases : (1) dériver le challenge, (2) enregistrer le justificatif, et (3) finaliser le consentement.
# 3.6.1 Dérivation du challenge
Le PISP doit dĂ©river le challenge qui sera utilisĂ© comme entrĂ©e dans lâĂ©tape d'enregistrement de clĂ© FIDO. Ce challenge ne doit pas pouvoir ĂȘtre devinĂ© Ă lâavance par le PISP.
Soit
consentIdla valeur debody.consentIddans la requĂȘte POST /consentsSoit
scopesla valeur debody.scopesdans la requĂȘte POST /consentsLe PISP doit construire l'objet JSON
rawChallenge
{
"consentId": <body.consentId>,
"scopes": <body.scopes>
}
Ensuite, le PISP doit convertir cet objet JSON en une chaĂźne au format Canonical JSON RFC-8785 (RFC-8785 Canonical JSON format (opens new window))
Enfin, le PISP doit calculer un hash SHA-256 de la chaßne JSON canonique, c'est-à -dire :
SHA256(CJSON(rawChallenge))
La sortie de cet algorithme, challenge, sera utilisée comme défi lors du flux d'enregistrement FIDO (opens new window)
# 3.6.2 Enregistrement du justificatif
Une fois le challenge dérivé, le PISP générera un nouveau justificatif sur le dispositif, signera numériquement le challenge, et fournira des informations supplémentaires sur le justificatif dans la ressource Consent :
- Lâobjet
PublicKeyCredentialâ qui contient lâID de la clĂ© et une AuthenticatorAttestationResponse (opens new window) contenant la clĂ© publique - Un champ
credentialTypeĂ la valeurFIDO - Un champ
statusavec la valeurPENDING
Remarque : Objets Credential génériques
Bien que nous soyons concentrĂ©s dâabord sur FIDO, il est possible que certains PISP souhaitent offrir des services aux utilisateurs via dâautres canaux, par ex. USSD ou SMS. LâAPI prend donc aussi en charge un typeGENERIC, par exemple :CredentialTypeGeneric { credentialType: 'GENERIC' status: 'PENDING', payload: { publicKey: base64(...), signature: base64(...), } }
Le DFSP reçoit lâappel PUT /consents/{ID} du PISP, et valide Ă©ventuellement l'objet Credential inclus dans la requĂȘte. Le DFSP demande ensuite au service Auth de crĂ©er lâobjet Consent et de valider le justificatif.
Si le DFSP reçoit un rappel PUT /consents/{ID} du service Auth, avec un credential.status à VERIFIED, il sait que le justificatif est valide selon le service Auth.
Sinon, sâil reçoit un rappel PUT /consents/{ID}/error, il sait que quelque chose a mal tournĂ© lors de lâenregistrement du consentement et du justificatif associĂ©, et peut informer le PISP en consĂ©quence.
Le service Auth est ensuite responsable d'appeler POST /participants/CONSENTS/{ID}.
Cet appel associera le consentId au participantId du service Auth et permettra de retrouver plus tard le service Auth correspondant.
# 3.6.3 Finalisation du consentement
Une fois que le DFSP est sûr que le justificatif est valide, il appelle POST /participants/THIRD_PARTY_LINK/{ID} pour chaque compte dans la liste Consent.scopes. Cette entrée représente le lien entre le compte du PISP et celui du DFSP, que le PISP pourra utiliser pour spécifier la source des fonds lors de la demande de transaction.
Enfin, le DFSP appelle PUT /consent/{ID} avec l'objet Consent finalisé reçu du service Auth.
# 4. Déliaison
Ă un moment donnĂ©, il est possible quâun utilisateur, un PISP ou un DFSP dĂ©cide que la relation de confiance prĂ©cĂ©demment Ă©tablie ne doit plus exister. Par exemple, un scĂ©nario courant peut ĂȘtre la perte du tĂ©lĂ©phone par un utilisateur, qui utilise lâinterface du DFSP pour supprimer le lien entre le dispositif perdu, le PISP et le DFSP.
Pour rendre cela possible, il suffit de fournir un moyen à un membre du réseau de supprimer la ressource de consentement et de notifier les autres parties de cette suppression.
Nous devons gĂ©rer 2 scĂ©narios avec une requĂȘte DELETE /consents/{ID} :
- Un service Auth hĂ©bergĂ© par le DFSP, oĂč aucun dĂ©tail du consentement nâest stockĂ© dans le Switch ;
- Un service Auth hĂ©bergĂ© par le Switch, oĂč ce service est considĂ©rĂ© comme la source faisant autoritĂ© pour lâobjet
Consent.
# 4.1 Déliaison sans service d'authentification hébergé par le Switch
Dans ce cas, le Switch transmet la requĂȘte DELETE /consents/22222222-0000-0000-0000-000000000000 au DFSP dans lâen-tĂȘte FSPIOP-Destination.
Dans le cas oĂč la dĂ©liaison est demandĂ©e depuis le cĂŽtĂ© DFSP, celui-ci peut simplement appeler PATCH /consents/22222222-0000-0000-0000-000000000000 pour informer le PISP dâune mise Ă jour sur lâobjet Consent.
# 4.2 Déliaison avec service d'authentification hébergé par le Switch
Dans cette instance, le PISP adresse toujours son appel DELETE /consents/22222222-0000-0000-0000-000000000000 au DFSP via lâen-tĂȘte FSPIOP-Destination.
En interne, le Switch recherchera la source faisant autoritĂ© de lâobjet Consent via lâappel ALS, GET /participants/CONSENT/{ID}. Sâil est dĂ©terminĂ© quâun service Auth hĂ©bergĂ© par le Switch « possĂšde » ce consentement, lâappel HTTP DELETE /consents/{ID} sera redirigĂ© vers le service Auth.
# 5.ScĂ©narios dâerreur
# 5.1 Découverte
Quand le DFSP ne trouve pas d'utilisateur pour l'identifiant dans GET /accounts/{ID},
le DFSP rĂ©pond avec le code dâerreur 6205 via PUT /accounts/{ID}/error.
# 5.2 Erreurs sur les demandes de consentement
Lorsque le DFSP reçoit la requĂȘte POST /consentRequests du PISP, les erreurs suivantes peuvent survenir :
- Le DFSP ne prend pas en charge les étendues (scopes) spécifiées :
6101. Par exemple, leuserIdspécifié ne correspond pas aux comptes mentionnés, ou le champscope.actionscontient des permissions que ce DFSP ne prend pas en charge. - Le PISP a envoyé un mauvais callbackUri :
6204. Par exemple, le schĂ©ma de callbackUri pourrait ĂȘtre http, ce que le DFSP pourrait choisir de ne pas accepter. - Tout autre contrĂŽle ou validation cĂŽtĂ© DFSP Ă©choue :
6104. Par exemple, le compte de lâutilisateur pourrait ĂȘtre inactif ou suspendu.
Dans ce cas, le DFSP doit informer le PISP de lâĂ©chec en envoyant un rappel PUT /consentRequests/{ID}/error au PISP.
# 5.3 Authentification
Lorsqu'un PISP envoie un PATCH /consentRequests/{ID} au DFSP, il est possible que le authToken soit expiré ou invalide :
