secure-link
Version:
Functions to generate and validate resource access tokens.
70 lines (53 loc) • 2.08 kB
Markdown
# secure-link
Paid digital content and user-uploaded content require access control. To implement authorization, it's common to
generate a token, which is appended to the resource's location as a query string parameter. This module provides
functions to generate secure access tokens, which can be used with Nginx, Cloudflare, Fastly or your own application.
## Installation
```sh
npm install secure-link
```
## Usage
### Nginx
To generate a token, pass the resource's location and a secret key to the `generateNginxAccessToken`
function. It optionally accepts a `lifetime` parameter, which will determine the date after which the
token should be considered expired. It must be set in seconds since the epoch. For more information, check
out the [ngx_http_secure_link_module](http://nginx.org/en/docs/http/ngx_http_secure_link_module.html)
documentation.
```javascript
const { generateNginxAccessToken } = require('secure-link');
const timeInSeconds = Math.round(Date.now() / 1000);
const expirationTime = timeInSeconds + 86400;
const options = {
secret: process.env.SECRET_KEY,
path: '/secure/statement.pdf',
lifetime: expirationTime
};
const token = generateNginxAccessToken(options);
```
From there, you can append the token as a query string parameter.
```javascript
const url = `https://cdn.example.com/secure/statement.pdf?token=${token}&expires=${expirationTime}`;
```
To validate the token when a request is received, you can hash the request URL and secret in a
location block. The `secure_link_md5` directive matches the format used by `generateNginxAccessToken`
internally when creating tokens. Replace `secret` with the secret used to create the token to ensure
the hashes are the same.
```nginx
location /secure {
secure_link $arg_token,$arg_expires;
secure_link_md5 "$uri$secure_link_expires secret";
# Token mismatch
if ($secure_link = "") {
return 403;
}
# Token expired
if ($secure_link = "0") {
return 410;
}
alias /path/to/directory;
}
```
### Cloudflare
Coming soon...
### Fastly
Coming soon...