Security¶
1. Tag x-enable-auth-in-api-gateway¶
In order for the API-Gateway to understand which urls and microservices need to be secured, first you need to set x-enable-auth-in-api-gateway
tag to the group of tags that you want to secure.
from fastapi import FastAPI
import uvicorn
tags_metadata = [
{
"name": "users",
"description": "Operations with users. The **login** logic is also here.",
"x-auto-generate-in-api-gateway": False,
"x-enable-auth-in-api-gateway": False, # (1)!
},
{
"name": "items",
"description": "Manage items. So _fancy_ they have their own docs.",
"externalDocs": {
"description": "Items external docs",
"url": "https://fastapi.tiangolo.com/"
},
"x-auto-generate-in-api-gateway": True,
"x-enable-auth-in-api-gateway": True, # (2)!
},
]
app = FastAPI(openapi_tags=tags_metadata)
@app.get("/users/", tags=["users"])
async def get_users():
return [{"name": "Harry"}, {"name": "Ron"}]
@app.get("/items/", tags=["items"])
async def get_items():
return [{"name": "wand"}, {"name": "flying broom"}]
if __name__ == '__main__':
uvicorn.run(app, port=5000, log_level="info")
- We explicitly say that security for the url group "users" is not needed.
- Enabling security for the "items" group
2. Security class¶
To ensure security, it is necessary to create a class that will inherit from the HTTPBearer class.
For example, let's create a FakeJWT
class.
class FakeJWT(HTTPBearer):
def __init__(self, service_name, path, path_method):
super(FakeJWT, self).__init__()
self.service_name = service_name
self.path = path
self.path_method = path_method
async def __call__(self, request: Request):
credentials: HTTPAuthorizationCredentials = await super(FakeJWT, self).__call__(request)
logger.info(f"{self.service_name}, {self.path}, {self.path_method}")
if credentials:
if not credentials.scheme == "Bearer":
raise HTTPException(
status_code=403, detail="Invalid authentication scheme.")
if credentials.credentials != "test":
raise HTTPException(
status_code=403, detail="Invalid token or expired token.")
return credentials.credentials
else:
raise HTTPException(
status_code=403, detail="Invalid authorization code.")
If the microservice has set the tag x-enable-auth-in-api-gateway
, you get three arguments with each request.
Argument | Description |
---|---|
service_name |
Microservice name |
path |
URL address |
path_method |
HTTP method |
Abstract
In the class for security, you can implement any logic. For example, create a separate microservice for the security of microservices and send requests via httpx.
3. Add to Config¶
After creating a class, you can add a link to your class to connect all microservices to it.
Info
By default, if a class for security has been provided in the configuration, the URLs for managing microservices will be automatically protected. This can be observed by looking in Swagger.
![]() |
---|
URLs protected by Bearer token |