【问题标题】:HTTP 403 while executing a PUT request执行 PUT 请求时出现 HTTP 403
【发布时间】:2015-12-23 20:06:10
【问题描述】:

我正在创建一个 django rest api,我正在尝试使用 HttpUrlConnection 通过 Android 设备的 PUT 请求发送 JSON 数据。

URL url = new URL(myurl);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("PUT");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
Log.v("Apiput", MainActivity.cookieManager.getCookieStore().getCookies().get(0).toString());
conn.connect();
if(conn.getResponseCode() != 200) {
    return "" + conn.getResponseCode();
}
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream());
osw.write(put);
osw.flush();
osw.close();`

我知道我必须发送一个 csrf 令牌,但我认为我已经发送了它。 通过检查我的请求中的 META,我可以在标头和 cookie 中看到 csrf 令牌:

'HTTP_COOKIE': 'csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx;'

在我的 android 设备中,我有一个 CookieManager,它说 csrf cookie 具有相同的值。

V/Apiput﹕ csrftoken=3jLNzfLIu1P5dBH4WWwggHMH7oDQC7Rx

除了用户经过身份验证之外,我收到 403(禁止)Http 错误(我可以发出 GET 请求)

[26/Sep/2015 00:16:04]"PUT /api/works/34/ HTTP/1.1" 403 58

使用 curl 我可以毫无问题地使用相同的用户凭据发送请求。

我想知道是否有人可以告诉我我做错了什么。

谢谢。

【问题讨论】:

  • 尝试从 ContentType 中删除 "; charset=UTF-8"。当 DRF 是 ContentType 的一部分时,我在选择正确的解析器时遇到了问题。

标签: java rest csrf httpurlconnection http-put


【解决方案1】:

如果您对 Django REST 框架进行 JSON 调用,则不必设置 cookie。 如果您可以提供与视图关联的权限,这绝对会有所帮助。

【讨论】:

  • 我有一个带有 GET、PUT 和 POST 方法的 ApiView,具有 isAuthenticated 权限。我可以访问 GET 方法,但无法访问 PUT 和 POST。我什至尝试将权限更改为 AllowAny,但仍然没有成功。
猜你喜欢
  • 1970-01-01
  • 2019-07-23
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多