Skip to main content

Python connector for services provided by AQT

Project description

aqt-connector

License

AQT logo

An SDK and lightweight CLI to authenticate with AQT's Arnica platform using OIDC (Auth0).

It supports:

  • Device Authorization Flow (QR code + verification URL)
  • Client Credentials Flow (machine-to-machine)
  • Local token storage and verification against JWKS
  • Simple Python API and a small CLI (via python -m aqt_connector)

Unless you were explicitly sent here, you probably want to instead use an AQT provider for another library, where this library has already been integrated. We already have those for:

Requirements

  • Python >= 3.9, < 3.14

Installation

pip install aqt-connector

Quickstart

Python API

from aqt_connector import ArnicaApp, ArnicaConfig, log_in, get_access_token

# Configure (use client credentials OR device flow)
config = ArnicaConfig()

# Option A: client credentials
# config.client_id = "YOUR_CLIENT_ID"
# config.client_secret = "YOUR_CLIENT_SECRET"

# Option B: device flow (no client credentials set)

# Optional: change base API URL
# config.arnica_url = "https://arnica.aqt.eu/api"

app = ArnicaApp(config)

# Acquire token (stored by default when obtained)
token = log_in(app)
print("Access token:", token[:10] + "…")

# Later, get current token (if still valid and stored)
maybe_token = get_access_token(app)

CLI: log in

The CLI is exposed via the module entry point. Run:

python -m aqt_connector --help
python -m aqt_connector log-in

By default, this starts the device flow and prints a QR code and verification URL. Once you complete the flow in your browser, an ID token is obtained, verified, and stored locally.

You can also provide client credentials (machine-to-machine):

python -m aqt_connector log-in \
    --client-id YOUR_CLIENT_ID \
    --client-secret YOUR_CLIENT_SECRET

Optional override of the Arnica API URL:

python -m aqt_connector log-in --arnica-url https://arnica.aqt.eu/api

Where are things stored?

  • When using the CLI, configuration and the token are stored in your OS application directory for "aqt" (e.g. Linux: ~/.config/aqt; macOS: ~/Library/Application Support/aqt; Windows: %APPDATA%\aqt).
  • The token is saved as a file named access_token in that directory.

Configuration

The SDK loads configuration from two places, in this order of precedence (last wins):

  1. A local config file at {app_dir}/config
  2. Environment variables prefixed with AQT_

app_dir defaults to:

  • Library usage (Python API): ~/.aqt
  • CLI usage: your OS app directory for "aqt" (see Quickstart)

Config file (TOML)

Create a file named config in the app_dir or a custom location which you then pass to the ArnicaConfig (config = ArnicaConfig("~/myconfig")). TOML dotted keys or tables are supported. Example:

[default]
arnica_url = "https://arnica.aqt.eu/api"
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
store_access_token = true

Notes:

  • store_access_token=true will persist the obtained token to {app_dir}/access_token
  • To disable persistence, set store_access_token=false in this file

Environment variables

Environment variables use the AQT_ prefix and map to the same lowercase keys. Examples:

  • AQT_ARNICA_URL
  • AQT_CLIENT_ID
  • AQT_CLIENT_SECRET
  • AQT_STORE_ACCESS_TOKEN

Tip: Prefer the config file to disable persistence reliably (see notes above).

Testing

Install the dependencies

uv sync --group test

Unit tests:

pytest -q tests/commit

Integration tests (require Auth0 test credentials and a browser via Playwright):

# Required environment variables
# AUTH0_TEST_TENANT_DOMAIN
# AUTH0_TEST_CLIENT_CREDENTIALS_AUDIENCE
# AUTH0_TEST_CLIENT_CREDENTIALS_CLIENT_ID
# AUTH0_TEST_CLIENT_CREDENTIALS_CLIENT_SECRET
# AUTH0_TEST_DEVICE_FLOW_CLIENT_ID
# AUTH0_TEST_DEVICE_FLOW_USER_EMAIL
# AUTH0_TEST_DEVICE_FLOW_USER_PASSWORD

pytest -q tests/integration

Contributing

Issues and PRs are welcome. For local development, we use UV to manage virtual environments and install the package:

uv sync  # includes dev tools by default

Run linters and tests before submitting changes.

uvx pyproject-fmt pyproject.toml --check
uvx ruff check
uvx typos
uvx ruff format --check
uv run mypy .

License

Copyright (c) Alpine Quantum Technologies GmbH.

This software is licensed under the Apache License 2.0. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aqt_connector-0.3.0.tar.gz (147.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aqt_connector-0.3.0-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file aqt_connector-0.3.0.tar.gz.

File metadata

  • Download URL: aqt_connector-0.3.0.tar.gz
  • Upload date:
  • Size: 147.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for aqt_connector-0.3.0.tar.gz
Algorithm Hash digest
SHA256 b31eb30642490e1d99c814135fcf65ae35f2b68cd16eb1dfeb9f13c2a6b90510
MD5 ebbaea89329b19624f9ba8d880eff5c8
BLAKE2b-256 bbed6cdfe418fe90d9bbdae6a5d9c40c0756d0ea7192c874f919fc87e0ba537b

See more details on using hashes here.

File details

Details for the file aqt_connector-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: aqt_connector-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for aqt_connector-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 da7b3c7ccaf7dcefe251d35de5ace2e9b151f61f87a04f2770238e7d5cdfe9f6
MD5 ecc17ae1ce585a7e15f1bef4691f800e
BLAKE2b-256 707b5d261b511463a95088beb5298f32c151ff6528b73d8101faffd76c9c841f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page