Upload control with signed uploads
Signed uploads allow you to control who can upload files to your Uploadcare
project and when. You need to generate a
signature on your backend, and a trusted user should use this signature
to upload a new file. It works with File Uploader,
jQuery File Uploader (deprecated), and Upload API.
Turning signed uploads on
Signed uploads can be turned on and off to an Uploadcare project, because it has a dedicated storage, Public and Private keys, and security settings.
- Go to your Dashboard and select an existing project or create a new one.
- Click Enable next to Signed Uploads in the uploading settings.
From now on, every request to Upload API should include a signature part.
However, you’ll still be able to upload files to your project via the Dashboard.
Signature generation
The signature string is sent along with your upload request.
To generate it, you need the secret key of your Uploadcare project,
which you can get from the API keys section.
The signature is an HMAC-SHA256 hash, hex-encoded:
- Key: your project’s secret key
- Message: the
expirevalue as a string
The output is a hex-encoded digest. Here’s how to generate the signature on your backend:
JavaScript
NodeJS
Python
Ruby
Elixir
Expiration
The expire value is a Unix timestamp in seconds that defines when the signature expires. A common mistake is passing milliseconds instead of seconds — this will cause every upload to fail with [HTTP 400] 'expire' must be a UNIX timestamp.
The expire function in the Python example above adds a certain duration after
the generation time. In this case, 30 minutes:
Signed upload example
To generate a signed upload, you need to pass 3 parameters:
YOUR_PUBLIC_KEYsignatureexpire
Request:
Response:
To work with File Uploader, specify the secure signature and secure expire options.
Possible errors
Both signature and an active expire are required for every upload request
and should be valid. The list of possible errors:
If expire is not a valid Unix timestamp:
If your signature has expired, i.e., expire < now:
If signature is incorrect: