Skip to main content

Simple authentication, authorization and parameters for Flask, emphasizing configurability

Project description

Flask Simple Auth

Simple authentication, authorization, parameter checks and utils for Flask, controled from Flask configuration and the extended route decorator.

Status Tests Coverage Issues Python Version Badges License

Contents: Example, Features, Documentation, License, Versions.

Example

The application code below performs authentication, authorization and parameter type checks triggered by the extended route decorator, or per-method shortcut decorators (get, patch, post…). There is no clue in the source about what kind of authentication is used, which is the point: authentication is managed in the configuration, not in the application code. The authorization rule is declared explicitely on each function with the mandatory authorize parameter. Path and HTTP/JSON parameters are type checked and converted automatically based on type annotations. Basically, you just have to implement a type-annotated Python function and most of the crust is managed by FlaskSimpleAuth.

from FlaskSimpleAuth import Flask
app = Flask("acme")
app.config.from_envvar("ACME_CONFIG")

@app.patch("/users/<id>", authorize="admin")
def patch_users_id(id: int, password: str, email: Email = None):
    # Admins can patch user *id* with a mandatory *password* and
    # an optional *email* parameter. Type conversions are performed
    # so that invalid values are rejected with a *400* automatically.
    return f"users {id} updated", 204

Authentication is manage from the application flask configuration with FSA_* (Flask simple authentication) directives from the configuration file (ACME_CONFIG):

FSA_AUTH = "httpd"     # inherit web-serveur authentication
# or others schemes such as: basic, token (eg jwt)…
# hooks must be provided for retrieving user's passwords and
# checking whether a user belongs to a group, if these features are used.

If the authorize argument is not supplied, the security first approach results in the route to be forbidden (403). Various aspects of the implemented schemes can be configured with other directives, with reasonable defaults provided so that not much is really needed beyond choosing the authentication scheme. Look at the demo application for a simple full-featured application.

Features

The module provides a wrapper around the Flask class which extends its capabilities for managing authentication, authorization and parameters. This is intended for a REST API implementation serving a remote client application through HTTP methods called on a path, with HTTP or JSON parameters passed in and a JSON result is returned: this help implement an authenticated function call over HTTP.

Authentication, i.e. checking who is doing the request, is performed whenever an authorization is required on a route. The module implements inheriting the web-server authentication, various password authentication (HTTP Basic, or HTTP/JSON parameters), tokens (custom or JWT passed in headers or as a parameter), a fake authentication scheme useful for local application testing, or relying on a user provided function to check a password or code. It allows to have a login route to generate authentication tokens. For registration, support functions allow to hash new passwords consistently with password checks. Alternate password checking schemes (eg temporary code, external LDAP server) can be plug in easily through a hook.

Authorizations, i.e. checking whether the above who can perform a request, are managed by mandatory permission declaration on a route (eg a role name, or an object access), and relies on supplied functions to check whether a user has this role or can access an object. Authorization can also be provided from a third party through JWT tokens following the OAuth2 approach.

Parameters expected in the request can be declared, their presence and type checked, and they are added automatically as named parameters to route functions, skipping the burden of checking them in typical flask functions. The module manages http, json and files. In practice, importing Flask's request global variable is not necessary anymore. The philosophy is that a REST API entry point is a function call through HTTP, so the route definition should be a function, avoiding relying on magic globals.

Utils include the convenient Reference class which allows to share possibly thread-local data for import, and CORS handling.

It makes sense to integrate these capabilities into a Flask wrapper so that only one extended decorator is needed on a route, meaning that the security cannot be forgotten, compared to an extension which would require additional decorators. Also, parameters checks are relevant to security in general and interdependent as checking for object ownership requires accessing parameters.

Note that web-oriented flask authentication modules are not really relevant in the REST API context, where the server does not care about presenting login forms or managing views, for instance. However, some provisions are made so that it can also be used for a web application: CORS, login page redirection…

Documentation

See the detailed documentation for how to best take advantage of this module.

License

This software is public domain.

All software has bug, this is software, hence… Beware that you may lose your hairs or your friends because of it. If you like it, feel free to send a postcard to the author.

Versions

Sources, documentation and issues are hosted on GitHub. Install package from PyPI.

Latest version is 21.1 published on 2023-01-31.

See all versions.

Project details


Release history Release notifications | RSS feed

This version

21.1

Download files

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

Source Distribution

FlaskSimpleAuth-21.1.tar.gz (62.6 kB view details)

Uploaded Source

Built Distribution

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

FlaskSimpleAuth-21.1-py3-none-any.whl (25.9 kB view details)

Uploaded Python 3

File details

Details for the file FlaskSimpleAuth-21.1.tar.gz.

File metadata

  • Download URL: FlaskSimpleAuth-21.1.tar.gz
  • Upload date:
  • Size: 62.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for FlaskSimpleAuth-21.1.tar.gz
Algorithm Hash digest
SHA256 e21bdd7c8746fcd9fee7b2bf241bbe60cad6bb156136a956f2072a7398c907cb
MD5 dd565c638973c755bbb5bd20b45c7b29
BLAKE2b-256 123a6611d0b20b6f06a5d6a7df66adf946d6f67072bc6cede31087cdfa2698e4

See more details on using hashes here.

File details

Details for the file FlaskSimpleAuth-21.1-py3-none-any.whl.

File metadata

  • Download URL: FlaskSimpleAuth-21.1-py3-none-any.whl
  • Upload date:
  • Size: 25.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for FlaskSimpleAuth-21.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dd20f4b1656c3f6cfe35030b522eebe61fdf60c9e0fa8a09872f247cb6f9bbd7
MD5 501dedaf50c54e650a0bca5f208b2758
BLAKE2b-256 0456da2e60df7cf3d12742dd52350bf6c0420d693ff2142cc1a18052812a64b5

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