DRF& axios - 令牌身份验证不返回带有axios的令牌,但是使用curl

时间:2017-08-23 15:36:30

标签: curl django-rest-framework vuejs2 axios

如果我运行这个| Field | Type | Null | Key | Default | Extra | +-------------------------------+--------------+------+-----+---------+-------+ | | id | varchar(255) | NO | | NULL | | | email | varchar(120) | NO | MUL | NULL | | | mbid | varchar(120) | YES | | NULL | | | artist | varchar(250) | YES | | NULL | | | track | varchar(250) | YES | | NULL | | | plays | float | YES | | NULL | | | track_count | int(11) | YES | | NULL | | | lastfm_last_update | datetime | YES | | NULL | | +-------------------------------+--------------+------+-----+---------+-------+ 命令,它可以工作:

curl

但如果我使用axios执行以下操作,则会失败并返回-> curl -X POST http://localhost:8000/api/token-auth/ --data "username=garfonzo&password=garfonzo" -> {"token":"79b2428019994713d61bb2f728ae62ae8c8be9ee"}%

401

来自服务器的响应:

const API_URL = 'http://localhost:8000/api/'
const LOGIN_URL = API_URL + 'token-auth/'

// "creds" in this situation is a dict of { username: 'garfonzo', password: 'garfonzo' }
axios.post(LOGIN_URL, creds).then((response) => {
  localStorage.setItem('token', response.data.token)
  this.user.authenticated = true

  // If a redirect link is provided
  if (redirect) {
    router.push(redirect)
  }
}).catch((err) => {
  console.log(err)
})

我做错了什么?

编辑:此外,此axios请求正在vueJS项目上完成

编辑这是Chrome开发工具的网络标签在通过axios执行请求时显示的内容:

->"POST /api/token-auth/ HTTP/1.1" 401 27

1 个答案:

答案 0 :(得分:0)

我想出来了(经过一整天的调试......):

问题在于DEFAULT_AUTHENTICATION_CLASS的{​​{1}}阻止了TokenAuthentication axios请求甚至被调用。由于我的POST调用在标题中没有包含令牌(因为......它正在尝试获取令牌),axios类会使用401代码立即拒绝它。

所以我所做的是创建一个自定义TokenAuthentication类,该类是DRF SFObtainAuthToken的子类,但我用空ObtainAuthToken来装饰它。然后,当我将authentication_class([]) URL连接到我的自定义api/token-auth/时,它将允许该请求,因为没有绑定到它的身份验证类。

希望这有助于其他人坚持这个问题:)

<强>网址

SFObtainAuthToken

自定义ObtainAuthToken类

url(r'^api/token-auth/', SFObtainAuthToken.as_view())

Django设置

from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.decorators import authentication_classes, permission_classes

@authentication_classes([])
class SFObtainAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        return super(SFObtainAuthToken, self).post(request, *args, **kwargs)