From c70568539462199e739a71934ba5857ceab2859a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 21 Apr 2019 22:30:58 +0400 Subject: [PATCH] :sparkles: Add docs for HTTP Basic Auth and tests (#177) --- docs/img/tutorial/security/image12.png | Bin 0 -> 69280 bytes docs/src/security/tutorial006.py | 11 +++++ docs/src/security/tutorial007.py | 22 ++++++++++ docs/tutorial/security/http-basic-auth.md | 40 ++++++++++++++++++ mkdocs.yml | 1 + .../test_security/test_tutorial006.py} | 12 +----- 6 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 docs/img/tutorial/security/image12.png create mode 100644 docs/src/security/tutorial006.py create mode 100644 docs/src/security/tutorial007.py create mode 100644 docs/tutorial/security/http-basic-auth.md rename tests/{test_security_http_basic.py => test_tutorial/test_security/test_tutorial006.py} (87%) diff --git a/docs/img/tutorial/security/image12.png b/docs/img/tutorial/security/image12.png new file mode 100644 index 0000000000000000000000000000000000000000..58006d698db21eb3b07986255bd3eddf6761fe5b GIT binary patch literal 69280 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

Of2dGpKy$i%xQPt!%IR|( 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 TDsbvxfS0_q%G;_pCLjM7v_%ou literal 0 HcmV?d00001 diff --git a/docs/src/security/tutorial006.py b/docs/src/security/tutorial006.py new file mode 100644 index 000000000..29121ffd6 --- /dev/null +++ b/docs/src/security/tutorial006.py @@ -0,0 +1,11 @@ +from fastapi import Depends, FastAPI +from fastapi.security import HTTPBasic, HTTPBasicCredentials + +app = FastAPI() + +security = HTTPBasic() + + +@app.get("/users/me") +def read_current_user(credentials: HTTPBasicCredentials = Depends(security)): + return {"username": credentials.username, "password": credentials.password} diff --git a/docs/src/security/tutorial007.py b/docs/src/security/tutorial007.py new file mode 100644 index 000000000..dc4f4fb14 --- /dev/null +++ b/docs/src/security/tutorial007.py @@ -0,0 +1,22 @@ +from fastapi import Depends, FastAPI, HTTPException +from fastapi.security import HTTPBasic, HTTPBasicCredentials +from starlette.status import HTTP_401_UNAUTHORIZED + +app = FastAPI() + +security = HTTPBasic() + + +def get_current_username(credentials: HTTPBasicCredentials = Depends(security)): + if credentials.username != "foo" or credentials.password != "password": + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Incorrect email or password", + headers={"WWW-Authenticate": "Basic"}, + ) + return credentials.username + + +@app.get("/users/me") +def read_current_user(username: str = Depends(get_current_username)): + return {"username": username} diff --git a/docs/tutorial/security/http-basic-auth.md b/docs/tutorial/security/http-basic-auth.md new file mode 100644 index 000000000..d6ee6bc34 --- /dev/null +++ b/docs/tutorial/security/http-basic-auth.md @@ -0,0 +1,40 @@ +For the simplest cases, you can use HTTP Basic Auth. + +In HTTP Basic Auth, the application expects a header that contains a username and a password. + +If it doesn't receive it, it returns an HTTP 401 "Unauthorized" error. + +And returns a header `WWW-Authenticate` with a value of `Basic`, and an optional `realm` parameter. + +That tells the browser to show the integrated prompt for a username and password. + +Then, when you type that username and password, the browser sends them in the header automatically. + +## Simple HTTP Basic Auth + +* Import `HTTPBAsic` and `HTTPBasicCredentials`. +* Create a "`security` scheme" using `HTTPBAsic`. +* Use that `security` with a dependency in your *path operation*. +* It returns an object of type `HTTPBasicCredentials`: + * It contains the `username` and `password` sent. + + +```Python hl_lines="2 6 10" +{!./src/security/tutorial006.py!} +``` + +When you try to open the URL for the first time (or click the "Execute" button in the docs) the browser will ask you for your username and password: + + + +## Check the username + +Here's a more complete example. + +Use a dependency to check if the username and password are correct. + +If the credentials are incorrect, return an `HTTPException` with a status code 401 (the same returned when no credentials are provided) and add the header `WWW-Authenticate` to make the browser show the login prompt again: + +```Python hl_lines="10 11 12 13 14 15 16 17 21" +{!./src/security/tutorial007.py!} +``` diff --git a/mkdocs.yml b/mkdocs.yml index d1d6c20ed..2ea289d8e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -58,6 +58,7 @@ nav: - Simple OAuth2 with Password and Bearer: 'tutorial/security/simple-oauth2.md' - OAuth2 with Password (and hashing), Bearer with JWT tokens: 'tutorial/security/oauth2-jwt.md' - OAuth2 scopes: 'tutorial/security/oauth2-scopes.md' + - HTTP Basic Auth: 'tutorial/security/http-basic-auth.md' - Middleware: 'tutorial/middleware.md' - CORS (Cross-Origin Resource Sharing): 'tutorial/cors.md' - Using the Request Directly: 'tutorial/using-request-directly.md' diff --git a/tests/test_security_http_basic.py b/tests/test_tutorial/test_security/test_tutorial006.py similarity index 87% rename from tests/test_security_http_basic.py rename to tests/test_tutorial/test_security/test_tutorial006.py index 7d380fef0..9dc753202 100644 --- a/tests/test_security_http_basic.py +++ b/tests/test_tutorial/test_security/test_tutorial006.py @@ -1,19 +1,9 @@ from base64 import b64encode -from fastapi import FastAPI, Security -from fastapi.security import HTTPBasic, HTTPBasicCredentials from requests.auth import HTTPBasicAuth from starlette.testclient import TestClient -app = FastAPI() - -security = HTTPBasic() - - -@app.get("/users/me") -def read_current_user(credentials: HTTPBasicCredentials = Security(security)): - return {"username": credentials.username, "password": credentials.password} - +from security.tutorial006 import app client = TestClient(app)