Skip to main content
https://travis-ci.org/globocom/alf.svg?branch=master

Python OAuth 2 Client

alf is an OAuth 2 Client based on requests.Session with seamless support for the Client Credentials Flow.

/assets/alf.jpeg?raw=true

Features

  • Automatic token retrieving and renewing

  • Token expiration control

  • Automatic token storage

  • Automatic retry on status 401 (UNAUTHORIZED)

Usage

Initialize the client and use it as a requests.Session object.

from alf.client import Client

alf = Client(
    token_endpoint='http://example.com/token',
    client_id='client-id',
    client_secret='secret')

resource_uri = 'http://example.com/resource'

alf.put(
    resource_uri, data='{"name": "alf"}',
    headers={'Content-Type': 'application/json'})

alf.get(resource_uri)

alf.delete(resource_uri)

Using your custom token storage

Now passing an object with get and set attributes you can store or retrieve a token.

This object can be a Redis, Memcache or your custom object.

from alf.client import Client
from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0)

alf = Client(
    token_endpoint='http://example.com/token',
    client_id='client-id',
    client_secret='secret',
    token_storage=redis)

resource_uri = 'http://example.com/resource'

alf.put(
    resource_uri, data='{"name": "alf"}',
    headers={'Content-Type': 'application/json'})

alf.get(resource_uri)

alf.delete(resource_uri)

How does it work?

Before the request, a token will be requested on the authentication endpoint and a JSON response with the access_token and expires_in keys will be expected.

Multiple attempts will be issued after an error response from the endpoint if the token_retries argument is used. Check token-retrying for more info.

alf keeps the token until it is expired according to the expires_in value.

The token will be used on a Bearer authorization header for the original request.

GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer token-12312

If the request fails with a 401 (UNAUTHORIZED) status, a new token is retrieved from the endpoint and the request is retried. This happens only once, if it fails again the error response is returned.

The token will be reused for every following request until it is expired.

Token Retrying

The client supports the retry interface from urllib3 to repeat attempts to retrieve the token from the endpoint.

The following code will retry the token request 5 times when the response status is 500 and it will wait 0.3 seconds longer after each error (known as backoff).

from requests.packages.urllib3.util import Retry
from alf.client import Client

alf = Client(
    token_endpoint='http://example.com/token',
    client_id='client-id',
    client_secret='secret',
    token_retry=Retry(total=5, status_forcelist=[500], backoff_factor=0.3))

Workflow

/assets/workflow.png?raw=true

Troubleshooting

In case of an error retrieving a token, the error response will be returned, the real request won’t happen.

Metadata

Release files for alf 0.7.1

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

Source distribution (sdist)

Source distribution for alf 0.7.1
File Size Uploaded Provenance
alf-0.7.1.tar.gz 7.9 kB Without provenance Details

Release files / alf-0.7.1.tar.gz

Download URL alf-0.7.1.tar.gz
Size 7.9 kB
Tags Source
SHA-256 checksum
How to use checksums
539b1bb6f93794bee79556ca84dfd0ea1f23d89a797361417d5cbfc3d4bdd2d7
BLAKE2b-256 checksum
How to use checksums
77f00a3f773026a98d01799879bc3071c396df75c14641b48b8450925a37cf09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for alf 0.7.1

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.

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