

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Création de cookies signés avec PHP
<a name="signed-cookies-PHP"></a>

L’exemple de code suivant est similaire à celui indiqué dans [Créer une signature d’URL avec PHP](CreateURL_PHP.md), puisqu’il génère un lien vers une vidéo. Cependant, au lieu de signer l’URL dans le code, cet exemple signe les cookies avec la fonction `create_signed_cookies()`. Le joueur côté client utilise les cookies pour authentifier chaque demande auprès de la distribution. CloudFront

Cette approche est utile pour diffuser du contenu en continu, comme le HTTP Live Streaming (HLS) ou le Dynamic Adaptive Streaming over HTTP (DASH), où le client doit envoyer plusieurs demandes pour récupérer le manifeste, les segments et les ressources associées à la lecture. En utilisant des cookies signés, le client peut authentifier chaque demande sans avoir à générer une nouvelle URL signée pour chaque segment. 

**Note**  
La création d’une signature d’URL n’est qu’une partie du processus d’offre d’un contenu privé avec des cookies signés. Pour de plus amples informations, veuillez consulter [Utilisation de cookies signés](private-content-signed-cookies.md).



**Topics**
+ [Création de la signature RSA SHA-1 ou SHA-256](#create-rsa-sha-1signature-cookies)
+ [Création des cookies signés](#create-the-signed-cookie)
+ [Code complet](#full-code-signed-cookies)

Les sections suivantes décomposent l’exemple de code en plusieurs parties. Vous trouverez l’[exemple de code](#full-code-signed-cookies) complet ci-dessous.

## Création de la signature RSA SHA-1 ou SHA-256
<a name="create-rsa-sha-1signature-cookies"></a>

Cet exemple de code effectue les opérations suivantes :

1. La fonction `rsa_sha1_sign` hache et signe la déclaration de politique à l'aide de SHA-1. Pour utiliser SHA-256 à la place, utilisez la fonction rsa\$1sha256\$1sign illustrée ci-dessous. Les arguments requis sont une déclaration de politique et la clé privée qui correspond à une clé publique qui se trouve dans un groupe de clés approuvé pour votre distribution.

1. Ensuite, la fonction `url_safe_base64_encode` crée une version à URL sécurisée de la signature.

   ```
   function rsa_sha1_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid);
       openssl_free_key($pkeyid);
       return $signature;
   }
   
   function url_safe_base64_encode($value) {
       $encoded = base64_encode($value);
       return str_replace(
           array('+', '=', '/'),
           array('-', '_', '~'),
           $encoded);
   }
   ```

   La fonction suivante utilise SHA-256 au lieu de SHA-1 :

   ```
   function rsa_sha256_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
       openssl_free_key($pkeyid);
       return $signature;
   }
   ```

   La `rsa_sha256_sign` fonction est la même que`rsa_sha1_sign`, sauf qu'elle passe `OPENSSL_ALGO_SHA256` à`openssl_sign`. Lorsque vous utilisez SHA-256, incluez le `CloudFront-Hash-Algorithm` cookie avec une valeur de. `SHA256`

## Création des cookies signés
<a name="create-the-signed-cookie"></a>

Le code suivant construit et crée les cookies signés, en utilisant les attributs de cookie suivants : `CloudFront-Expires``CloudFront-Signature`, `CloudFront-Key-Pair-Id` et`CloudFront-Hash-Algorithm`. Le code utilise une politique personnalisée.

```
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}
```

Pour de plus amples informations, veuillez consulter [Définition de cookies signés utilisant une politique personnalisée](private-content-setting-signed-cookie-custom-policy.md).

## Code complet
<a name="full-code-signed-cookies"></a>

L'exemple de code suivant fournit une démonstration complète de la création de cookies CloudFront signés avec PHP. Vous pouvez télécharger l’exemple complet depuis le fichier [demo-php.zip](samples/demo-php.zip).

Dans l'exemple suivant, vous pouvez modifier l'`$policy Condition`élément pour autoriser à la fois les plages d' IPv6 adresses IPv4 et les plages d'adresses. Par exemple, consultez la section [Utilisation IPv6 des adresses dans les politiques IAM](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) du *guide de l'utilisateur d'Amazon Simple Storage Service*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid);
    openssl_free_key($pkeyid);
    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function rsa_sha256_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
    openssl_free_key($pkeyid);
    return $signature;
}

function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}



$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';
$base_url = 'https://d1234.cloudfront.net';

$expires = time() + 3600; // 1 hour from now

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];


// For HLS manifest and segments (using wildcard)
$hls_resource = $base_url . '/sign/*';
$signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip, 'SHA256');

// Set the cookies
$cookie_domain = parse_url($base_url, PHP_URL_HOST);
foreach ($signed_cookies as $name => $value) {
    setcookie($name, $value, $expires, '/', $cookie_domain, true, true);
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>CloudFront Signed HLS Stream with Cookies</title>
</head>
<body>
    <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1>
    <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2>
    
    <div id='hls-video'>
        <video id="video" width="640" height="360" controls></video>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var video = document.getElementById('video');
        var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8';
        
        if (Hls.isSupported()) {
            var hls = new Hls();
            hls.loadSource(manifestUrl);
            hls.attachMedia(video);
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = manifestUrl;
        }
    </script>
</body>
</html>
```

Au lieu d'utiliser des cookies signés, vous pouvez utiliser des cookies signés URLs. Pour de plus amples informations, veuillez consulter [Créer une signature d’URL avec PHP](CreateURL_PHP.md).