oracular (3) flask-httpauth.3.gz

Provided by: python3-flask-httpauth_4.8.0-1_all bug

NAME

       flask-httpauth - Flask-HTTPAuth Documentation

       Flask-HTTPAuth is a Flask extension that simplifies the use of HTTP authentication with Flask routes.

BASIC AUTHENTICATION EXAMPLES

       The following example application uses HTTP Basic authentication to protect route '/':

          from flask import Flask
          from flask_httpauth import HTTPBasicAuth
          from werkzeug.security import generate_password_hash, check_password_hash

          app = Flask(__name__)
          auth = HTTPBasicAuth()

          users = {
              "john": generate_password_hash("hello"),
              "susan": generate_password_hash("bye")
          }

          @auth.verify_password
          def verify_password(username, password):
              if username in users and \
                      check_password_hash(users.get(username), password):
                  return username

          @app.route('/')
          @auth.login_required
          def index():
              return "Hello, {}!".format(auth.current_user())

          if __name__ == '__main__':
              app.run()

       The  function decorated with the verify_password decorator receives the username and password sent by the
       client. If the credentials belong to a user, then the function should return  the  user  object.  If  the
       credentials  are  invalid the function can return None or False. The user object can then be queried from
       the current_user() method of the authentication instance.

DIGEST AUTHENTICATION EXAMPLE

       The following example uses HTTP Digest authentication:

          from flask import Flask
          from flask_httpauth import HTTPDigestAuth

          app = Flask(__name__)
          app.config['SECRET_KEY'] = 'secret key here'
          auth = HTTPDigestAuth()

          users = {
              "john": "hello",
              "susan": "bye"
          }

          @auth.get_password
          def get_pw(username):
              if username in users:
                  return users.get(username)
              return None

          @app.route('/')
          @auth.login_required
          def index():
              return "Hello, {}!".format(auth.username())

          if __name__ == '__main__':
              app.run()

TOKEN AUTHENTICATION EXAMPLE

       The following example application uses a custom HTTP authentication scheme to protect route  '/'  with  a
       token:

          from flask import Flask
          from flask_httpauth import HTTPTokenAuth

          app = Flask(__name__)
          auth = HTTPTokenAuth(scheme='Bearer')

          tokens = {
              "secret-token-1": "john",
              "secret-token-2": "susan"
          }

          @auth.verify_token
          def verify_token(token):
              if token in tokens:
                  return tokens[token]

          @app.route('/')
          @auth.login_required
          def index():
              return "Hello, {}!".format(auth.current_user())

          if __name__ == '__main__':
              app.run()

       The  HTTPTokenAuth  is a generic authentication handler that can be used with non-standard authentication
       schemes, with the scheme name given as an  argument  in  the  constructor.  In  the  above  example,  the
       WWW-Authenticate header provided by the server will use Bearer as scheme:

          WWW-Authenticate: Bearer realm="Authentication Required"

       The  verify_token  callback  receives  the  authentication  credentials  provided  by  the  client on the
       Authorization header. This can be a simple token, or can contain multiple arguments, which  the  function
       will  have  to parse and extract from the string. As with the verify_password, the function should return
       the user object if the token is valid.

       In the examples directory you can find a complete example that uses JWS tokens. JWS tokens are similar to
       JWT tokens. However using JWT tokens would require an external dependency.

USING MULTIPLE AUTHENTICATION SCHEMES

       Applications  sometimes  need  to  support  a  combination  of authentication methods. For example, a web
       application could be authenticated by sending client id and secret over basic authentication, while third
       party  API  clients use a JWS or JWT bearer token. The MultiAuth class allows you to protect a route with
       more than one authentication object. To grant access to the endpoint, one of the  authentication  methods
       must validate.

       In the examples directory you can find a complete example that uses basic and token authentication.

USER ROLES

       Flask-HTTPAuth includes a simple role-based authentication system that can optionally be added to provide
       an additional layer of granularity in filtering accesses to routes.  To  enable  role  support,  write  a
       function  that  returns  the  list  of  roles  for  a  given user and decorate it with the get_user_roles
       decorator:

          @auth.get_user_roles
          def get_user_roles(user):
              return user.get_roles()

       To restrict access to a route to users having a given role, add the role argument to  the  login_required
       decorator:

          @app.route('/admin')
          @auth.login_required(role='admin')
          def admins_only():
              return "Hello {}, you are an admin!".format(auth.current_user())

       The  role  argument can take a list of roles, in which case users who have any of the given roles will be
       granted access:

          @app.route('/admin')
          @auth.login_required(role=['admin', 'moderator'])
          def admins_only():
              return "Hello {}, you are an admin or a moderator!".format(auth.current_user())

       In the most advanced usage, users can be filtered by having multiple roles:

          @app.route('/admin')
          @auth.login_required(role=['user', ['moderator', 'contributor']])
          def admins_only():
              return "Hello {}, you are a user or a moderator/contributor!".format(auth.current_user())

DEPLOYMENT CONSIDERATIONS

       Be aware that some web servers do not pass the Authorization headers to the WSGI application by  default.
       For  example,  if  you  use  Apache  with  mod_wsgi,  you  have to set option WSGIPassAuthorization On as
       documented here.

DEPRECATED BASIC AUTHENTICATION OPTIONS

       Before the verify_password described above existed there were other simpler mechanisms  for  implementing
       basic  authentication. While these are deprecated they are still maintained. However, the verify_password
       callback should be preferred as it provides greater security and flexibility.

       The get_password callback needs to return the password associated with the username  given  as  argument.
       Flask-HTTPAuth will allow access only if get_password(username) == password. Example:

          @auth.get_password
          def get_password(username):
              return get_password_for_username(username)

       Using  this callback alone is in general not a good idea because it requires passwords to be available in
       plaintext in the server. In the more likely scenario that the passwords  are  stored  hashed  in  a  user
       database, then an additional callback is needed to define how to hash a password:

          @auth.hash_password
          def hash_pw(password):
              return hash_password(password)

       In  this  example,  you  have  to replace hash_password() with the specific hashing function used in your
       application.  When  the   hash_password   callback   is   provided,   access   will   be   granted   when
       get_password(username) == hash_password(password).

       If  the  hashing  algorithm  requires  the  username to be known then the callback can take two arguments
       instead of one:

          @auth.hash_password
          def hash_pw(username, password):
              salt = get_salt(username)
              return hash_password(password, salt)

API DOCUMENTATION

       class flask_httpauth.HTTPBasicAuth
              This class handles HTTP Basic authentication for Flask routes.

              __init__(scheme=None, realm=None)
                     Create a basic authentication object.

                     If the optional scheme argument is provided, it  will  be  used  instead  of  the  standard
                     "Basic"  scheme  in  the  WWW-Authenticate  response.  A fairly common practice is to use a
                     custom scheme to prevent browsers from prompting the user to login.

                     The realm  argument  can  be  used  to  provide  an  application  defined  realm  with  the
                     WWW-Authenticate header.

              verify_password(verify_password_callback)
                     If  defined,  this  callback  function  will  be called by the framework to verify that the
                     username and password combination provided by the client are valid. The  callback  function
                     takes  two  arguments,  the  username  and  the password. It must return the user object if
                     credentials are valid, or True if a user  object  is  not  available.  In  case  of  failed
                     authentication, it should return None or False. Example usage:

                        @auth.verify_password
                        def verify_password(username, password):
                            user = User.query.filter_by(username).first()
                            if user and passlib.hash.sha256_crypt.verify(password, user.password_hash):
                                return user

                     If  this  callback  is  defined,  it  is  also  invoked  when the request does not have the
                     Authorization header with user credentials, and in this case both the username and password
                     arguments are set to empty strings. The application can opt to return True in this case and
                     that will allow anonymous users access to the route. The  callback  function  can  indicate
                     that  the  user  is  anonymous  by  writing  a  state variable to flask.g or by checking if
                     auth.current_user() is None.

                     Note that when a verify_password callback is provided the  get_password  and  hash_password
                     callbacks are not used.

              get_user_roles(roles_callback)
                     If  defined,  this  callback  function  will be called by the framework to obtain the roles
                     assigned to a given user. The callback function takes a single argument, the user for which
                     roles  are  requested.  The user object passed to this function will be the one returned by
                     the "verify" callback. If the verify callback returned True instead of a user object,  then
                     the  Authorization  object  provided by Flask will be passed to this function. The function
                     should return the role or list of roles that belong to the user. Example:

                        @auth.get_user_roles
                        def get_user_roles(user):
                            return user.get_roles()

              get_password(password_callback)
                     Deprecated This callback function will be called by the framework to  obtain  the  password
                     for a given user. Example:

                        @auth.get_password
                        def get_password(username):
                            return db.get_user_password(username)

              hash_password(hash_password_callback)
                     Deprecated  If  defined,  this callback function will be called by the framework to apply a
                     custom hashing algorithm to the password provided by the client.  If  this  callback  isn't
                     provided  the  password  will  be  checked  unchanged.  The  callback  can  take one or two
                     arguments. The one argument version receives the password to hash, while the  two  argument
                     version  receives  the  username  and  the  password in that order. Example single argument
                     callback:

                        @auth.hash_password
                        def hash_password(password):
                            return md5(password).hexdigest()

                     Example two argument callback:

                        @auth.hash_password
                        def hash_pw(username, password):
                            salt = get_salt(username)
                            return hash(password, salt)

              error_handler(error_callback)
                     If defined, this callback function will be called by the framework when it is necessary  to
                     send  an  authentication  error back to the client. The function can take one argument, the
                     status code of the error, which can be 401 (incorrect credentials)  or  403  (correct,  but
                     insufficient  credentials).  To preserve compatiiblity with older releases of this package,
                     the function can also be defined without arguments. The return  value  from  this  function
                     must  by  any  accepted  response  type  in Flask routes. If this callback isn't provided a
                     default error response is generated. Example:

                        @auth.error_handler
                        def auth_error(status):
                            return "Access Denied", status

              login_required(view_function_callback)
                     This callback function  will  be  called  when  authentication  is  successful.  This  will
                     typically be a Flask view function. Example:

                        @app.route('/private')
                        @auth.login_required
                        def private_page():
                            return "Only for authorized people!"

                     An optional role argument can be given to further restrict access by roles. Example:

                        @app.route('/private')
                        @auth.login_required(role='admin')
                        def private_page():
                            return "Only for admins!"

                     An  optional  optional  argument can be set to True to allow the route to execute also when
                     authentication is not included with the request, in which case auth.current_user() will  be
                     set to None. Example:

                        @app.route('/private')
                        @auth.login_required(optional=True)
                        def private_page():
                            user = auth.current_user()
                            return "Hello {}!".format(user.name if user is not None else 'anonymous')

              current_user()
                     The  user  object returned by the verify_password callback on successful authentication. If
                     no user is returned by the callback, this is set to the  username  passed  by  the  client.
                     Example:

                        @app.route('/')
                        @auth.login_required
                        def index():
                            user = auth.current_user()
                            return "Hello, {}!".format(user.name)

              username()
                     Deprecated A view function that is protected with this class can access the logged username
                     through this method. Example:

                        @app.route('/')
                        @auth.login_required
                        def index():
                            return "Hello, {}!".format(auth.username())

       class flask_httpauth.HTTPDigestAuth
              This class handles HTTP Digest authentication for Flask routes. The SECRET_KEY configuration  must
              be  set  in  the  Flask  application  to  enable the session to work. Flask by default stores user
              sessions in the client as secure cookies, so the client must be able to handle cookies.

              __init__(self, scheme=None, realm=None, use_ha1_pw=False, qop='auth', algorithm='MD5')
                     Create a digest authentication object.

                     If the optional scheme argument is provided, it will be used instead of the "Digest" scheme
                     in  the  WWW-Authenticate  response.  A fairly common practice is to use a custom scheme to
                     prevent browsers from prompting the user to login.

                     The realm  argument  can  be  used  to  provide  an  application  defined  realm  with  the
                     WWW-Authenticate header.

                     If  use_ha1_pw  is  False,  then  the  get_password callback needs to return the plain text
                     password for the given user. If use_ha1_pw is True,  the  get_password  callback  needs  to
                     return  the  HA1  value  for the given user. The advantage of setting use_ha1_pw to True is
                     that it allows the application to store the HA1 hash of the password in the user database.

                     The qop option configures a  list  of  accepted  quality  of  protection  extensions.  This
                     argument  can  be given as a comma-separated string, a list of strings, or None to disable.
                     The default is auth. The auth-int option is currently not implemented.

                     The algorithm option configures the hash generation algorithm to use. The default  is  MD5.
                     The two algorithms that are implemented are MD5 and MD5-Sess.

              generate_ha1(username, password)
                     Generate  the  HA1  hash  that can be stored in the user database when use_ha1_pw is set to
                     True in the constructor.

              generate_nonce(nonce_making_callback)
                     If defined, this callback function will be called by the framework to generate a nonce.  If
                     this is defined, verify_nonce should also be defined.

                     This can be used to use a state storage mechanism other than the session.

              verify_nonce(nonce_verify_callback)
                     If  defined,  this callback function will be called by the framework to verify that a nonce
                     is valid.  It will be called with a single argument: the nonce to be verified.

                     This can be used to use a state storage mechanism other than the session.

              generate_opaque(opaque_making_callback)
                     If defined, this callback function will be called by the framework to  generate  an  opaque
                     value.  If this is defined, verify_opaque should also be defined.

                     This can be used to use a state storage mechanism other than the session.

              verify_opaque(opaque_verify_callback)
                     If defined, this callback function will be called by the framework to verify that an opaque
                     value is valid.  It will be called with a single argument: the opaque value to be verified.

                     This can be used to use a state storage mechanism other than the session.

              get_password(password_callback)
                     See basic authentication for documentation and examples.

              get_user_roles(roles_callback)
                     See basic authentication for documentation and examples.

              error_handler(error_callback)
                     See basic authentication for documentation and examples.

              login_required(view_function_callback)
                     See basic authentication for documentation and examples.

              current_user()
                     See basic authentication for documentation and examples.

              username()
                     See basic authentication for documentation and examples.

       class flask_httpauth.HTTPTokenAuth
              This class handles HTTP authentication with custom schemes for Flask routes.

              __init__(scheme='Bearer', realm=None, header=None)
                     Create a token authentication object.

                     The scheme argument can be use to specify the scheme to be  used  in  the  WWW-Authenticate
                     response.  The Authorization header sent by the client must include this scheme followed by
                     the token. Example:

                        Authorization: Bearer this-is-my-token

                     The realm  argument  can  be  used  to  provide  an  application  defined  realm  with  the
                     WWW-Authenticate header.

                     The  header  argument  can be used to specify a custom header instead of Authorization from
                     where to obtain the token. If a custom header is used, the scheme should not  be  included.
                     Example:

                        X-API-Key: this-is-my-token

              verify_token(verify_token_callback)
                     This  callback function will be called by the framework to verify that the credentials sent
                     by the client with the Authorization header are valid.  The  callback  function  takes  one
                     argument, the token provided by the client. The function must return the user object if the
                     token is valid, or  True  if  a  user  object  is  not  available.  In  case  of  a  failed
                     authentication, the function should return None or False. Example usage:

                        @auth.verify_token
                        def verify_token(token):
                            return User.query.filter_by(token=token).first()

                     Note that a verify_token callback is required when using this class.

              get_user_roles(roles_callback)
                     See basic authentication for documentation and examples.

              error_handler(error_callback)
                     See basic authentication for documentation and examples.

              login_required(view_function_callback)
                     See basic authentication for documentation and examples.

              current_user()
                     See basic authentication for documentation and examples.

       class flask_httpauth.HTTPMultiAuth
              This class handles HTTP authentication with custom schemes for Flask routes.

              __init__(auth_object, ...)
                     Create a multiple authentication object.

                     The  arguments are one or more instances of HTTPBasicAuth, HTTPDigestAuth or HTTPTokenAuth.
                     A route protected with this authentication method will try  all  the  given  authentication
                     objects until one succeeds.

              login_required(view_function_callback)
                     See basic authentication for documentation and examples.

              current_user()
                     See basic authentication for documentation and examples.

AUTHOR

       Miguel Grinberg

       2024, Miguel Grinberg

                                                  May 03, 2024                                 FLASK-HTTPAUTH(3)