如何从 Flask 返回不记名 JWT 令牌?

Posted

技术标签:

【中文标题】如何从 Flask 返回不记名 JWT 令牌?【英文标题】:How to return a bearer JWT token FROM Flask? 【发布时间】:2021-08-23 23:27:56 【问题描述】:

如何形成来自 Flask python 服务器的响应,该响应将在响应中包含不记名令牌。更准确地说,我希望以某种方式将 JWT 令牌从 Flask python 服务器安全地传播回客户端(角度页面)。我可以在 GET 重定向中以查询字符串的形式返回它。将 JWT 访问令牌返回给客户端还有哪些其他可能性?我尝试设置响应表单 python,并在授权字段中设置 jwt 令牌,但没有任何效果。这是我尝试过的:

1.

 r = Response(headers=
                 "Authorization": "bearer jwtcntent",
                 "Access-Control-Allow-Origin": "*",
              ,
              is_redirect=True,
              url="https://localhost:5000/callback",
 )
 return r
r = redirect("http://localhost:5000/callback")
r.headers = "authorization": "bearer jwtcntent"
return r
r = Response(headers=
                 "Authorization": "Bearer jwtcntent",
                 "Access-Control-Allow-Origin": "*",
             ,
             allow_redirects=True,
             url="https://localhost:5000/callback",                       
)
return r

有什么建议吗?

【问题讨论】:

【参考方案1】:

您能否在授权服务器中实施常规 OAuth 流程? OAuth 流程是标准化的,并使用安全的方式将访问令牌返回给客户端。

我不建议使用 Authorization 标头来返回响应。此标头是请求标头,在响应中没有任何意义。如果您确实需要通过标头执行此操作,您可以添加 Access-Control-Expose-Headers 标头,让您的客户端从响应中读取 Authorization 标头。

【讨论】:

【参考方案2】:

您可以将其存储在 httponly cookie 中,但如果这样做,您需要确保处理 CSRF 攻击。 Flask-JWT-Extended 内置了对此的支持,您可能会发现它很有用,无论是作为解决方案还是作为您最终所做的任何事情的参考:

https://flask-jwt-extended.readthedocs.io/en/stable/token_locations/#cookies

您也可以将令牌作为 JSON 正文的一部分发回,然后将其存储在本地/会话存储中,这可能是最常见的模式。

【讨论】:

问题还在于,如何以 JSON 正文返回它,因为服务器实际上非常具体。它是一个 CAS 服务器,它对用户进行身份验证,然后,我(作为开发人员)向它(身份验证服务器)提供重定向 URL。谢谢推荐。如果您认为我的问题有价值,请投赞成票,这样投反对票就不会结束我的问题吗?可能对将来有类似问题的人也有用。我确实将其用作最终解决方案,因为 http 超过了 https,我认为它已经足够安全了。

以上是关于如何从 Flask 返回不记名 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

从 Web API 的不记名令牌返回用户角色

实施 Identity 2.1 + OWIN OAuth JWT 不记名令牌时如何从 Web API 控制器端点进行身份验证

无法使用 ASP.NET Core 从 JWT 令牌获取声明

Flask JWT 令牌/有效负载 - 返回用户 Json

如何使用 B2C 和 Blazor 获取 JWT 不记名令牌

使用 python 请求进行 Web 抓取的 JWT 不记名授权