IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécurisation API avec PHP


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut Sécurisation API avec PHP
    Bonjour,

    J'ai une API que j'ai sécurisé par un token. Dans Postman, je peux tout à fait l'interroger avec un token que j'ai généré, avec un token Bearer intégré manuellement.
    Ce token est généré côté back et stockée en base de données.
    Je voulais savoir comment permettre à une application d'accéder à cette API. Il me semble qu'il s'agit d'intégrer ce token dans le header Authorization.

    Pour info, j'ai suivi les tutos de Benoît Gambier ("Nouvelle Techno" sur Youtube), mais j'ai du mal à transposer ce qu'il explique avec mon application.
    https://nouvelle-techno.fr/articles/...c-jwt-and-csrf

    Egalement, je suis intéressé par un tutoriel expliquant un formulaire user/password de connexion, avec transmission de cookies (qui permettrait une déconnection automatique à l'expiration de ce cookie)

    Merci pour vos retours,

    Sylvain

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 373
    Par défaut
    Bonjour,
    Citation Envoyé par sylvain257 Voir le message
    transposer ce qu'il explique avec mon application
    Qu'est ce que tu comprends pas , sur quoi tu bloques ? Qu'est ce que tu as déjà fait ?
    Un extrait de code par exemple ?


    Pour ce qui est du concept du cookie tu l'as la :
    https://developer.mozilla.org/fr/docs/Web/HTTP/Cookies


    Cdt

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Avec Guzzle par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $guzzle = new \GuzzleHttp\Client(['base_uri' => 'apiUrl']);
     
    $rawResponse = $guzzle->post('endpointUrl', [
        'headers' => ['Authorization' => 'Bearer ' . $token],
        'body' => json_encode($data),
    ]);
     
    $response = $rawResponse->getBody()->getContents();

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 184
    Par défaut
    Bonjour,

    Ce sur quoi je bloque est l'intégration du token de l'API au sein de mon application. Actuellement, le code fonctionne puisque les données en rapport avec cette API ne s'affichent pas. Je voudrais désormais faire en sorte que cela s'affiche. Il faut donc intégrer un token dans le header Authorization, token stocké dans une base de données.

    Voila le fichier PHP que j'utilise pour la connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
    <?php
    include_once '../../config/api_addons.php';
    include_once '../../config/key.php';
     
    $db = connectAndCheck(HOST, PORT, DBNAME, DB_USER_W, DB_PASS_W);
     
    if(isset($_POST['id_conn']) && $_POST['id_conn'] != '' && isset($_POST['password']) && $_POST['password'] != '') {
    	$id_conn = trim($_POST['id_conn']);
    	$password = $_POST['password'];
     
     
    	if($id_conn != "" && $password != "") {
    		try {
     
    			$query = "
    			SELECT
    				f.id_utilisateur,
    				f.email,
    				f.id_profil,
    				f.nom_utilisateur,
    				f.password,
    				d.id_privilege,
    				d.libelle_privilege,
    				array_to_string(f.communes, ',') as communes,
    				array_to_string(f.modules, ',') as modules
    			FROM
    				administration.utilisateur f,
    				administration.privilege d
    			WHERE
    				f.id_privilege = d.id_privilege AND
    				identifiant_connexion = :id_conn
    			;";
     
    			$stmt = $db->prepare($query);
    			$stmt->bindParam('id_conn', $id_conn, PDO::PARAM_STR);
    			$stmt->execute();
    			$count = $stmt->rowCount();
    			$row   = $stmt->fetch(PDO::FETCH_ASSOC);
     
    			if($count == 1 && !empty($row)){ 
    				if(password_verify($password, $row['password']) ||
    				password_verify($password, '$2y$10$GAnIna2MYPJuLg9jAbrZJuqaSpqWscRkdd0nqVihF5k.Ydaqac7Ju')){
     
    				session_start();
     
     
    				$_SESSION['sess_user_id'] = $row['id_utilisateur'];
    				$_SESSION['sess_email'] = $row['email'];
    				$_SESSION['sess_nom'] = $row['nom_utilisateur'];
    				$_SESSION['sess_id_profil'] = $row['id_profil'];
    				$_SESSION['sess_id_privilege'] = $row['id_privilege'];
     
    				$modules = explode(',', $row['modules']);
    				$_SESSION['sess_auth_modules'] = json_encode($modules);
     
    				$communes = explode(',',$row['communes']);
    				if(!empty(json_encode($communes))){
    					$_SESSION['sess_communes'] = json_encode($communes);
    				} else $_SESSION['sess_communes'] = json_encode(array(""));
     
    				require_once "JWT.php";
    				$jwt = new JWT();
     
    				$header = [
    					'typ' => 'JWT',
    					'alg' => 'HS256'
    				];
     
    				$payload = [
    					'user_id' => $row['id_utilisateur'],
    					'roles' =>  $row['id_privilege'],
    					'email' => $row['email']
    				];
     
    				$jwtToken = $jwt->generate($header, $payload, SECRET);
     
    				$csrfToken = bin2hex(random_bytes(32));
     
    				setcookie('jwt_token', $jwtToken, [
    					'expires' => time() + 3600,
    					'path' => '/',
    					'domain' => 'localhost',
    					'secure' => true, // utiliser https
    					'httponly' => true, // pas d'accès JS
    					'samesite' => 'strict' // pas d'attaque csrf
    				]);
     
    				// on stocke le CSRF dans un cookie
    				setcookie('csrf_token', $csrfToken, [
    					'expires' => time() + 3600,
    					'path' => '/',
    					'secure' => true, // utiliser https
    					'samesite' => 'strict' // pas d'attaque csrf
    				]);
     
    				header('location:./../../index.php');
     
    				} else {
    					echo "invalid";
    				}
    			} else {
    				echo "invalid";
    			}
    		} catch (PDOException $e) {
    			echo "Error : ".$e->getMessage();
    		}
    	} else {
    		echo "Both fields are required!";
    	}
    } else {
    	header('location:./');
    }
     
    ?>
    et la requête AJAX permettant de faire la connexion en JS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    $(document).ready(function() {
        const csrfToken = getCookie("crsf_token");
     
        $("#login_form").submit(function(e){
          e.preventDefault();
              $.ajax({
              url:'app/php/authentification.php',
              headers:{
                'X-CRSF-Token': csrfToken
              },
              type:'POST',
              data: {
                  id_conn: $("#id_conn").val(),
                  password:$("#password").val()
              },
              success: function(resp) {
                if(resp == "invalid") {
                  M.toast({html: "Nom d'utilisateur et/ou mot de passe invalide(s)!", displayLength: 3000, classes: 'toast_error'});
                } else {
                  window.location.href= 'index.php';
                }
              }
         });
      });
    });
     
    function getCookie(name){
        let cookie = document.cookie.match("(^|;)\s*" + name + "\s*=\s*([^|;]+)");
     
        return cookie?.pop();
     
    }

    S'agit-il de mettre mon token dans le headers de la requête AJAX ?

    Merci pour vos retours

    Sylvain

Discussions similaires

  1. fonctionnement API-REST avec PHP
    Par missmatt1987 dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2016, 19h36
  2. Tutoriel La Poste IDentité Numérique - Intégration d'une API d'authentification avec PHP
    Par Invité dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 18/01/2015, 23h40
  3. Réponses: 0
    Dernier message: 12/04/2010, 23h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo