Développeurs OneSpan Sign : Comment sécuriser les appels API avec OAuth 2.0

Haris Haidary,

La sécurisation des intégrations API peut s'avérer difficile, en particulier lorsqu'il s'agit de flux de travail d'eSignature sensibles. Ce didacticiel sur la sécurité des API montre comment implémenter une authentification OAuth 2.0 robuste pour les API OneSpan Sign, éliminant ainsi les vulnérabilités de sécurité courantes dans les intégrations d'API REST. Vous maîtriserez l'authentification par jeton JWT, apprendrez le flux d'informations d'identification du client et découvrirez comment le serveur d'autorisation de OneSpan permet une authentification sécurisée par jeton porteur sans exposer les informations d'identification de l'utilisateur. Que vous soyez un développeur novice en matière d'OAuth ou que vous cherchiez à améliorer votre intégration OneSpan Sign existante, ce guide fournit des exemples de code pratiques et les meilleures pratiques en matière de sécurité des API que vous pouvez mettre en œuvre immédiatement.

Introduction à OAuth 2.0 pour les développeurs

OAuth 2.0 est un cadre d'autorisation qui permet aux applications d'obtenir un accès limité aux comptes d'utilisateurs sur un service HTTP, tel que les API fournies par Google, Microsoft ou OneSpan Sign. Il est largement adopté pour sécuriser les API et déléguer l'accès des utilisateurs dans les applications web, de bureau et mobiles.

Contrairement à l'authentification traditionnelle, OAuth 2.0 permet aux utilisateurs d'autoriser l'accès à leurs données sans partager leurs informations d'identification, en utilisant des jetons d'accès émis par un serveur d'autorisation de confiance.

Rôles clés dans OAuth 2.0

Avant de plonger dans le flux, il est important de comprendre les quatre acteurs principaux :

RôleDescription de la ressource
Propriétaire de la ressourceL'utilisateur qui possède les données.
ClientL'application qui demande l'accès aux données de l'utilisateur.
Serveur d'autorisationDélivre des jetons au client après avoir authentifié le propriétaire de la ressource.
Serveur de ressourcesL'API ou le service qui détient les données de l'utilisateur.

Flux du code d'autorisation OAuth 2.0

Examinons un exemple de flux avec OneSpan Sign :

Summary of OAuth Flow in OneSpan Sign

Figure 1 : Résumé du flux OAuth dans OneSpan Sign

Le diagramme de la Figure 1 illustre un flux OAuth 2.0 de serveur à serveur utilisant les informations d'identification du client avec des jetons d'accès JWT, en particulier dans le contexte de OneSpan Sign et d'un serveur d'autorisation externe pour OneSpan Sign.

Voici une décomposition étape par étape du flux OAuth illustré dans le diagramme :

  1. 1. Le client de l'application (par exemple, un service backend) initie l'authentification en envoyant son ID et son secret client au serveur d'autorisation OneSpan Sign.
  2. 2. Le serveur d'autorisation OneSpan Sign valide les informations d'identification du client.
  3. 3. Le client de l'application inclut le jeton d'accès JWT dans l'en-tête d'autorisation (en tant que porteur ) lorsqu'il appelle l'API REST de OneSpan Sign.
  4. 4. Lorsque l'API OneSpan Sign reçoit la demande, elle transmet le jeton au serveur d'autorisation OneSpan Sign (ou à un service de validation JWT).
  5. 5. Le serveur d'autorisation confirme si le jeton est valide ou non et renvoie le résultat à OneSpan Sign.
  6. 6. L'API OneSpan Sign traite la demande et renvoie une réponse au client de l'application.

Pourquoi utiliser OAuth 2.0 ?

  • Pour des raisons de sécurité : Les utilisateurs ne partagent jamais leurs informations d'identification avec des applications tierces.
  • Évolutivité : Découple l'authentification de l'accès aux ressources.
  • Basé sur des jetons : Permet un contrôle d'accès précis, l'expiration et la révocation des jetons.
  • Standardisé : Fonctionne avec différents fournisseurs d'identité et API.

Utilisation de cURL

Tout d'abord, vous devez obtenir vos informations d'identification OAuth à partir de votre tableau de bord OneSpan Sign (c.-à-d. client-id et client-secret). Vous devez vous connecter en tant qu'administrateur du compte et aller dans Admin > API Access.

Dans les paramètres d'authentification, sélectionnez l'option OAuth 2.0 :

Authentication Settings in the OneSpan Sign dashboard

Figure 2 : Paramètres d'authentification dans le tableau de bord OneSpan Sign

Ensuite, cliquez sur l'onglet OAuth 2.0 sur le côté gauche. Ici, vous générez votre ID client et votre secret client. Notez l'URL du serveur d'autorisation.

OAuth 2.0 in the OneSpan Sign dashboard

Figure 3 : OAuth 2.0 dans le tableau de bord OneSpan Sign

Notez que l'activation de votre client OAuth peut prendre jusqu'à 5 minutes.

Vous êtes maintenant prêt à effectuer votre premier appel API à l'aide d'OAuth. Pour récupérer un jeton d'accès :

cURL -H 'Content-Type : application/x-www-form-urlencoded' \N- "clientId:clientSurlencoded" - "clientId:clientSurlencoded"
-u "clientId:clientSecret" \N- \N- u
https://sandbox.esignlive.com/oauth2/token \N- "GRANT_TYPE=CLIENT" \N
-d "grant_type=client_credentials"

ParamètreConditionDescription de l'autorisation
AutorisationObligatoireLes informations d'identification du client sont acceptées sous la forme d'un modèle d'authentification de base ou d'un paramètre d'en-tête conformément à la RFC 6749.
Dans les en-têtes de la requête, transmettez la chaîne encodée en Base64 représentant vos valeurs 'client_id' et 'client_secret', ajoutée au texte Basic comme suit :
``` Basic ```
Base64 encoded client_id and client_secret = Base64 of "client_id:client_secret"
grant_typeObligatoireDoit être défini sur client_credentials. À partir de la version 24.R5, "grant_type" ne sera pas accepté en tant que paramètre de requête. Il ne sera accepté que comme donnée de formulaire.

Réponse positive

Une réponse réussie ressemble à ceci :

{
"access_token" : "eyJraWQiOiIxOTk5OGJhOS1jYTY1LTQ3ODYtOGYzMi01ZGUxZDNhM2JhYTUiL....",
"token_type" : "Bearer",
"expires_in" : 299
}

ParamètreDescription
access_tokenLe jeton d'accès demandé. L'application peut utiliser ce jeton pour s'authentifier auprès de la ressource sécurisée, telle qu'une API web.
token_typeIndique la valeur du type de jeton. Le seul type pris en charge par l'API OneSpan Sign est bearer.
expires_inDurée de validité d'un jeton d'accès (en secondes).

Remarque : L'API OneSpan Sign n'offre pas de fonctionnalité de rafraîchissement des jetons, de sorte qu'un nouveau jeton doit être généré à l'expiration du jeton existant. Les intégrateurs qui utilisent l'API OneSpan Sign doivent donc procéder à des manipulations supplémentaires du côté de l'application. En revanche, les SDK Java et .NET permettent de recréer automatiquement le jeton côté client, ce qui simplifie le processus.

Saisissez maintenant le jeton d'accès et utilisez-le pour lancer un appel aux API :

cURL -X POST --location 'http://sandbox.e-signlive.ca/api/packages' \N- -header 'Content-Type:'
--header 'Content-Type : application/json' \N- -header 'Authorization : \N-'
--header 'Authorization : Bearer yJraWQiOiIxOTk5OGJhOS1jYTY1LTQ3ODYtOGYzMi01ZGUxZDNhM2JhYTUiLCJhbGciOiJSUzI1
NiJ9.eyJzdWIiOiJsWWZSMlluWThRaUVzaU1OT3Z5YmxuTWVMIiw
iYXVkIjoibFlmUjJZblk4UWlFc2lNTk92eWJsbk1lTCIs
Im5iZiI6MTcwNjI3MzI1MywiaXNzIjoiaHR0cDovL2lud
GVybmFsLW9zcy1hdXRob3JpemF0aW9uLXN
jc2lrYS0xMzE0NjM3MzA3LnVzLWVhc
3QtMS5lbGIuYW1hem9uYXdzLmNvbSIsImV4c
CI6MTcwNjI3MzU1MywiaWF0IjoxNzA2MjczMjUzLCJqdGkiOiJlNDZiYTVi
Mi0zZmQzLTQzYjktOGQ0OS00Njg0NGEyYmQ1ZDIifQ.lGTWVxirs7G8nfXQC-enOpMUCdbmDp1hWnEHbLSuOKknPPrr0_Ewk
SMG2HBGbMuDy_eY_jttLcdGI_PA10cikzCN0DSTnAmkAn
7Av24BbqthTNqJsQfeCY0y8G14hnjmuDC7-yIsNO55X6YFtoF4MBxc7Z49PQUsjmA9cxh0xgc
MVLqRMbfHKdgIqSRLBtHdh4jdNn_xaoE-vCPCSnR2ocsacZEb-u0NX0f7Nt3f0l8g0JH2BR99RHUkUdc7T47rqda_wnhBB1fTTH
t2p8mBkDbjMlaTkTAGX1U9tq0dBAePEDNw0DkDUVzGVNc2XafnBniiMZK0PvS4aN5PEkdw' \
--data '{
"name" : "Dummy transaction", \N- "Description" : "Description" : "Description" : "Description" : "Description"
"description" : "création d'une transaction fictive en utilisant OAuth", \N- "description" : "création d'une transaction fictive en utilisant OAuth"
"type" : "PACKAGE", \N
"language" : "en", \N- "autocomplete" : true, \N
"autocomplete" : true, \N- "autocomplete" : true, \N- "autocomplete" : true
"sender" : { \
"email" : "[email protected]"
}, \
"roles" : [ \
{ \
"id" : "client", \N
"type" : "SIGNER", \N- "SIGNER" : "SIGNER", \N- "SIGNER" : "SIGNER
"index" : 1, \
"signers" : [ \
{ \
"firstName" : "Quelqu'un", \N
"lastName" : "Nom de famille" : "Signer", \N
"email" : "[email protected]" \
} \
], \
"name" : "signataire" \N- \N- \N- \N- \N- \N
}\
}, \
"name" : "Contrat type" \N- "Sample Contract" \N- "Sample Contract" \N
}] \
}'

Utilisation du SDK Java

Lorsque vous utilisez le SDK Java ou .NET, le jeton généré est utilisé jusqu'à son expiration au lieu de créer un nouveau jeton à chaque appel.

Le SDK gère cela correctement, en mettant en cache les clients créés. Ces clients conservent le jeton et avant chaque appel effectué par le SDK, l'expiration du jeton est vérifiée et le SDK décide si un nouveau jeton est nécessaire ou non.

Par conséquent, lorsque vous utilisez le SDK, il n'est pas nécessaire d'implémenter une vérification de l'expiration du jeton d'accès puisque cela est géré automatiquement.

EslOAuthClientConfig config = new EslOAuthClientConfig.Builder()
.withClientId("clientId") // Obligatoire : remplacez par votre clientId
.withClientSecret("clientSecret") // Obligatoire : remplacez par votre clientSecret
.withAuthenticationServer("authenticationServer") // Obligatoire : remplacez par l'url du serveur d'autorisation de OneSpan
.withApiUrl("apiUrl") // Obligatoire : remplacez par l'url de l'API de OneSpan
.withAllowAllSSLCertificatesFlag(allowAllSSLCertificatesFlag) // Facultatif : faux par défaut
.withUseSystemProperties(useSystemProperties) // Facultatif : faux par défaut. Si cette option vaut true, toutes les configurations de proxy doivent être transmises en tant que propriétés du système
.withProxyConfig(proxyConfig) // Facultatif : par défaut null. A transmettre si le proxy est requis et que useSystemProperties est défini sur false
.withHeaders(headers) // Facultatif : carte vide par défaut. A transmettre si des en-têtes supplémentaires sont nécessaires à la requête
.build() ;

EslClient eslClient = EslOAuthClientProvider.getInstance().getEslClient(config) ;

//procédez à des appels à notre API en utilisant eslClient.

Utilisation du SDK .NET

De la même manière que pour le SDK Java :

OSSAuthClientConfig config = new OSSAuthClientConfig.Builder()
.WithClientId(clientId) // Obligatoire : remplacez par votre clientId
.WithClientSecret(clientSecret) // Obligatoire : remplacez par votre clientSecret
.WithAuthenticationServer(authenticationServer)// Obligatoire : remplacez par l'url du serveur d'autorisation de OneSpan
.WithApiUrl(apiUrl) // Obligatoire : remplacez par l'url de l'API de OneSpan
.WithAllowAllSSLCertificatesFlag(allowAllSSLCertificatesFlag) // Facultatif : faux par défaut
.WithUseSystemProperties(useSystemProperties) // Facultatif : faux par défaut. Si cette valeur est fixée à true, toutes les configurations de proxy doivent être transmises en tant que propriétés du système
.WithProxyConfiguration(proxyConfig) // Facultatif : par défaut null. A transmettre si le proxy est requis et que useSystemProperties est défini sur false
.WithHeaders(headers) // Facultatif : carte vide par défaut. A transmettre si des en-têtes supplémentaires sont nécessaires à la requête
.Build() ;

OssClient ossClient = OSSAuthClientProvider.Instance.GetOssClient(config) ;
//procédez à des appels à notre API en utilisant ossClient

Dans les deux cas ci-dessus, le ossClient / eslClient sera mis en cache dans la mémoire et les SDK imposeront que les clients réutilisent le jeton oAuth2 et régénèrent un nouveau jeton lorsqu'il expire.

Community portal

Join the OneSpan Community

You’ll be able to ask questions on our forum, download sample code files, and stay up to date on OneSpan news.

Join now