loader-logo

Autorisation centralisée Oauth 2 avec Spring Boot 2.0.2 et Spring Security 5 et magasin de jetons JDBC

Dans cet article, nous verrons comment utiliser Spring Boot 2 avec Spring Security 5 OAuth2 pour implémenter un serveur d’autorisation pour une autorisation centralisée et comment l’administrer via une GUI. Une démonstration du serveur de ressource sera également fournie ainsi que le projet entier sous GitHub.

De nombreux exemples couvrent l’implémentation de Oauth2 à l’aide de jetons en mémoire basés sur les versions antérieures de Spring Boot 2 et de Spring Security 2. Il est donc conseillé d’utiliser une base de données MySql en tant que magasin de jetons.

Pour approfondir le sujet, nous devrons :

  • Configurer Spring Security
  • Configurer la base de données
  • Créer un serveur d’autorisations
  • Créer un serveur de ressource
  • Obtenir une ressource sécurisée à l’aide d’un jeton d’accès avec un curl client

Qu’est-ce que Oauth2 ?

Oauth 2.0 est le protocole standard pour l’autorisation. Oauth 2.0 remplace le travail effectué sur le protocole original créé en 2006.

Oauth 2.0 met l’accent sur la simplicité du développeur client tout en fournissant des flux d’autorisation spécifiques pour les applications Web, les applications bureau, les téléphones mobiles et les appareils de salon. Cette spécification et ses extensions sont en cours de développement au sein du groupe de travail IETF Oauth.

Les rôles d’Ouate 2

Oauth 2 définit 4 rôles :

  • Propriétaire de ressource : généralement vous-même
  • Serveur de ressource : serveur hébergeant des données protégées ( par exemple, Google hébergeant votre profil et vos informations personnelles )
  • Client : application demandant l’accès à un serveur de ressources ( site web, application Javascript ou application mobile,… )
  • Serveur d’autorisations : serveur émettant un jeton d’accès au client. Ce jeton sera utilisé pour que le client demande le serveur de ressource. Ce serveur peut-être identique au serveur de ressources ( même serveur physique et même application ), et c’est souvent le cas.

La figure suivante illustre le flux de rôles :

Oauth 2 rôles

Les types de subventions : 

Oauth 2 fournit plusieurs « types de subvention » pour différents cas d’utilisation.

Les types de subvention définis sont :

  • Code d’autorisation : l’attribution du code d’autorisation est la fonctionnalité permettant de se connecter à une application à l’aide de votre compte Facebook ou Google.
  • Mot de passe : il est destiné aux clients basés sur un agent utilisateur ( applications web à page unique, par exemple ) qui ne peuvent pas garder un client confidentiel. Ensuite, au lieu du serveur d’autorisation retournant un code d’autorisation qui est échangé contre un jeton d’accès, dans le cas d’octroi d’autorisation, il renvoie un jeton d’accès.
  • Informations d’identification du client : le client peut demander un jeton d’accès en utilisant uniquement ses informations d’identification ( ou un autre moyen d’authentification pris en charge ) quand le client demande l’accès aux ressources protégées sous son contrôle, ou ceux d’un autre propriétaire de ressource qui ont été précédemment arrangés avec le serveur d’autorisation.
  • Implicite : l’octroi implicite est un flux de code d’autorisation simplifié optimisé pour les clients implémentés dans un navigateur utilisant un langage script tel que JavaScript. Dans le flux implicite, au lieu d’émettre au client un code d’autorisation, le client reçoit directement un jeton d’accès.

Démonstration :

Mettons les mains à la pâte

Couche métier

 Pour des raisons de simplicité, notre application métier principale sera une API de produit utilisant une seule entité et nos règles d’accès seront les suivantes :

  • PRODUCT_CREATE
  • PRODUCT_UPDATE
  • PRODUCT_DISPLAY
  • PRODUCT_ADMIN

Configuration client OAuth2

 Pour la configuration client Oauth 2, nous devons créer les tableaux suivants : ( voir les liens pour plus de détails )

  • OAUTH_CLIENT_DETAILS
  • OAUTH_CLIENT_TOKENS
  • OAUTH_ACCESS_TOKEN
  • OAUTH_REFRESH_TOKEN
  • OAUTH_CODE
  • OAUTH_APPROVALS

Nous appellerons un serveur de ressource comme « product_api ». Pour ce serveur, nous définissons un client appelé :

  • read-write-client ( types de subventions autorisées : read, write )

 Configuration autorités et utilisateurs

 Spring Security est livré avec deux interfaces utiles :

  • UserDetails — fournit des informations sur l’utilisateur principal
  • GrantedAuthority — représente une autorité accordée à un objet d’Authentification.

Ci-dessous, le script qui chargera toutes les autorités et les informations d’identification (utilisateurs) :

Couche API

Pour la démonstration, une application RESTful est développée sur la base de Spring Boot et expose les points de terminaison suivants :

Configuration Spring Security

 Nous devons fournir une implémentation de l’interface UserDetailsService afin d’obtenir les informations d’identification et autorités de nos utilisateurs comme suit :

Pour sécuriser l’application, nous utiliserons les annotations @EnableWebSecurity et WebSecurityConfigurerAdapter

Après une configuration réussie, exécutez le serveur d’autorisation, vous obtiendrez la page de connexion pour administrer le serveur d’autorisation.

Utilisez oauth_admin/ user comme nom d’utilisateur/ mot de passe pour accéder au tableau de bord Oauth2 où vous pouvez créer vos clients serveur.

Serveur Ressource

Un serveur de ressources héberge des ressources protégées par le jeton OAuth2 (il s’agit en fait de notre Product API ).

Testez le final de la liste de produits avec le Curl client suivant:

#!/bin/sh

TOKEN=`curl -s -u curl_client:user -X POST localhost:8081/oauth/token?grant_type=client_credentials | egrep -o ‘[a-f0–9-]{20,}’`

echo “ tGot token for curl client as :$TOKEN”

curl localhost:8083/product/products -H “Authorization: Bearer $TOKEN”

et la réponse vient après avoir exécuté le script bash du Curl client:

$ ./client.sh

Got token for curl client as : 3be01519–0cab-4049-b87d-617c48bda502

[{“version”:0,”name”:”product_1″,”available”:false},{“version”:0,”name”:”product_2″,”available”:true}]

Partager sur facebook
Partager sur twitter
Partager sur linkedin
Partager sur pinterest
Partager sur whatsapp

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Sélectionnez votre pays et votre langue​

Maroc

Tunis

Allemagne

Switzerland

France

Global