Skip to main content

datasette-auth-tokens

PyPI Changelog Tests License

Datasette plugin for authenticating access using API tokens

Installation

Install this plugin in the same environment as Datasette.

$ pip install datasette-auth-tokens

Hard-coded tokens

Read about Datasette's authentication and permissions system.

This plugin lets you configure secret API tokens which can be used to make authenticated requests to Datasette.

First, create a random API token. A useful recipe for doing that is the following:

$ python -c 'import secrets; print(secrets.token_hex(32))'
5f9a486dd807de632200b17508c75002bb66ca6fde1993db1de6cbd446362589

Decide on the actor that this token should represent, for example:

{
    "bot_id": "my-bot"
}

You can then use "allow" blocks to provide that token with permission to access specific actions. To enable access to a configured writable SQL query you could use this in your metadata.json:

{
    "plugins": {
        "datasette-auth-tokens": {
            "tokens": [
                {
                    "token": {
                        "$env": "BOT_TOKEN"
                    },
                    "actor": {
                        "bot_id": "my-bot"
                    }
                }
            ]
        }
    },
    "databases": {
        ":memory:": {
            "queries": {
                "show_version": {
                    "sql": "select sqlite_version()",
                    "allow": {
                        "bot_id": "my-bot"
                    }
                }
            }
        }
    }
}

This uses Datasette's secret configuration values mechanism to allow the secret token to be passed as an environment variable.

Run Datasette like this:

BOT_TOKEN="this-is-the-secret-token" \
    datasette -m metadata.json

You can now run authenticated API queries like this:

$ curl -H 'Authorization: Bearer this-is-the-secret-token' \
  'http://127.0.0.1:8001/:memory:/show_version.json?_shape=array'
[{"sqlite_version()": "3.31.1"}]

Additionally you can allow passing the token as a query string parameter, although that's disabled by default given the security implications of URLs with secret tokens included. This may be useful to easily allow embedding data between different services.

Simply enable it using the param config value:

{
    "plugins": {
        "datasette-auth-tokens": {
            "tokens": [
                {
                    "token": {
                        "$env": "BOT_TOKEN"
                    },
                    "actor": {
                        "bot_id": "my-bot"
                    },
                }
            ],
            "param": "_auth_token"
        }
    },
    "databases": {
        ":memory:": {
            "queries": {
                "show_version": {
                    "sql": "select sqlite_version()",
                    "allow": {
                        "bot_id": "my-bot"
                    }
                }
            }
        }
    }
}

You can now run authenticated API queries like this:

$ curl http://127.0.0.1:8001/:memory:/show_version.json?_shape=array&_auth_token=this-is-the-secret-token
[{"sqlite_version()": "3.31.1"}]

Tokens from your database

As an alternative (or in addition) to the hard-coded list of tokens you can store tokens in a database table and configure the plugin to access them using a SQL query.

Your query needs to take a :token_id parameter and return at least two columns: one called token_secret and one called actor_* - usually actor_id. Further actor_ prefixed columns can be returned to provide more details for the authenticated actor.

Here's a simple example of a configuration query:

select actor_id, actor_name, token_secret from tokens where token_id = :token_id

This can run against a table like this one:

token_id token_secret actor_id actor_name
1 bd3c94f51fcd 78 Cleopaws
2 86681b4d6f66 32 Pancakes

The tokens are formed as the token ID, then a hyphen, then the token secret. For example:

  • 1-bd3c94f51fcd
  • 2-86681b4d6f66

The SQL query will be executed with the portion before the hyphen as the :token_id parameter.

The token_secret value returned by the query will be compared to the portion of the token after the hyphen to check if the token is valid.

Columns with a prefix of actor_ will be used to populate the actor dictionary. In the above example, a token of 2-86681b4d6f66 will become an actor dictionary of {"id": 32, "name": "Pancakes"}.

To configure this, use a "query" block in your plugin configuration like this:

{
    "plugins": {
        "datasette-auth-tokens": {
            "query": {
                "sql": "select actor_id, actor_name, token_secret from tokens where token_id = :token_id",
                "database": "tokens"
            }
        }
    },
    "databases": {
        "tokens": {
            "allow": {}
        }
    }
}

The "sql" key here contains the SQL query. The "database" key has the name of the attached database file that the query should be executed against - in this case it would execute against tokens.db.

Securing your tokens

Anyone with access to your Datasette instance can use it to read the token_secret column in your tokens table. This probably isn't what you want!

To avoid this, you should lock down access to that table. The configuration example above shows how to do this using an "allow": {} block. Consult Datasette's Permissions documentation for more information about how to lock down this kind of access.

Metadata

Release files for datasette-auth-tokens 0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for datasette-auth-tokens 0.3
File Size Uploaded Provenance Actions
datasette-auth-tokens-0.3.tar.gz 8.3 kB Without provenance Details for datasette-auth-tokens-0.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for datasette-auth-tokens 0.3
File Interpreter ABI Platform Actions
datasette_auth_tokens-0.3-py3-none-any.whl Python 3 none any Details for datasette_auth_tokens-0.3-py3-none-any.whl

Total release size: 17.0 kB

Release files / datasette-auth-tokens-0.3.tar.gz

Download URL datasette-auth-tokens-0.3.tar.gz
Size 8.3 kB
Tags Source
SHA-256 checksum
How to use checksums
526ce6f150e729e51c6df283238c58885a437eeb90d80a12357d4a454ba6f36e
BLAKE2b-256 checksum
How to use checksums
37e89232738f0a0e825be9dec92244b1fb48ec897b04dbd599237cf1e3239319
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

Release files / datasette_auth_tokens-0.3-py3-none-any.whl

Download URL datasette_auth_tokens-0.3-py3-none-any.whl
Size 8.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6318fa366e3c7d98f0e1f09f1918fab45b51d46087585642aa369627a612bd42
BLAKE2b-256 checksum
How to use checksums
b5207da7b8970560a98a7b604cddeb4ec834681f5778de5f8ec893d71b991a8a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

Security for datasette-auth-tokens 0.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page