Added the DIGEST_AUTH_REALM configuration variable as the recommended way to set the authentication realm. Changed the default realm from an empty string to "Login Required".
This commit is contained in:
		
							
								
								
									
										19
									
								
								README.rst
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								README.rst
									
									
									
									
									
								
							| @@ -52,6 +52,13 @@ You may also install the latest source from the | |||||||
|     pip install git+https://github.com/imacat/flask-digestauth.git |     pip install git+https://github.com/imacat/flask-digestauth.git | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Configuration | ||||||
|  | ============= | ||||||
|  |  | ||||||
|  | Flask-DigestAuth takes the configuration ``DIGEST_AUTH_REALM`` as the | ||||||
|  | realm.  The default realm is ``Login Required``. | ||||||
|  |  | ||||||
|  |  | ||||||
| Setting the Password | Setting the Password | ||||||
| ==================== | ==================== | ||||||
|  |  | ||||||
| @@ -89,7 +96,7 @@ In your ``my_app.py``: | |||||||
|     app: flask = Flask(__name__) |     app: flask = Flask(__name__) | ||||||
|     ... (Configure the Flask application) ... |     ... (Configure the Flask application) ... | ||||||
|  |  | ||||||
|     auth: DigestAuth = DigestAuth(realm="Admin") |     auth: DigestAuth = DigestAuth() | ||||||
|     auth.init_app(app) |     auth.init_app(app) | ||||||
|  |  | ||||||
|     @auth.register_get_password |     @auth.register_get_password | ||||||
| @@ -128,7 +135,6 @@ In your ``my_app/__init__.py``: | |||||||
|         app: flask = Flask(__name__) |         app: flask = Flask(__name__) | ||||||
|         ... (Configure the Flask application) ... |         ... (Configure the Flask application) ... | ||||||
|  |  | ||||||
|         auth.realm = app.config["REALM"] |  | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|  |  | ||||||
|         @auth.register_get_password |         @auth.register_get_password | ||||||
| @@ -207,7 +213,7 @@ In your ``my_app.py``: | |||||||
|     def load_user(user_id: str) -> t.Optional[User]: |     def load_user(user_id: str) -> t.Optional[User]: | ||||||
|         ... (Load the user with the username) ... |         ... (Load the user with the username) ... | ||||||
|  |  | ||||||
|     auth: DigestAuth = DigestAuth(realm="Admin") |     auth: DigestAuth = DigestAuth() | ||||||
|     auth.init_app(app) |     auth.init_app(app) | ||||||
|  |  | ||||||
|     @auth.register_get_password |     @auth.register_get_password | ||||||
| @@ -251,7 +257,6 @@ In your ``my_app/__init__.py``: | |||||||
|         def load_user(user_id: str) -> t.Optional[User]: |         def load_user(user_id: str) -> t.Optional[User]: | ||||||
|             ... (Load the user with the username) ... |             ... (Load the user with the username) ... | ||||||
|  |  | ||||||
|         auth.realm = app.config["REALM"] |  | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|  |  | ||||||
|         @auth.register_get_password |         @auth.register_get_password | ||||||
| @@ -340,8 +345,9 @@ A unittest Test Case | |||||||
|  |  | ||||||
|         def create_app(self): |         def create_app(self): | ||||||
|             app: Flask = create_app({ |             app: Flask = create_app({ | ||||||
|  |                 "TESTING": True, | ||||||
|                 "SECRET_KEY": token_urlsafe(32), |                 "SECRET_KEY": token_urlsafe(32), | ||||||
|                 "TESTING": True |                 "DIGEST_AUTH_REALM": "admin", | ||||||
|             }) |             }) | ||||||
|             app.test_client_class = Client |             app.test_client_class = Client | ||||||
|             return app |             return app | ||||||
| @@ -367,8 +373,9 @@ A pytest Test | |||||||
|     @pytest.fixture() |     @pytest.fixture() | ||||||
|     def app(): |     def app(): | ||||||
|         app: Flask = create_app({ |         app: Flask = create_app({ | ||||||
|  |             "TESTING": True, | ||||||
|             "SECRET_KEY": token_urlsafe(32), |             "SECRET_KEY": token_urlsafe(32), | ||||||
|             "TESTING": True |             "DIGEST_AUTH_REALM": "admin", | ||||||
|         }) |         }) | ||||||
|         app.test_client_class = Client |         app.test_client_class = Client | ||||||
|         yield app |         yield app | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ In your ``my_app.py``: | |||||||
|     app: flask = Flask(__name__) |     app: flask = Flask(__name__) | ||||||
|     ... (Configure the Flask application) ... |     ... (Configure the Flask application) ... | ||||||
|  |  | ||||||
|     auth: DigestAuth = DigestAuth(realm="Admin") |     auth: DigestAuth = DigestAuth() | ||||||
|     auth.init_app(app) |     auth.init_app(app) | ||||||
|  |  | ||||||
|     @auth.register_get_password |     @auth.register_get_password | ||||||
| @@ -58,7 +58,6 @@ In your ``my_app/__init__.py``: | |||||||
|         app: flask = Flask(__name__) |         app: flask = Flask(__name__) | ||||||
|         ... (Configure the Flask application) ... |         ... (Configure the Flask application) ... | ||||||
|  |  | ||||||
|         auth.realm = app.config["REALM"] |  | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|  |  | ||||||
|         @auth.register_get_password |         @auth.register_get_password | ||||||
| @@ -118,7 +117,7 @@ In your ``my_app.py``: | |||||||
|     def load_user(user_id: str) -> t.Optional[User]: |     def load_user(user_id: str) -> t.Optional[User]: | ||||||
|         ... (Load the user with the username) ... |         ... (Load the user with the username) ... | ||||||
|  |  | ||||||
|     auth: DigestAuth = DigestAuth(realm="Admin") |     auth: DigestAuth = DigestAuth() | ||||||
|     auth.init_app(app) |     auth.init_app(app) | ||||||
|  |  | ||||||
|     @auth.register_get_password |     @auth.register_get_password | ||||||
| @@ -164,7 +163,6 @@ In your ``my_app/__init__.py``: | |||||||
|         def load_user(user_id: str) -> t.Optional[User]: |         def load_user(user_id: str) -> t.Optional[User]: | ||||||
|             ... (Load the user with the username) ... |             ... (Load the user with the username) ... | ||||||
|  |  | ||||||
|         auth.realm = app.config["REALM"] |  | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|  |  | ||||||
|         @auth.register_get_password |         @auth.register_get_password | ||||||
| @@ -219,8 +217,9 @@ A unittest Test Case | |||||||
|  |  | ||||||
|         def create_app(self): |         def create_app(self): | ||||||
|             app: Flask = create_app({ |             app: Flask = create_app({ | ||||||
|  |                 "TESTING": True, | ||||||
|                 "SECRET_KEY": token_urlsafe(32), |                 "SECRET_KEY": token_urlsafe(32), | ||||||
|                 "TESTING": True |                 "DIGEST_AUTH_REALM": "admin", | ||||||
|             }) |             }) | ||||||
|             app.test_client_class = Client |             app.test_client_class = Client | ||||||
|             return app |             return app | ||||||
| @@ -249,8 +248,9 @@ A pytest Test | |||||||
|     @pytest.fixture() |     @pytest.fixture() | ||||||
|     def app(): |     def app(): | ||||||
|         app: Flask = create_app({ |         app: Flask = create_app({ | ||||||
|  |             "TESTING": True, | ||||||
|             "SECRET_KEY": token_urlsafe(32), |             "SECRET_KEY": token_urlsafe(32), | ||||||
|             "TESTING": True |             "DIGEST_AUTH_REALM": "admin", | ||||||
|         }) |         }) | ||||||
|         app.test_client_class = Client |         app.test_client_class = Client | ||||||
|         yield app |         yield app | ||||||
|   | |||||||
| @@ -46,6 +46,13 @@ You may also install the latest source from the | |||||||
|     pip install git+https://github.com/imacat/flask-digestauth.git |     pip install git+https://github.com/imacat/flask-digestauth.git | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Configuration | ||||||
|  | ------------- | ||||||
|  |  | ||||||
|  | Flask-DigestAuth takes the configuration ``DIGEST_AUTH_REALM`` as the | ||||||
|  | realm.  The default realm is ``Login Required``. | ||||||
|  |  | ||||||
|  |  | ||||||
| Setting the Password | Setting the Password | ||||||
| -------------------- | -------------------- | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,8 +46,8 @@ class DigestAuth: | |||||||
|         self.__serializer: URLSafeTimedSerializer \ |         self.__serializer: URLSafeTimedSerializer \ | ||||||
|             = URLSafeTimedSerializer(token_urlsafe(32)) |             = URLSafeTimedSerializer(token_urlsafe(32)) | ||||||
|         """The serializer to generate and validate the nonce and opaque.""" |         """The serializer to generate and validate the nonce and opaque.""" | ||||||
|         self.realm: str = "" if realm is None else realm |         self.realm: str = "Login Required" if realm is None else realm | ||||||
|         """The realm.  Default is an empty string.""" |         """The realm.  Default is "Login Required".""" | ||||||
|         self.algorithm: t.Optional[t.Literal["MD5", "MD5-sess"]] = None |         self.algorithm: t.Optional[t.Literal["MD5", "MD5-sess"]] = None | ||||||
|         """The algorithm, either None, ``MD5``, or ``MD5-sess``.  Default is |         """The algorithm, either None, ``MD5``, or ``MD5-sess``.  Default is | ||||||
|         None.""" |         None.""" | ||||||
| @@ -343,6 +343,8 @@ class DigestAuth: | |||||||
|         :return: None. |         :return: None. | ||||||
|         """ |         """ | ||||||
|         app.extensions["digest_auth"] = self |         app.extensions["digest_auth"] = self | ||||||
|  |         if "DIGEST_AUTH_REALM" in app.config: | ||||||
|  |             self.realm = app.config["DIGEST_AUTH_REALM"] | ||||||
|  |  | ||||||
|         if hasattr(app, "login_manager"): |         if hasattr(app, "login_manager"): | ||||||
|             from flask_login import LoginManager, login_user |             from flask_login import LoginManager, login_user | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # The Flask HTTP Digest Authentication Project. | # The Flask HTTP Digest Authentication Project. | ||||||
| # Author: imacat@mail.imacat.idv.tw (imacat), 2022/10/22 | # Author: imacat@mail.imacat.idv.tw (imacat), 2022/10/22 | ||||||
|  |  | ||||||
| #  Copyright (c) 2022 imacat. | #  Copyright (c) 2022-2023 imacat. | ||||||
| # | # | ||||||
| #  Licensed under the Apache License, Version 2.0 (the "License"); | #  Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
| #  you may not use this file except in compliance with the License. | #  you may not use this file except in compliance with the License. | ||||||
| @@ -59,10 +59,11 @@ class AuthenticationTestCase(TestCase): | |||||||
|         app.config.from_mapping({ |         app.config.from_mapping({ | ||||||
|             "TESTING": True, |             "TESTING": True, | ||||||
|             "SECRET_KEY": token_urlsafe(32), |             "SECRET_KEY": token_urlsafe(32), | ||||||
|  |             "DIGEST_AUTH_REALM": _REALM, | ||||||
|         }) |         }) | ||||||
|         app.test_client_class = Client |         app.test_client_class = Client | ||||||
|  |  | ||||||
|         auth: DigestAuth = DigestAuth(realm=_REALM) |         auth: DigestAuth = DigestAuth() | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|         self.user: User = User(_USERNAME, _PASSWORD) |         self.user: User = User(_USERNAME, _PASSWORD) | ||||||
|         user_db: t.Dict[str, User] = {_USERNAME: self.user} |         user_db: t.Dict[str, User] = {_USERNAME: self.user} | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| # The Flask HTTP Digest Authentication Project. | # The Flask HTTP Digest Authentication Project. | ||||||
| # Author: imacat@mail.imacat.idv.tw (imacat), 2022/11/23 | # Author: imacat@mail.imacat.idv.tw (imacat), 2022/11/23 | ||||||
|  |  | ||||||
| #  Copyright (c) 2022 imacat. | #  Copyright (c) 2022-2023 imacat. | ||||||
| # | # | ||||||
| #  Licensed under the Apache License, Version 2.0 (the "License"); | #  Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
| #  you may not use this file except in compliance with the License. | #  you may not use this file except in compliance with the License. | ||||||
| @@ -79,6 +79,7 @@ class FlaskLoginTestCase(TestCase): | |||||||
|         app.config.from_mapping({ |         app.config.from_mapping({ | ||||||
|             "TESTING": True, |             "TESTING": True, | ||||||
|             "SECRET_KEY": token_urlsafe(32), |             "SECRET_KEY": token_urlsafe(32), | ||||||
|  |             "DIGEST_AUTH_REALM": _REALM, | ||||||
|         }) |         }) | ||||||
|         app.test_client_class = Client |         app.test_client_class = Client | ||||||
|  |  | ||||||
| @@ -92,7 +93,7 @@ class FlaskLoginTestCase(TestCase): | |||||||
|         login_manager: flask_login.LoginManager = flask_login.LoginManager() |         login_manager: flask_login.LoginManager = flask_login.LoginManager() | ||||||
|         login_manager.init_app(app) |         login_manager.init_app(app) | ||||||
|  |  | ||||||
|         auth: DigestAuth = DigestAuth(realm=_REALM) |         auth: DigestAuth = DigestAuth() | ||||||
|         auth.init_app(app) |         auth.init_app(app) | ||||||
|  |  | ||||||
|         self.user: User = User(_USERNAME, _PASSWORD) |         self.user: User = User(_USERNAME, _PASSWORD) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user