【问题标题】:Do I have a complete HTTP header to authenticate properly我是否有完整的 HTTP 标头来正确验证
【发布时间】:2017-07-14 21:01:20
【问题描述】:

构建 Django Rest 框架。当我使用“curl”使用有效令牌调用 API 时,它可以工作:

curl -viL -H "Authorization: Token 65c38dfe0c910b727197683aebdcc1c67c1b7aa3" http://127.0.0.1:8000/api/habit/ 

通过我的 javascript 调用的相同 API 调用失败,Django 将其视为匿名用户并出错。

fetchHabits: function() {
  console.log('Token '+this.authToken.token);
  fetch('http://127.0.0.1:8000/api/habit/?format=json',{
     method: 'GET',
     headers: {
       'Accept': 'application/json',
       'Content-Type': 'application/json',
       'Authorization': 'Token '+this.authToken.token
     }
  })
  .then(response => response.json())
  .then(json => this.habits = json)
},

我已经证明发送和接收了正确的令牌。我假设因为 CURL 有效,所以 Django 代码正在工作,因此错误位于 Javascript 端的标头中。

有人可以帮忙吗?

【问题讨论】:

  • 如果您使用像 Fiddler 这样的工具,您可以检查这两个请求并发现请求中的任何差异,以及响应中的任何差异。你得到什么实际错误? 401、403,我猜?
  • 不,我得到了 500,因为 Django 将其视为匿名用户并抛出。昨天一整天我都认为这是一个 Django 问题,直到 CURL 第一次工作。所以现在我假设我错误地编写了 HEADER。
  • 好的,我原以为框架会认为这是权限错误并返回与权限相关的代码。但也许它不够精明。我真的不知道Django。无论如何,就像我说的那样,你最好的起点是使用 Fiddler(或类似的)比较生成的 HTTP 请求并找出差异,看看你出现了什么。

标签: javascript curl django-rest-framework


【解决方案1】:

HTTP 标头中缺少一个组件,它需要有“cedentials: 'included'” 最后的标题是:

  fetch('http://127.0.0.1:8000/api/habit/?format=json',{
     method: 'GET',
     headers: {
       'Accept': '*/*',
       'Content-Type': 'application/json',
       'Authorization': 'Token '+this.authToken.token
     },
     credentials: 'include'
  })

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2014-09-27
    • 2017-01-16
    • 2011-01-25
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多