# URL pré-signée

Le service de stockage **Stockage Objet** de cegedim.cloud prend en charge la génération d'URL pré-signées afin d'accorder l'accès aux objets sans avoir besoin d'authentification.

Les URL pré-signées sont utilisées pour fournir un accès à durée limitée, à un objet privé dans votre **Bucket** S3. Ils fonctionnent en ajoutant une `Access key`, une date d'expiration et une signature (**Sigv4**) comme paramètres de requête à l'objet S3.

Il y a deux cas d'utilisation courants où vous pouvez les utiliser :

* Partage simple et occasionnel d'objets.
* Accès fréquent et programmatique pour visualiser un objet dans une application
* Accès fréquent et programmatique au téléchargement d'un objet par l'intermédiaire d'une application

## Générer une URL pré-signée (téléchargement) <a href="#presignedurls-generationduneurls3presignee" id="presignedurls-generationduneurls3presignee"></a>

{% hint style="info" %}
Nous utilisons les utilitaires **aws s3** et **aws s3api** issues du client S3 **AWSCLIv2** sur Linux. **`${S3_ENDPOINT}`** et **`${S3_PROFILE}`** sont des variables d'environnement.
{% endhint %}

{% code overflow="wrap" %}

```bash
aws s3 --endpoint-url=${S3_ENDPOINT} presign s3://bucket-test/feather.ttf --expires-in 600 --profile ${S3_PROFILE}
```

{% endcode %}

{% code title="résultat" overflow="wrap" %}

```
https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=S4jFPas53s8cnwdDieMHrhc0ddE%3D&Expires=1666821099
```

{% endcode %}

Dans cet exemple, l'URL générée a une expiration de **10 minutes.** Passé ce délai, l'objet ne sera plus accessible, via cette URL.

{% hint style="info" %}
**--expires-in** : Nombre de secondes avant l'expiration de l'URL pré-signée.\
La valeur par défaut est de 3600 secondes.\
Le délai maximal d'expiration est de **7 jours** (604800 secondes).
{% endhint %}

## Générer une URL pré-signée (téléversement)

{% hint style="danger" %}
Si un objet ayant la même clé existe déjà dans le bucket spécifié dans l'URL pré-signée, l'objet existant sera remplacé.
{% endhint %}

{% hint style="info" %}
**aws** s3 et aws **s3api** ne supportent pas la génération d'url pré-signées pour l'upload.

Vous devez utiliser AWS SDK pour créer une url pré-signée pour l'upload.

Ci-dessous, un exemple simple utilisant \[AWS SDK pour Python (Boto3)][(https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
{% endhint %}

{% hint style="info" %}
L'URL pré-signée d'upload ne fonctionne qu'avec un adressage de **type chemin**.

Remplacez `aws_access_key_id` et `aws_secret_access_key` par vos propres identifiants.

`ExpiresIn` (entier) : Nombre de secondes avant l'expiration de l'URL pré-signée. La valeur par défaut est de 3600 secondes. Le délai d'expiration maximal est de 7 jours.
{% endhint %}

```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import boto3
from botocore.client import Config
s3 = boto3.client('s3')
s3 = boto3.client(
    's3',
    aws_access_key_id='xxxxx',
    aws_secret_access_key='xxxxx',
    config=Config(s3={'addressing_style': 'path'}),
    endpoint_url='https://storage-eb4.cegedim.cloud'
)
bucket = "bucket-test"
key = "feather.ttf"

print(s3.generate_presigned_url('put_object', Params={'Bucket':bucket,'Key':key}, ExpiresIn=300, HttpMethod='PUT'))
```

```sh
# Output

# Run Python script
./create_presign_url_upload.py

#Ouput
https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=NI%2BvoHYhWEFPDR04ioeFfBz5fks%3D&Expires=1712056959
```

Vous pouvez utiliser un outil tel que `curl` pour télécharger votre fichier dans le bucket, en utilisant l'URL générée précédemment :

```sh
curl --request PUT --upload-file feather.ttf 'https://storage-eb4.cegedim.cloud/bucket-test/feather.ttf?AWSAccessKeyId=fzs37xbv5615hygx2wkm&Signature=NI%2BvoHYhWEFPDR04ioeFfBz5fks%3D&Expires=1712056959'
```
