FastApi - api 密钥作为参数足够安全

Sha*_*jko 2 python fastapi

我是这部分编程的新手,我有几个问题。首先是我的项目。一侧有一个 Flutter 应用程序,另一侧有一个包含数据的 MS SQL Server。从逻辑上讲,我的设备上需要这些数据。我读到最好的方法是使用 FastAPI,它简单且性能良好,但我不确定安全性。我读过一些有关 OAuth2 的内容,但它看起来太多了,因为只有一个用户有权使用该数据(服务器所有者)。是否可以只使用一个简单的 api key 作为参数?像这样的东西...

from fastapi import FastAPI
from SqlServerRequest import SqlServerRequest

app = FastAPI()


@app.get("/openOrders/{key}")
async def openOrders(key):
    if key == "myverysecurekey":
         return "SQLDATA"
    else
         return "Wrong key"
Run Code Online (Sandbox Code Playgroud)

这种方式可行,但我不确定安全性你会说什么?

小智 5

我已经处理同样的问题有一段时间了。我不需要在标头中使用 oauth,而是需要一个简单的 X-API-Key。

您可以使用以下代码来做到这一点

from fastapi import FastAPI, Depends
from fastapi.security import APIKeyHeader
import os

os.environ['API-KEY'] = '1234'. 
# You would use as an environment var in real life

X_API_KEY = APIKeyHeader(name='X-API-Key')


def api_key_auth(x_api_key: str = Depends(X_API_KEY)):
    """ takes the X-API-Key header and validate it with the X-API-Key in the database/environment"""
    if x_api_key != os.environ['API-KEY']:
        raise HTTPException(
            status_code=401,
            detail="Invalid API Key. Check that you are passing a 'X-API-Key' on your header."
        )


app = FastAPI()


@app.get("/do_something", dependencies=[Depends(api_key_auth)])
async def do_something():
    return "API is working OK."
Run Code Online (Sandbox Code Playgroud)