Django:没有CSRF令牌重置密码

时间:2015-02-09 20:16:37

标签: android django django-users django-csrf forgot-password

我有一个管理Users的Django网站。使用内置功能,用户可以从网站请求重置密码,效果很好。我已将其实施according to this tutorial,因此我使用的是the built-in password reset functionality

我有一个Android应用程序,用户也应该可以请求重置密码。问题是我在应用程序中没有CSRF token,而the built-in password_reset method has the @csrf_protect decorator。这意味着我无法在没有CSRF令牌的情况下访问它,我也无法使用@csrf_exempt装饰器对其进行修改。

所以接下来的想法是创建一个函数,该函数生成一个CSRF令牌,将其存储在请求中并重定向到发送重置电子邮件的正确URL。问题是according to this, django does not allow to pass POST parameters further in a redirect

因此我的问题是如何在没有CSRF令牌的情况下在Django中请求密码重置?或者,从应用程序请求此功能的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。请随意发布任何替代解决方案。一个不需要两个单独请求的人会特别好。

如果查看the password_reset method,您会发现如果请求方法是POST,它只会尝试将请求作为重置请求进行处理。否则,它只返回包含表单的TemplateResponse。这也包含CSRF令牌作为cookie。

首先,我向http://myaddress.com/user/password/reset/发送GET请求,并从响应中提取CSRF cookie。然后我发送一个POST请求,其中包含cookie,电子邮件地址和2个标题(见下文)。

这是我为实现此目的而实施的代码Android(已修剪):

String url = "http://myaddress.com/user/password/reset/";

获取请求:

HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
CookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpResponse httpResponse = httpClient.execute(httpGet, localContext);

Cookie csrfCookie = null;
for (Cookie cookie : cookieStore.getCookies()) {
    if (cookie.getName() == "csrftoken") {
        csrfCookie = cookie;
        break;
    }
}

if (csrfCookie == null) {
    throw new NullPointerException("CSRF cookie not found!");
}

return csrfCookie;

请注意,您需要CookieStore的{​​{1}}。

POST请求:

org.apache.http.client