【发布时间】:2019-10-28 11:20:27
【问题描述】:
在以不安全的方式使用 djangorestframework-jwt 一年多之后,我终于决定让它以更安全的方式工作。
我读到过在本地客户端(例如本地存储)中保存 JWT 令牌不好的地方,最好的解决方案是改用 HttpOnly cookie。
我知道 HttpOnly cookie 确实是一个 cookie,可以保存但不能被浏览器读取。所以我认为它可以像下面这样使用:
- get_token:客户端通过发送用户名和密码向服务器请求授权令牌:如果用户名和密码有效,则服务器以 httpOnly cookie 响应,客户端可以存储但不能读取该cookie。
- 客户端从现在开始执行的每个请求都经过授权,因为在 HttpOnly cookie 中有一个有效的授权令牌。
- refresh_token:一旦客户端需要刷新token,它只需要请求一个refresh_token:如果发送的cookie包含一个有效的token,服务器将响应一个更新的HttpOnly cookie,带有新的token。
我现在正在尝试通过使用 HttpOnly cookie 来使用 djangorestframework-jwt,而 JWT_AUTH_COOKIE 配置似乎是最合适的配置:
如果您想使用 http cookie 以及 Authorization 标头作为令牌的有效传输,您可以将 JWT_AUTH_COOKIE 设置为字符串。您在此处设置的字符串将用作请求令牌时将在响应标头中设置的 cookie 名称。如果已设置,令牌验证过程还将查看此 cookie。如果请求中同时存在标头和 cookie,则“授权”标头优先。
默认为 None,创建令牌时不设置 cookie,验证令牌时也不接受。
在给 JWT_AUTH_COOKIE 一个字符串值之后,我收到了一个 httpOnly cookie,正如预期的那样。
问题:
当我调用 refreshToken 时,我得到以下响应:
{"token":["This field is required."]}
没错,我没有在请求的 HEADER 中发送任何令牌,这就是我想要的,因为客户端不应该将它保存在任何地方。
这就是我感到困惑的地方:
如果我从现在开始对客户端向服务器发出的每个请求都没有错,那么应该将 cookie 添加到请求中。
服务器在看到Header中没有传递令牌后,不应该检查cookie吗?如果不是这样,它应该如何工作?
如果有人想为改进做出贡献,还在这里发布了一个 Github 问题:https://github.com/jpadilla/django-rest-framework-jwt/issues/482
【问题讨论】:
-
这听起来像是前端问题。如果您使用 axios,您将设置
axios.defaults.withCredentials = true并在收到 cookie 后,您必须设置标头axios.defaults.headers.common['Authorization'] = 'JWT <token>' -
这有什么更新吗?
-
@Francesco Meli - 这对你有用吗?
djangrestframework-jwt的行为不符合预期。我正在使用TokenAuthentication作为httponlycookie,但我在处理已撤销的令牌客户端时遇到了麻烦,因为如果您将过期令牌与请求一起发送,Django 会返回 401。 -
@zerohedge 不幸的是我还没有时间测试它。不过,我需要尽快对其进行测试。请,如果你找到一个现实世界的工作解决方案,让我们都知道!
-
有什么方法可以连接吗?也许我们可以一起寻找解决方案。我已经为此工作了好几天,但无济于事。