【问题标题】:How to store JWT's in cookies with FastApi?如何使用 FastApi 将 JWT 存储在 cookie 中?
【发布时间】:2022-12-25 09:33:34
【问题描述】:

我正在使用 FastApi、React 和 MongoDb 创建一个基本的登录系统。 我想将 JWT 存储在 cookie 中,但对我没有任何用处,我真的不想将它们存储在 LocalStorage 中...... 有人可以告诉我我的代码有什么问题吗?

@app.post("/login")
 async def login(response:Response,data: OAuth2PasswordRequestForm=Depends()):
 username = data.username
 password = data.password

 user = await query_user(username)
 if not user:
    raise InvalidCredentialsException
 if not verify_password(password,user["password"]):
    raise InvalidCredentialsException

 access_token = accessToken.create(user)
 refresh_token = refreshToken.create(user)

 response.set_cookie(key="access_token",value=f"Bearer {access_token}", httponly=True)
 response.set_cookie(key="refresh_token",value=f"Bearer {access_token}", httponly=True)
 return response

【问题讨论】:

  • 如果您正在设置 cookie,并且您使用 access_token 作为刷新和访问令牌的值,则绝对不需要在任何内容前加上 Bearer 前缀。但是,如果您使用的是 React,则必须确保按照您的计划设置和返回 cookie——由于越来越多的浏览器禁止第三方 cookie,因此您必须同时为您的 React 应用提供服务和您的后端来自同一主机。 “没有什么对我有用”是什么意思?您是否在响应中设置了 cookie?它们是否包含在任何未来的请求中?你如何提出要求?

标签: jwt fastapi cookie-httponly


【解决方案1】:

这很容易。就我而言,一旦用户成功登录,我就会重定向到仪表板,然后在 cookie 中设置令牌。

@app.post('/token', tags=["authenticate"])
async def login_for_access_token(response:Response, request_form: OAuth2PasswordRequestForm = Depends()):
    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    token = await token_generator(request_form.username, request_form.password,
                                  expires_delta=access_token_expires)

    response = RedirectResponse(url='/api/v1/dashboard', status_code=status.HTTP_303_SEE_OTHER)
    response.set_cookie(key="access_token", value=f"Bearer {token[0]}", httponly=True)
    return response

我的令牌由 access_token 和 user_id 键组成,因此是令牌 [0]。您会注意到,“httponly”标志设置为 True。这是一项安全功能,因为无法从“非 HTTP”API 访问有关 HttpOnly cookie 的任何信息,例如JavaScript。按照设计,读取或写入此类 cookie 是不可能的。 HttpOnly 标头标志成为标准,在 RFC6265 的第 5.2.6 节中定义,并在同一文档中描述了存储语义(在整个 RFC 文本中查找“http-only-flag”)。希望这有帮助,祝你好运!

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 2020-12-09
    • 2015-09-15
    • 2016-09-13
    • 2019-03-18
    • 2021-01-21
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多