让fastapi在header中使用访问令牌



可能是非常愚蠢的问题。

我有一个相当大的fastapi应用程序,我现在想添加用户帐户。我已经选定了fastapi-login看起来很简单。我已经实现了在自述页面。

我的问题是:当访问生成令牌的路由时,我得到一个访问令牌(如预期的那样)。但是,在下一次访问受保护的路由时,令牌没有在授权头中使用,因此我得到一个未授权的错误。

我的问题:如何获得我的浏览器会话发送授权和令牌头吗?

如果您使用纯HTML响应,那么您将需要使用cookie登录。检查下面的代码,使用包fastapi-login

实现实际的cookie登录使用cookie

main.py

from fastapi import FastAPI, Response
from fastapi_login import LoginManager
from fastapi.security import OAuth2PasswordRequestForm
from fastapi_login.exceptions import InvalidCredentialsException
SECRET = 'your-secret-key'
manager = LoginManager(SECRET, token_url='/auth/token')
@manager.user_loader()
def load_user(email: str):  # could also be an asynchronous function
# get actual username and password from db for the given email
user = {"username": "abcd@email.com", "password": "secret"}
return user
app = FastAPI()
# add cookie login route
@app.get('/auth')
def auth(response: Response, data: OAuth2PasswordRequestForm = Depends()):
email = data.username
password = data.password
user = load_user(email)  # we are using the same function to retrieve the user
if not user:
raise InvalidCredentialsException  # you can also use your own HTTPException
elif password != user['password']:
raise InvalidCredentialsException
# get token and set cookie
token = manager.create_access_token(
data=dict(sub=user.email)
)
manager.set_cookie(response, token)
return response
# now add protected route
@app.get('/protected')
def protected_route(user=Depends(manager)):
...

参考:https://github.com/MushroomMaula/fastapi_login usage-with-cookies

您需要将令牌存储在客户端的某个地方,然后在每个请求的标头中发送它。如何将其放在头中取决于用于执行HTTP请求的库。例如,如果你使用pythonrequests库,这里是docs.

但是,如果令牌被盗(例如在CSRF攻击中),这仍然会产生一些安全漏洞。我所做的是让令牌有一个非常短的一生(比方说,一些秒)并要求一个新的令牌在一个后台线程时旧的令牌到期。当然,您需要注意对令牌的并发访问(例如,使用互斥锁)。

最新更新