在Starlette会话中保留身份验证结果是否可以/安全?
的例子:
@app.get("/login")
async def login(request: Request):
# ...assuming verifying user went ok
request.session['logged_in_user'] = user.email # THIS LINE
return "Welcome"
def requires_auth(view):
@wraps(view)
def wrapper(request: Request, **kwargs: Optional[Dict]):
if not request.session.get('logged_in_user'):
raise HTTPException(status_code=403)
return view(request, **kwargs)
return wrapper
# Example of use
@app.get("/test")
@requires_auth
async def test():
return JSONResponse({"hello": "world"})
我试图为我的应用程序建立一个Facebook登录功能,但与他们在他们的例子中提供的后端身份验证解决方案有点挣扎,并以其他方式进行了身份验证(见上文)-我想知道它是否安全。
会话数据的一般规则是…
永远不要在其中存储用户id或用户名等机密信息。
你可以做的是生成一个随机字符串或uid来代表一个用户,例如…
如果我的用户id是'1234'。当我登录时,服务器将为我生成一个UUID,然后将其存储在数据库中,并引用用户id '1234'。将UUID添加到会话数据中,当他们访问您的页面时,您可以颠倒顺序。查找UUID,获取绑定到它的用户id,现在就知道它是哪个用户了。但是之后如果发生了什么事情你需要清除UUID那没什么大不了的因为他们可以重新登录并获得一个全新的UUID它会以同样的方式工作
如果有人得到我的UUID,他们仍然不知道我的用户名或电子邮件或我的用户id。所以没有得到任何信息。虽然没有适当的安全措施,但被盗的UUID可能会导致问题。
对于身份验证,如果UUID存在并且适当的安全性到位,则可以假设它们已经过身份验证。如果数据库中不存在UUID,或者会话中没有UUID,则不进行身份验证。