我有一个管理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中请求密码重置?或者,从应用程序请求此功能的正确方法是什么??
答案 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