From 3797c04946bac7a8ae79eee7bbe31f0505325757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 27 Apr 2019 17:00:56 +0400 Subject: [PATCH] :sparkles: Use 401 with WWW-Authenticate for OAuth2 and add scope_str (#188) --- docs/img/tutorial/security/image03.png | Bin 86701 -> 92466 bytes docs/src/security/tutorial001.py | 4 +- docs/src/security/tutorial002.py | 4 +- docs/src/security/tutorial003.py | 9 +- docs/src/security/tutorial004.py | 12 ++- docs/src/security/tutorial005.py | 19 +++- docs/tutorial/security/first-steps.md | 50 +++++----- docs/tutorial/security/get-current-user.md | 29 ++---- docs/tutorial/security/intro.md | 14 ++- docs/tutorial/security/oauth2-jwt.md | 31 +++--- docs/tutorial/security/oauth2-scopes.md | 93 ++++++++++++++---- docs/tutorial/security/simple-oauth2.md | 57 ++++++++--- fastapi/security/oauth2.py | 9 +- .../test_security/test_tutorial001.py | 6 +- .../test_security/test_tutorial003.py | 9 +- .../test_security/test_tutorial005.py | 86 +++++++++++----- 16 files changed, 290 insertions(+), 142 deletions(-) diff --git a/docs/img/tutorial/security/image03.png b/docs/img/tutorial/security/image03.png index 71e6a1f243162ca3dadc0e285cc081d39e1967b9..27618cd6b65a46809a6ad919a68e4f922789dc39 100644 GIT binary patch literal 92466 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 literal 86701 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 diff --git a/docs/src/security/tutorial001.py b/docs/src/security/tutorial001.py index ca55f74ad..bd8ce4d10 100644 --- a/docs/src/security/tutorial001.py +++ b/docs/src/security/tutorial001.py @@ -1,4 +1,4 @@ -from fastapi import FastAPI, Security +from fastapi import Depends, FastAPI from fastapi.security import OAuth2PasswordBearer app = FastAPI() @@ -7,5 +7,5 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token") @app.get("/items/") -async def read_items(token: str = Security(oauth2_scheme)): +async def read_items(token: str = Depends(oauth2_scheme)): return {"token": token} diff --git a/docs/src/security/tutorial002.py b/docs/src/security/tutorial002.py index cfce06159..2fccec7ed 100644 --- a/docs/src/security/tutorial002.py +++ b/docs/src/security/tutorial002.py @@ -1,6 +1,6 @@ from typing import Optional -from fastapi import Depends, FastAPI, Security +from fastapi import Depends, FastAPI from fastapi.security import OAuth2PasswordBearer from pydantic import BaseModel @@ -22,7 +22,7 @@ def fake_decode_token(token): ) -async def get_current_user(token: str = Security(oauth2_scheme)): +async def get_current_user(token: str = Depends(oauth2_scheme)): user = fake_decode_token(token) return user diff --git a/docs/src/security/tutorial003.py b/docs/src/security/tutorial003.py index 2e736c260..55724e59d 100644 --- a/docs/src/security/tutorial003.py +++ b/docs/src/security/tutorial003.py @@ -1,6 +1,7 @@ -from fastapi import Depends, FastAPI, HTTPException, Security +from fastapi import Depends, FastAPI, HTTPException from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from pydantic import BaseModel +from starlette.status import HTTP_401_UNAUTHORIZED fake_users_db = { "johndoe": { @@ -53,11 +54,13 @@ def fake_decode_token(token): return user -async def get_current_user(token: str = Security(oauth2_scheme)): +async def get_current_user(token: str = Depends(oauth2_scheme)): user = fake_decode_token(token) if not user: raise HTTPException( - status_code=400, detail="Invalid authentication credentials" + status_code=HTTP_401_UNAUTHORIZED, + detail="Invalid authentication credentials", + headers={"WWW-Authenticate": "Bearer"}, ) return user diff --git a/docs/src/security/tutorial004.py b/docs/src/security/tutorial004.py index 2b8eb624f..df57acf24 100644 --- a/docs/src/security/tutorial004.py +++ b/docs/src/security/tutorial004.py @@ -6,7 +6,7 @@ from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jwt import PyJWTError from passlib.context import CryptContext from pydantic import BaseModel -from starlette.status import HTTP_403_FORBIDDEN +from starlette.status import HTTP_401_UNAUTHORIZED # to get a string like this run: # openssl rand -hex 32 @@ -89,7 +89,9 @@ def create_access_token(*, data: dict, expires_delta: timedelta = None): async def get_current_user(token: str = Depends(oauth2_scheme)): credentials_exception = HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Could not validate credentials" + status_code=HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, ) try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) @@ -115,7 +117,11 @@ async def get_current_active_user(current_user: User = Depends(get_current_user) async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()): user = authenticate_user(fake_users_db, form_data.username, form_data.password) if not user: - raise HTTPException(status_code=400, detail="Incorrect username or password") + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": user.username}, expires_delta=access_token_expires diff --git a/docs/src/security/tutorial005.py b/docs/src/security/tutorial005.py index a9704b192..5f34387b5 100644 --- a/docs/src/security/tutorial005.py +++ b/docs/src/security/tutorial005.py @@ -11,7 +11,7 @@ from fastapi.security import ( from jwt import PyJWTError from passlib.context import CryptContext from pydantic import BaseModel, ValidationError -from starlette.status import HTTP_403_FORBIDDEN +from starlette.status import HTTP_401_UNAUTHORIZED # to get a string like this run: # openssl rand -hex 32 @@ -106,8 +106,14 @@ def create_access_token(*, data: dict, expires_delta: timedelta = None): async def get_current_user( security_scopes: SecurityScopes, token: str = Depends(oauth2_scheme) ): + if security_scopes.scopes: + authenticate_value = f'Bearer scope="{security_scopes.scope_str}"' + else: + authenticate_value = f"Bearer" credentials_exception = HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Could not validate credentials" + status_code=HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": authenticate_value}, ) try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) @@ -124,7 +130,9 @@ async def get_current_user( for scope in security_scopes.scopes: if scope not in token_data.scopes: raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not enough permissions" + status_code=HTTP_401_UNAUTHORIZED, + detail="Not enough permissions", + headers={"WWW-Authenticate": authenticate_value}, ) return user @@ -160,3 +168,8 @@ async def read_own_items( current_user: User = Security(get_current_active_user, scopes=["items"]) ): return [{"item_id": "Foo", "owner": current_user.username}] + + +@app.get("/status/") +async def read_system_status(current_user: User = Depends(get_current_user)): + return {"status": "ok"} diff --git a/docs/tutorial/security/first-steps.md b/docs/tutorial/security/first-steps.md index add28be15..11695f622 100644 --- a/docs/tutorial/security/first-steps.md +++ b/docs/tutorial/security/first-steps.md @@ -12,7 +12,7 @@ Let's use the tools provided by **FastAPI** to handle security. ## How it looks -But let's first just use the code and see how it works, and then we'll come back to understand what's happening. +Let's first just use the code and see how it works, and then we'll come back to understand what's happening. ## Create `main.py` @@ -77,37 +77,14 @@ So, let's review it from that simplified point of view: * The API checks that `username` and `password`, and responds with a "token". * A "token" is just a string with some content that we can use later to verify this user. * Normally, a token is set to expire after some time. - * So, the user will have to login again at some point later. - * And if the token is stolen, the risk is less. It is not like a permanent key that will work forever. + * So, the user will have to login again at some point later. + * And if the token is stolen, the risk is less. It is not like a permanent key that will work forever (in most of the cases). * The frontend stores that token temporarily somewhere. * The user clicks in the frontend to go to another section of the frontend web app. * The frontend needs to fetch some more data from the API. * But it needs authentication for that specific endpoint. * So, to authenticate with our API, it sends a header `Authorization` with a value of `Bearer ` plus the token. * If the token contains `foobar`, the content of the `Authorization` header would be: `Bearer foobar`. - * Note that although the header is case-insensitive (`Authorization` is the same as `authorization`), the value is not. So, `bearer foobar` would not be valid. It has to be `Bearer foobar`. - -## **FastAPI**'s `Security` - -### Import it - -The same way **FastAPI** provides a `Depends`, there is a `Security` that you can import: - -```Python hl_lines="1" -{!./src/security/tutorial001.py!} -``` - -### Use it - -It is actually a subclass of `Depends`, and it has just one extra parameter that we'll see later. - -But by using `Security` instead of `Depends`, **FastAPI** will know that it can use this dependency to define "security schemes" in OpenAPI. - -```Python hl_lines="10" -{!./src/security/tutorial001.py!} -``` - -In this case, we have a `Security` definition (which at the same time is a dependency definition) that will provide a `str` that is assigned to the parameter `token`. ## **FastAPI**'s `OAuth2PasswordBearer` @@ -146,13 +123,30 @@ It could be called as: oauth2_scheme(some, parameters) ``` -So, it can be used with `Security` (as it could be used with `Depends`). +So, it can be used with `Depends`. + +### Use it + +Now you can pass that `oauth2_scheme` in a dependency with `Depends`. + +```Python hl_lines="10" +{!./src/security/tutorial001.py!} +``` + +This dependency will provide a `str` that is assigned to the parameter `token` of the *path operation function*. + +**FastAPI** will know that it can use this dependency to define a "security scheme" in the OpenAPI schema (and the automatic API docs). + +!!! info "Technical Details" + **FastAPI** will know that it can use the class `OAuth2PasswordBearer` (declared in a dependency) to define the security scheme in OpenAPI because it inherits from `fastapi.security.oauth2.OAuth2`, which in turn inherits from `fastapi.security.base.SecurityBase`. + + All the security utilities that integrate with OpenAPI (and the automatic API docs) inherit from `SecurityBase`, that's how **FastAPI** can know how to integrate them in OpenAPI. ## What it does It will go and look in the request for that `Authorization` header, check if the value is `Bearer ` plus some token, and will return the token as a `str`. -If it doesn't see an `Authorization` header, or the value doesn't have a `Bearer ` token, it will respond with a 403 status code error (`FORBIDDEN`) directly. +If it doesn't see an `Authorization` header, or the value doesn't have a `Bearer ` token, it will respond with a 401 status code error (`UNAUTHORIZED`) directly. You don't even have to check if the token exists to return an error. You can be sure that if your function is executed, it will have a `str` in that token. diff --git a/docs/tutorial/security/get-current-user.md b/docs/tutorial/security/get-current-user.md index 494e4f26f..e38830b1c 100644 --- a/docs/tutorial/security/get-current-user.md +++ b/docs/tutorial/security/get-current-user.md @@ -24,13 +24,9 @@ Let's create a dependency `get_current_user`. Remember that dependencies can have sub-dependencies? -And remember that `Security` is based on `Depends`? +`get_current_user` will have a dependency with the same `oauth2_scheme` we created before. -So, we can have sub-dependencies using `Security` too. - -`get_current_user` will have a `Security` dependency with the same `oauth2_scheme` we created before. - -The same as we were doing before in the path operation directly, our new dependency will receive a `token` as a `str` from the `Security` dependency: +The same as we were doing before in the path operation directly, our new dependency `get_current_user` will receive a `token` as a `str` from the sub-dependency `oauth2_scheme`: ```Python hl_lines="25" {!./src/security/tutorial002.py!} @@ -52,15 +48,6 @@ So now we can use the same `Depends` with our `get_current_user` in the path ope {!./src/security/tutorial002.py!} ``` -!!! info - Here you could actually use `Security` instead of depends too. - - But it is not required. - - The key point where you should use `Security` is when passing an instance of `OAuth2PasswordBearer`. - - Because **FastAPI** will use the fact that you are using `Security` and that you are passing an instance of that class `OAuth2PasswordBearer` (that inherits from `SecurityBase`) to create all the security definitions in OpenAPI. - Notice that we declare the type of `current_user` as the Pydantic model `User`. This will help us inside of the function with all the completion and type checks. @@ -68,7 +55,7 @@ This will help us inside of the function with all the completion and type checks !!! tip You might remember that request bodies are also declared with Pydantic models. - Here **FastAPI** won't get confused because you are using `Depends` or `Security`. + Here **FastAPI** won't get confused because you are using `Depends`. !!! check The way this dependency system is designed allows us to have different dependencies (different "dependables") that all return a `User` model. @@ -78,7 +65,7 @@ This will help us inside of the function with all the completion and type checks ## Other models -You can now get the current user directly in the path operation functions and deal with the security mechanisms at the **Dependency Injection** level, using `Security`. +You can now get the current user directly in the path operation functions and deal with the security mechanisms at the **Dependency Injection** level, using `Depends`. And you can use any model or data for the security requirements (in this case, a Pydantic model `User`). @@ -88,6 +75,10 @@ Do you want to have an `id` and `email` and not have any `username` in your mode Do you want to just have a `str`? Or just a `dict`? Or a database class model instance directly? It all works the same way. +You actually don't have users that log in to your application but robots, bots, or other systems, that have just an access token? Again, it all works the same. + +Just use any kind of model, any kind of class, any kind of database that you need for your application. **FastAPI** has you covered with the dependency injection system. + ## Code size @@ -97,7 +88,7 @@ But here's the key point. The security and dependency injection stuff is written once. -And you can make it as complex as you want. And still, have it written only once, in a single place. +And you can make it as complex as you want. And still, have it written only once, in a single place. With all the flexibility. But you can have thousands of endpoints (path operations) using the same security system. @@ -115,6 +106,6 @@ You can now get the current user directly in your path operation function. We are already halfway there. -We just need to add a path operation for the user / client to actually send the `username` and `password`. +We just need to add a path operation for the user/client to actually send the `username` and `password`. That comes next. \ No newline at end of file diff --git a/docs/tutorial/security/intro.md b/docs/tutorial/security/intro.md index 74330a0a2..96c941dd5 100644 --- a/docs/tutorial/security/intro.md +++ b/docs/tutorial/security/intro.md @@ -40,7 +40,7 @@ OpenID Connect is another specification, based on **OAuth2**. It just extends OAuth2 specifying some things that are relatively ambiguous in OAuth2, to try to make it more interoperable. -For example, Google login used OpenID Connect (which underneath uses OAuth2). +For example, Google login uses OpenID Connect (which underneath uses OAuth2). But Facebook login doesn't support OpenID Connect. It has its own flavor of OAuth2. @@ -75,7 +75,7 @@ OpenAPI defines the following security schemes: * HTTP Basic authentication. * HTTP Digest, etc. * `oauth2`: all the OAuth2 ways to handle security (called "flows"). - * Several of these flows are appropriate for delegating the authentication to a third party (like Google, Facebook, Twitter, GitHub, etc): + * Several of these flows are appropriate for building an OAuth 2.0 authentication provider (like Google, Facebook, Twitter, GitHub, etc): * `implicit` * `clientCredentials` * `authorizationCode` @@ -84,10 +84,16 @@ OpenAPI defines the following security schemes: * `openIdConnect`: has a way to define how to discover OAuth2 authentication data automatically. * This automatic discovery is what is defined in the OpenID Connect specification. + +!!! tip + Integrating other authentication/authorization providers like Google, Facebook, Twitter, GitHub, etc. is also possible and relatively easy. + + The most complex problem is building an authentication/authorization provider like those, but **FastAPI** gives you the tools to do it easily, while doing the heavy lifting for you. + ## **FastAPI** utilities -FastAPI provides several tools for each of these security schemes in the `fastapi.security` module, to simplify using these security mechanisms. +FastAPI provides several tools for each of these security schemes in the `fastapi.security` module that simplify using these security mechanisms. -In the next chapters you will see how to add security to your API in a very simple way, using the tools provided by **FastAPI**. +In the next chapters you will see how to add security to your API using those tools provided by **FastAPI**. And you will also see how it gets automatically integrated into the interactive documentation system. diff --git a/docs/tutorial/security/oauth2-jwt.md b/docs/tutorial/security/oauth2-jwt.md index 4958d35f2..648e1e68c 100644 --- a/docs/tutorial/security/oauth2-jwt.md +++ b/docs/tutorial/security/oauth2-jwt.md @@ -1,4 +1,4 @@ -Now that we have all the security flow, let's make the application actually secure, using JWT tokens and secure password hashing. +Now that we have all the security flow, let's make the application actually secure, using JWT tokens and secure password hashing. This code is something you can actually use in your application, save the password hashes in your database, etc. @@ -8,7 +8,11 @@ We are going to start from where we left in the previous chapter and increment i JWT means "JSON Web Tokens". -It's a standard to codify a JSON object in a long string. +It's a standard to codify a JSON object in a long dense string without spaces. It looks like this: + +``` +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c +``` It is not encrypted, so, anyone could recover the information from the contents. @@ -16,7 +20,7 @@ But it's signed. So, when you receive a token that you emitted, you can verify t That way, you can create a token with an expiration of, let's say, 1 week, and then, after a week, when the user comes back with the token, you know he's still signed into your system. -And after a week, the token will be expired. And if the user (or a third party) tried to modify the token to change the expiration, you would be able to discover it, because the signature would not match. +And after a week, the token will be expired. And if the user (or a third party) tried to modify the token to change the expiration, you would be able to discover it, because the signatures would not match. If you want to play with JWT tokens and see how they work, check https://jwt.io. @@ -30,7 +34,7 @@ pip install pyjwt ## Password hashing -"Hashing" means converting some content (a password in this case) into a sequence of bytes (just a string) that look like gibberish. +"Hashing" means converting some content (a password in this case) into a sequence of bytes (just a string) that looks like gibberish. Whenever you pass exactly the same content (exactly the same password) you get exactly the same gibberish. @@ -57,10 +61,11 @@ pip install passlib[bcrypt] ``` !!! tip - With `passlib`, you could even configure it to be able to read passwords created by **Django** (among many others). + With `passlib`, you could even configure it to be able to read passwords created by **Django**, a **Flask** security plug-in or many others. So, you would be able to, for example, share the same data from a Django application in a database with a FastAPI application. Or gradually migrate a Django application using the same database. + And your users would be able to login from your Django app or from your **FastAPI** app, at the same time. ## Hash and verify the passwords @@ -122,7 +127,7 @@ Decode the received token, verify it, and return the current user. If the token is invalid, return an HTTP error right away. -```Python hl_lines="90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105" +```Python hl_lines="90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107" {!./src/security/tutorial004.py!} ``` @@ -132,7 +137,7 @@ Create a `timedelta` with the expiration time of the token. Create a real JWT access token and return it. -```Python hl_lines="114 115 116 117 118 119 120 121 122 123" +```Python hl_lines="116 117 118 119 120 121 122 123 124 125 126 127 128 129" {!./src/security/tutorial004.py!} ``` @@ -155,9 +160,9 @@ Using these ideas, JWT can be used for way more sophisticate scenarios. In those cases, several of those entities could have the same ID, let's say `foo` (a user `foo`, a car `foo`, and a blog post `foo`). -So, to avoid ID collisions, when creating the JWT token for the user, you could prefix the value of the `sub` key, e.g. with `username:`. +So, to avoid ID collisions, when creating the JWT token for the user, you could prefix the value of the `sub` key, e.g. with `username:`. So, in this example, the value of `sub` could have been: `username:johndoe`. -The important thing to have in mind is that the `sub` key should have a unique identifier across the entire application. +The important thing to have in mind is that the `sub` key should have a unique identifier across the entire application, and it should be a string. ## Check it @@ -192,7 +197,7 @@ Call the endpoint `/users/me/`, you will get the response as: -If you open the developer tools, you could see how the data sent and received is just the token, the password is only sent in the first request to authenticate the user: +If you open the developer tools, you could see how the data sent and only includes the token, the password is only sent in the first request to authenticate the user and get that access token, but not afterwards: @@ -207,7 +212,7 @@ You can use them to add a specific set of permissions to a JWT token. Then you can give this token to a user directly or a third party, to interact with your API with a set of restrictions. -You can learn how to use them and how they are integrated into **FastAPI** in the next section. +You can learn how to use them and how they are integrated into **FastAPI** in the next chapter. ## Recap @@ -227,8 +232,8 @@ And you can use directly many well maintained and widely used packages like `pas But it provides you the tools to simplify the process as much as possible without compromising flexibility, robustness or security. -And you can use secure, standard protocols like OAuth2 in a relatively simple way. +And you can use and implement secure, standard protocols, like OAuth2 in a relatively simple way. -In the next (optional) section you can see how to extend this even further, using OAuth2 "scopes", for a more fine-grained permission system following standards. +In the next (optional) section you can see how to extend this even further, using OAuth2 "scopes", for a more fine-grained permission system, following these same standards. OAuth2 with scopes (explained in the next section) is the mechanism used by many big authentication providers, like Facebook, Google, GitHub, Microsoft, Twitter, etc. diff --git a/docs/tutorial/security/oauth2-scopes.md b/docs/tutorial/security/oauth2-scopes.md index 2056b41ab..e290d5e8e 100644 --- a/docs/tutorial/security/oauth2-scopes.md +++ b/docs/tutorial/security/oauth2-scopes.md @@ -11,11 +11,11 @@ In this section you will see how to manage authentication and authorization with !!! warning This is a more or less advanced section. If you are just starting, you can skip it. - You don't necessarily need OAuth2 scopes, you can handle authentication and authorization however you want. + You don't necessarily need OAuth2 scopes, and you can handle authentication and authorization however you want. But OAuth2 with scopes can be nicely integrated into your API (with OpenAPI) and your API docs. - Nevertheless, you still enforce those scopes or any other security/authorization requirement however you need in your code. + Nevertheless, you still enforce those scopes, or any other security/authorization requirement, however you need, in your code. In many cases, OAuth2 with scopes can be an overkill. @@ -37,7 +37,7 @@ When one of these security schemes uses OAuth2, you can also declare and use sco First, let's quickly see the parts that change from the previous section about OAuth2 and JWT. Now using OAuth2 scopes: -```Python hl_lines="2 5 9 13 48 66 106 115 116 117 122 123 124 125 126 131 145 158" +```Python hl_lines="2 5 9 13 48 66 107 109 110 111 112 113 114 115 116 117 123 124 125 126 130 131 132 133 134 135 136 141 155" {!./src/security/tutorial005.py!} ``` @@ -53,7 +53,7 @@ The `scopes` parameter receives a `dict` with each scope as a key and the descri {!./src/security/tutorial005.py!} ``` -Because we are now declaring those scopes,they will show up in the API docs when you log-in/authorize. +Because we are now declaring those scopes, they will show up in the API docs when you log-in/authorize. And you will be able to select which scopes you want to give access to: `me` and `items`. @@ -65,7 +65,7 @@ This is the same mechanism used when you give permissions while logging in with Now, modify the token *path operation* to return the scopes requested. -We are still using the same `OAuth2PasswordRequestForm`. It includes a property `scopes` with each scope it received. +We are still using the same `OAuth2PasswordRequestForm`. It includes a property `scopes` with a `list` of `str`, with each scope it received in the request. And we return the scopes as part of the JWT token. @@ -74,7 +74,7 @@ And we return the scopes as part of the JWT token. But in your application, for security, you should make sure you only add the scopes that the user is actually able to have, or the ones you have predefined. -```Python hl_lines="145" +```Python hl_lines="156" {!./src/security/tutorial005.py!} ``` @@ -99,38 +99,82 @@ In this case, it requires the scope `me` (it could require more than one scope). We are doing it here to demonstrate how **FastAPI** handles scopes declared at different levels. -```Python hl_lines="5 131 158" +```Python hl_lines="5 141 168" {!./src/security/tutorial005.py!} ``` +!!! info "Technical Details" + `Security` is actually a subclass of `Depends`, and it has just one extra parameter that we'll see later. + + But by using `Security` instead of `Depends`, **FastAPI** will know that it can declare security scopes, use them internally, and document the API with OpenAPI. + ## Use `SecurityScopes` Now update the dependency `get_current_user`. This is the one used by the dependencies above. -Here's were we are declaring the same OAuth2 scheme we created above as a dependency: `oauth2_scheme`. +Here's were we are using the same OAuth2 scheme we created before, declaring it as a dependency: `oauth2_scheme`. -Because this dependency function doesn't have any scope requirements itself, we can use `Depends` with `oauth2_scheme`, we don't have to use `Security`. +Because this dependency function doesn't have any scope requirements itself, we can use `Depends` with `oauth2_scheme`, we don't have to use `Security` when we don't need to specify security scopes. We also declare a special parameter of type `SecurityScopes`, imported from `fastapi.security`. This `SecurityScopes` class is similar to `Request` (`Request` was used to get the request object directly). -The parameter `security_scopes` will be of type `SecurityScopes`. It will have a property `scopes` with a list containing all the scopes required by itself and all the dependencies that use this as a sub-dependency. That means, all the "dependants" or all the super-dependencies (the contrary of sub-dependencies). +```Python hl_lines="9 107" +{!./src/security/tutorial005.py!} +``` -We verify that all the scopes required, by this dependency and all the dependants (including *path operations*), are included in the scopes provided in the token received, otherwise raise an `HTTPException`. +## Use the `scopes` -We also check that the token data is validated with the Pydantic model (catching the `ValidationError` exception), and if we get an error reading the JWT token or validating the data with Pydantic, we also raise an `HTTPException`. +The parameter `security_scopes` will be of type `SecurityScopes`. -By validating the data with Pydantic we can make sure that we have, for example, exactly a `list` of `str` with the scopes and a `str` with the `username`. Instead of, for example, a `dict`, or something else, as it could break the application at some point later. +It will have a property `scopes` with a list containing all the scopes required by itself and all the dependencies that use this as a sub-dependency. That means, all the "dependants"... this might sound confusing, it is explained again later below. +The `security_scopes` object (of class `SecurityScopes`) also provides a `scope_str` attribute with a single string, containing those scopes separated by spaces (we are going to use it). -```Python hl_lines="9 13 106 48 106 115 116 117 122 123" +We create an `HTTPException` that we can re-use (`raise`) later at several points. + +In this exception, we include the scopes required (if any) as a string separated by spaces (using `scope_str`). We put that string containing the scopes in in the `WWW-Authenticate` header (this is part of the spec). + +```Python hl_lines="107 109 110 111 112 113 114 115 116 117" {!./src/security/tutorial005.py!} ``` -So, as the other dependency `get_current_active_user` has as a sub-dependency this `get_current_user`, the scope `"me"` declared at `get_current_active_user` will be included in the `security_scopes.scopes` `list` inside of `get_current_user`. +## Verify the `username` and data shape + +We verify that we get a `username`, and extract the scopes. + +And then we validate that data with the Pydantic model (catching the `ValidationError` exception), and if we get an error reading the JWT token or validating the data with Pydantic, we raise the `HTTPException` we created before. + +For that, we update the Pydantic model `TokenData` with a new property `scopes`. + +By validating the data with Pydantic we can make sure that we have, for example, exactly a `list` of `str` with the scopes and a `str` with the `username`. + +Instead of, for example, a `dict`, or something else, as it could break the application at some point later, making it a security risk. + +We also verify that we have a user with that username, and if not, we raise that same exception we created before. + +```Python hl_lines="48 118 119 120 121 122 123 124 125 126 127 128 129" +{!./src/security/tutorial005.py!} +``` + +## Verify the `scopes` + +We now verify that all the scopes required, by this dependency and all the dependants (including *path operations*), are included in the scopes provided in the token received, otherwise raise an `HTTPException`. + +For this, we use `security_scopes.scopes`, that contains a `list` with all these scopes as `str`. + +```Python hl_lines="130 131 132 133 134 135 136" +{!./src/security/tutorial005.py!} +``` + +## Dependency tree and scopes + +Let's review again this dependency tree and the scopes. + +As the other dependency `get_current_active_user` has as a sub-dependency this `get_current_user`, the scope `"me"` declared at `get_current_active_user` will be included in the `security_scopes.scopes` `list` inside of `get_current_user`. And as the *path operation* itself also declares a scope `"items"`, it will also be part of this `list` `security_scopes.scopes` in `get_current_user`. @@ -147,15 +191,24 @@ Here's how the hierarchy of dependencies and scopes looks like: * A dependency using `oauth2_scheme`. * A `security_scopes` parameter of type `SecurityScopes`: * This `security_scopes` parameter has a property `scopes` with a `list` containing all these scopes declared above, so: - * `security_scopes.scopes` will contain `["me", "items"]` + * `security_scopes.scopes` will contain `["me", "items"]` for the *path operation* `read_own_items`. + * `security_scopes.scopes` will contain `["me"]` for the *path operation* `read_users_me`, because it is declared in the dependency `get_current_active_user`. + * `security_scopes.scopes` will contain `[]` (nothing) for the *path operation* `read_system_status`, because it didn't declare any `Security` with `scopes`, and its dependency, `get_current_user`, doesn't declare any `scope` either. + +!!! tip + The important and "magic" thing here is that `get_current_user` will have a different list of `scopes` to check for each *path operation*. + + All depending on the `scopes` declared in each *path operation* and each dependency in the dependency tree for that specific path operation. ## More details about `SecurityScopes` You can use `SecurityScopes` at any point, and in multiple places, it doesn't have to be at the "root" dependency. -It will always have the security scopes declared in the current `Security` dependencies and all the super-dependencies/dependants. +It will always have the security scopes declared in the current `Security` dependencies and all the dependants for **that specific** *path operation* and **that specific** dependency tree. + +Because the `SecurityScopes` will have all the scopes declared by dependants, you can use it to verify that a token has the required scopes in a central dependency function, and then declare different scope requirements in different *path operations*. -Because the `SecurityScopes` will have all the scopes declared by super-dependencies/dependants, you can use it to verify that a token has the required scopes in a central dependency function, and then declare different scope requirements in different *path operations*. +They will be checked independently for each path operation. ## Check it @@ -163,7 +216,7 @@ If you open the API docs, you can authenticate and specify which scopes you want -If you don't select any scope, you will be "authenticated", but when you try to access `/users/me/` or `/users/me/items/` you will get an error saying that you don't have enough permissions. +If you don't select any scope, you will be "authenticated", but when you try to access `/users/me/` or `/users/me/items/` you will get an error saying that you don't have enough permissions. You will still be able to access `/status/`. And if you select the scope `me` but not the scope `items`, you will be able to access `/users/me/` but not `/users/me/items/`. @@ -181,7 +234,7 @@ But if you are building an OAuth2 application that others would connect to (i.e. The most common is the implicit flow. -The most secure is the code flow, but is more complex to implement as it requires more steps. As it is more cumbersome, many providers end up suggesting the implicit flow. +The most secure is the code flow, but is more complex to implement as it requires more steps. As it is more complex, many providers end up suggesting the implicit flow. !!! note It's common that each authentication provider names their flows in a different way, to make it part of their brand. diff --git a/docs/tutorial/security/simple-oauth2.md b/docs/tutorial/security/simple-oauth2.md index 2068a6e83..4937d7bd2 100644 --- a/docs/tutorial/security/simple-oauth2.md +++ b/docs/tutorial/security/simple-oauth2.md @@ -4,7 +4,7 @@ Now let's build from the previous chapter and add the missing parts to have a co We are going to use **FastAPI** security utilities to get the `username` and `password`. -OAuth2 specifies that when using the "password flow" (that we are using) the client / user must send a `username` and `password` fields as form data. +OAuth2 specifies that when using the "password flow" (that we are using) the client/user must send a `username` and `password` fields as form data. And the spec says that the fields have to be named like that. So `user-name` or `email` wouldn't work. @@ -48,7 +48,7 @@ Now let's use the utilities provided by **FastAPI** to handle this. First, import `OAuth2PasswordRequestForm`, and use it as a dependency with `Depends` for the path `/token`: -```Python hl_lines="2 73" +```Python hl_lines="2 75" {!./src/security/tutorial003.py!} ``` @@ -67,6 +67,15 @@ First, import `OAuth2PasswordRequestForm`, and use it as a dependency with `Depe * An optional `client_id` (we don't need it for our example). * An optional `client_secret` (we don't need it for our example). +!!! info + The `OAuth2PasswordRequestForm` is not a special class for **FastAPI** as is `OAuth2PasswordBearer`. + + `OAuth2PasswordBearer` makes **FastAPI** know that it is a security scheme. So it is added that way to OpenAPI. + + But `OAuth2PasswordRequestForm` is just a class dependency that you could have written yourself, or you could have declared `Form` parameters directly. + + But as it's a common use case, it is provided by **FastAPI** directly, just to make it easier. + ### Use the form data !!! tip @@ -80,13 +89,13 @@ If there is no such user, we return an error saying "incorrect username or passw For the error, we use the exception `HTTPException`: -```Python hl_lines="1 73 74 75" +```Python hl_lines="1 76 77 78" {!./src/security/tutorial003.py!} ``` ### Check the password -At this point we have a the user data from our database, but we haven't checked the password. +At this point we have the user data from our database, but we haven't checked the password. Let's put that data in the Pydantic `UserInDB` model first. @@ -96,7 +105,7 @@ If the passwords don't match, we return the same error. #### Password hashing -"Hashing" means: converting some content (a password in this case) into a sequence of bytes (just a string) that look like gibberish. +"Hashing" means: converting some content (a password in this case) into a sequence of bytes (just a string) that looks like gibberish. Whenever you pass exactly the same content (exactly the same password) you get exactly the same gibberish. @@ -108,7 +117,7 @@ If your database is stolen, the thief won't have your users' plaintext passwords So, the thief won't be able to try to use that password in another system (as many users use the same password everywhere, this would be dangerous). -```Python hl_lines="76 77 78 79" +```Python hl_lines="79 80 81 82" {!./src/security/tutorial003.py!} ``` @@ -116,7 +125,7 @@ So, the thief won't be able to try to use that password in another system (as ma `UserInDB(**user_dict)` means: -Pass the keys and values of the `user_dict` directly as key-value arguments, equivalent to: +*Pass the keys and values of the `user_dict` directly as key-value arguments, equivalent to:* ```Python UserInDB( @@ -142,14 +151,23 @@ And it should have an `access_token`, with a string containing our access token. For this simple example, we are going to just be completely insecure and return the same `username` as the token. !!! tip - In the next chapter, you will see a real secure implementation, with password hashing and JWT tokens. + In the next chapter, you will see a real secure implementation, with password hashing and JWT tokens. But for now, let's focus on the specific details we need. -```Python hl_lines="81" +```Python hl_lines="84" {!./src/security/tutorial003.py!} ``` +!!! tip + By the spec, you should return a JSON with an `access_token` and a `token_type`, the same as in this example. + + This is something that you have to do yourself in your code, and make sure you use those JSON keys. + + It's almost the only thing that you have to remember to do correctly yourself, to be compliant with the specifications. + + For the rest, **FastAPI** handles it for you. + ## Update the dependencies Now we are going to update our dependencies. @@ -162,10 +180,25 @@ Both of these dependencies will just return an HTTP error if the user doesn't ex So, in our endpoint, we will only get a user if the user exists, was correctly authenticated, and is active: -```Python hl_lines="56 57 58 59 60 61 62 65 66 67 68 85" +```Python hl_lines="57 58 59 60 61 62 63 64 65 68 69 70 71 88" {!./src/security/tutorial003.py!} ``` +!!! info + The additional header `WWW-Authenticate` with value `Bearer` we are returning here is also part of the spec. + + Any HTTP (error) status code 401 "UNAUTHORIZED" is supposed to also return a `WWW-Authenticate` header. + + In the case of bearer tokens (our case), the value of that header should be `Bearer`. + + You can actually skip that extra header and it would still work. + + But it's provided here to be compliant with the specifications. + + Also, there might be tools that expect and use it (now or in the future) and that might be useful for you or your users, now or in the future. + + That's the benefit of standards... + ## See it in action Open the interactive docs: http://127.0.0.1:8000/docs. @@ -204,7 +237,7 @@ You will get your user's data, like: -If you click the lock icon and logout, and then try the same operation again, you will get an HTTP 403 error of: +If you click the lock icon and logout, and then try the same operation again, you will get an HTTP 401 error of: ```JSON { @@ -238,4 +271,4 @@ Using these tools, you can make the security system compatible with any database The only detail missing is that it is not actually "secure" yet. -In the next chapter you'll see how to use a secure password hashing library and JWT tokens. +In the next chapter you'll see how to use a secure password hashing library and JWT tokens. diff --git a/fastapi/security/oauth2.py b/fastapi/security/oauth2.py index 31ddc946d..8c3cb819c 100644 --- a/fastapi/security/oauth2.py +++ b/fastapi/security/oauth2.py @@ -1,12 +1,12 @@ from typing import List, Optional +from fastapi.exceptions import HTTPException from fastapi.openapi.models import OAuth2 as OAuth2Model, OAuthFlows as OAuthFlowsModel from fastapi.params import Form from fastapi.security.base import SecurityBase from fastapi.security.utils import get_authorization_scheme_param -from starlette.exceptions import HTTPException from starlette.requests import Request -from starlette.status import HTTP_403_FORBIDDEN +from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN class OAuth2PasswordRequestForm: @@ -154,7 +154,9 @@ class OAuth2PasswordBearer(OAuth2): if not authorization or scheme.lower() != "bearer": if self.auto_error: raise HTTPException( - status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" + status_code=HTTP_401_UNAUTHORIZED, + detail="Not authenticated", + headers={"WWW-Authenticate": "Bearer"}, ) else: return None @@ -164,3 +166,4 @@ class OAuth2PasswordBearer(OAuth2): class SecurityScopes: def __init__(self, scopes: List[str] = None): self.scopes = scopes or [] + self.scope_str = " ".join(self.scopes) diff --git a/tests/test_tutorial/test_security/test_tutorial001.py b/tests/test_tutorial/test_security/test_tutorial001.py index ce4890ee4..295e600cf 100644 --- a/tests/test_tutorial/test_security/test_tutorial001.py +++ b/tests/test_tutorial/test_security/test_tutorial001.py @@ -41,8 +41,9 @@ def test_openapi_schema(): def test_no_token(): response = client.get("/items") - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_token(): @@ -53,5 +54,6 @@ def test_token(): def test_incorrect_token(): response = client.get("/items", headers={"Authorization": "Notexistent testtoken"}) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" diff --git a/tests/test_tutorial/test_security/test_tutorial003.py b/tests/test_tutorial/test_security/test_tutorial003.py index 2ed226deb..c55e7b7a6 100644 --- a/tests/test_tutorial/test_security/test_tutorial003.py +++ b/tests/test_tutorial/test_security/test_tutorial003.py @@ -135,8 +135,9 @@ def test_login_incorrect_username(): def test_no_token(): response = client.get("/users/me") - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_token(): @@ -153,16 +154,18 @@ def test_token(): def test_incorrect_token(): response = client.get("/users/me", headers={"Authorization": "Bearer nonexistent"}) - assert response.status_code == 400 + assert response.status_code == 401 assert response.json() == {"detail": "Invalid authentication credentials"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_incorrect_token_type(): response = client.get( "/users/me", headers={"Authorization": "Notexistent testtoken"} ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_inactive_user(): diff --git a/tests/test_tutorial/test_security/test_tutorial005.py b/tests/test_tutorial/test_security/test_tutorial005.py index 75e1b6eb4..96f9fa9c1 100644 --- a/tests/test_tutorial/test_security/test_tutorial005.py +++ b/tests/test_tutorial/test_security/test_tutorial005.py @@ -80,24 +80,31 @@ openapi_schema = { "security": [{"OAuth2PasswordBearer": ["items", "me"]}], } }, + "/status/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Read System Status", + "operationId": "read_system_status_status__get", + "security": [{"OAuth2PasswordBearer": []}], + } + }, }, "components": { "schemas": { - "Body_login_for_access_token": { - "title": "Body_login_for_access_token", - "required": ["username", "password"], + "User": { + "title": "User", + "required": ["username"], "type": "object", "properties": { - "grant_type": { - "title": "Grant_Type", - "pattern": "password", - "type": "string", - }, "username": {"title": "Username", "type": "string"}, - "password": {"title": "Password", "type": "string"}, - "scope": {"title": "Scope", "type": "string", "default": ""}, - "client_id": {"title": "Client_Id", "type": "string"}, - "client_secret": {"title": "Client_Secret", "type": "string"}, + "email": {"title": "Email", "type": "string"}, + "full_name": {"title": "Full_Name", "type": "string"}, + "disabled": {"title": "Disabled", "type": "boolean"}, }, }, "Token": { @@ -109,15 +116,21 @@ openapi_schema = { "token_type": {"title": "Token_Type", "type": "string"}, }, }, - "User": { - "title": "User", - "required": ["username"], + "Body_login_for_access_token": { + "title": "Body_login_for_access_token", + "required": ["username", "password"], "type": "object", "properties": { + "grant_type": { + "title": "Grant_Type", + "pattern": "password", + "type": "string", + }, "username": {"title": "Username", "type": "string"}, - "email": {"title": "Email", "type": "string"}, - "full_name": {"title": "Full_Name", "type": "string"}, - "disabled": {"title": "Disabled", "type": "boolean"}, + "password": {"title": "Password", "type": "string"}, + "scope": {"title": "Scope", "type": "string", "default": ""}, + "client_id": {"title": "Client_Id", "type": "string"}, + "client_secret": {"title": "Client_Secret", "type": "string"}, }, }, "ValidationError": { @@ -204,8 +217,9 @@ def test_login_incorrect_username(): def test_no_token(): response = client.get("/users/me") - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_token(): @@ -225,16 +239,18 @@ def test_token(): def test_incorrect_token(): response = client.get("/users/me", headers={"Authorization": "Bearer nonexistent"}) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Could not validate credentials"} + assert response.headers["WWW-Authenticate"] == 'Bearer scope="me"' def test_incorrect_token_type(): response = client.get( "/users/me", headers={"Authorization": "Notexistent testtoken"} ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer" def test_verify_password(): @@ -257,8 +273,9 @@ def test_token_no_sub(): "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiZm9vIn0.9ynBhuYb4e6aW3oJr_K_TBgwcMTDpRToQIE25L57rOE" }, ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Could not validate credentials"} + assert response.headers["WWW-Authenticate"] == 'Bearer scope="me"' def test_token_no_username(): @@ -268,8 +285,9 @@ def test_token_no_username(): "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28ifQ.NnExK_dlNAYyzACrXtXDrcWOgGY2JuPbI4eDaHdfK5Y" }, ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Could not validate credentials"} + assert response.headers["WWW-Authenticate"] == 'Bearer scope="me"' def test_token_no_scope(): @@ -277,8 +295,9 @@ def test_token_no_scope(): response = client.get( "/users/me", headers={"Authorization": f"Bearer {access_token}"} ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Not enough permissions"} + assert response.headers["WWW-Authenticate"] == 'Bearer scope="me"' def test_token_inexistent_user(): @@ -288,8 +307,9 @@ def test_token_inexistent_user(): "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VybmFtZTpib2IifQ.HcfCW67Uda-0gz54ZWTqmtgJnZeNem0Q757eTa9EZuw" }, ) - assert response.status_code == 403 + assert response.status_code == 401 assert response.json() == {"detail": "Could not validate credentials"} + assert response.headers["WWW-Authenticate"] == 'Bearer scope="me"' def test_token_inactive_user(): @@ -311,3 +331,19 @@ def test_read_items(): ) assert response.status_code == 200 assert response.json() == [{"item_id": "Foo", "owner": "johndoe"}] + + +def test_read_system_status(): + access_token = get_access_token() + response = client.get( + "/status/", headers={"Authorization": f"Bearer {access_token}"} + ) + assert response.status_code == 200 + assert response.json() == {"status": "ok"} + + +def test_read_system_status_no_token(): + response = client.get("/status/") + assert response.status_code == 401 + assert response.json() == {"detail": "Not authenticated"} + assert response.headers["WWW-Authenticate"] == "Bearer"