Provided by: python3-flask-httpauth_4.5.0-4_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()

   Security Concerns with Digest Authentication
       The digest authentication algorithm requires a challenge to be sent to the client for  use
       in  encrypting  the  password for transmission. This challenge needs to be used again when
       the password is decoded at the server, so the challenge information needs to be stored  so
       that it can be recalled later.

       By  default,  Flask-HTTPAuth  stores  the challenge data in the Flask session. To make the
       authentication flow secure when using session storage, it  is  required  that  server-side
       sessions are used instead of the default Flask cookie based sessions, as this ensures that
       the challenge data is not at risk of being captured as it moves in a cookie between server
       and client. The Flask-Session and Flask-KVSession extensions are both very good options to
       implement server-side sessions.

       As an alternative to using server-side sessions, an  application  can  implement  its  own
       generation  and  storage  of challenge data. To do this, there are four callback functions
       that the application needs to implement:

          @auth.generate_nonce
          def generate_nonce():
              """Return the nonce value to use for this client."""
              pass

          @auth.generate_opaque
          def generate_opaque():
              """Return the opaque value to use for this client."""
              pass

          @auth.verify_nonce
          def verify_nonce(nonce):
              """Verify that the nonce value sent by the client is correct."""
              pass

          @auth.verify_opaque
          def verify_opaque(opaque):
              """Verify that the opaque value sent by the client is correct."""
              pass

       For information of what the nonce and opaque values are and how they are  used  in  digest
       authentication, consult RFC 2617.

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 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. To make this authentication method secure, a
              session interface that writes sessions in the server must be used.

              __init__(self, scheme=None, realm=None, use_ha1_pw=False)
                     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.

              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

COPYRIGHT

       2022, Miguel Grinberg

                                           Jan 25, 2022                         FLASK-HTTPAUTH(3)