From c70568539462199e739a71934ba5857ceab2859a Mon Sep 17 00:00:00 2001 From: =?utf8?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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 FzW}sF5!V0! literal 0 Hc-jL100001 diff --git a/docs/src/security/tutorial006.py b/docs/src/security/tutorial006.py new file mode 100644 index 0000000000..29121ffd63 --- /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 0000000000..dc4f4fb147 --- /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 0000000000..d6ee6bc349 --- /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 d1d6c20ed0..2ea289d8ee 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 7d380fef0f..9dc753202a 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) -- 2.47.3