如果我运行这个| 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
答案 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)