首页 > 解决方案 > 尽管输入了令牌,但无法访问 API

问题描述

我有一个只能通过传递 JWT 令牌访问的 API。我在 Django 中使用Simple-JWT库。此外,我已将此令牌存储在我的 localStorage 中,并通过 Ajax 在我的视图模块中获取它。我使用 GET 方法创建了一个 API,它应该从模型中检索某些数据。但是,当通过 Python 中的 Requests 模块访问 API URL 时,它仍然说没有提供身份验证凭据。请参阅下面的代码:

模型.py:

class Mymodel(models.Model):
    emp= models.ForeignKey(User, on_delete = models.CASCADE)
    entry_time = models.DateTimeField()

视图.py:

def get_time(request):
    if (request.method == 'GET'):
        tk = request.GET.get('token') #from AJAX
        headers = {'Authorization': 'JWT {}'.format(tk), 'content-type': "application/json",}
        url = 'http://127.0.0.1:8000/secret_api/'
        response = requests.get(url, headers = headers)
        if response:
            print("success")
            return HttpResponse(response)

class MyAPI(generics.ListAPIView):
    permission_classes = [IsAuthenticated] 
    def get(self, request, format = None):
        user_id = User.objects.get(username=request.GET.get('username')).pk
        user = User.objects.get(id = user_id)
        if not Mymodel.objects.filter(emp=user).exists():
            current_time = timezone.now()
            time = Mymodel.objects.create(emp=user, entry_time=current_time)
            data = time.entry_time
        return data #returns time 

AJAX 调用:

 $.ajax({
     cache: false,  
     url: {% url 'get_time' %}, #points to the get_time function
     type: 'GET',
     data: {username: username, token: token},
     success: function(data) {
         $("#time").html(data);
     }

但是,在执行 get_time 函数时,我收到此错误:

{"detail": "Authentication credentials were not provided."}

当我从以下位置更改标题时:

headers = {'Authorization': 'Bearer {}"'.format(tk)}

我收到此错误:

{"detail":"Given token not valid for any token type","code":"token_not_valid","messages":[{"token_class":"AccessToken","token_type":"access","message":"Token is invalid or expired"}]}

我 100% 肯定从 AJAX 传递的令牌是正确的。我哪里错了?

标签: djangodjango-rest-frameworkjwt

解决方案


你检查了你的settings.py。确保输入正确的令牌到期时间。

在你的 settings.py

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(days=15),
    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=15),
}

确保python manage.py migrate在更改后点击并重新启动 django 服务器。


推荐阅读