Django DRF令牌认证

我遇到DRF基于令牌的身份验证问题。 以下是我的着陆页代码(登录后):

@api_view(['GET','POST'],)
def landing(request):
    this_tenant=request.user.tenant
    end=date_first.date.today()
    start=end-date_first.timedelta(days=30)
    sales_daily=sales_day_wise(start, end, this_tenant)
    invoice_value=sales_raised_value(start, end, this_tenant)
    payment_value=sales_collected_value(start, end, this_tenant)
    return render(request,'landing.html', {'sales_daily':json.dumps(sales_daily, cls=DjangoJSONEncoder),
        'invoice_value':json.dumps(invoice_value, cls=DjangoJSONEncoder), 
        'payment_value':json.dumps(payment_value, cls=DjangoJSONEncoder)})

我使用Django的内置登录视图来验证和登录用户,然后我修改了考虑将标记放在标题中。 但那也不起作用

这是我的登录代码:

#Redirect authenticated users to landing page
def custom_login(request):
    if request.user.is_authenticated():
        token, created = Token.objects.get_or_create(user=request.user)
        request.session['AUTHORIZATION'] = "TOKEN "+token.key
        return redirect(landing)
    else:
        return login(request)

以下是我的DRF设置:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

问题是,当我登录并通过浏览器访问登录页面时,DRF无法正常工作,并且出现以下错误:

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

原因是请求中不存在自定义DRF标头(AUTHENTICATION = TOEKN XXXXXXXXXX)。

但是,如果我使用邮递员并放入自定义标题(AUTHENTICATION = TOKEN XXXXXXXXXXXX),那么它可以工作。

我如何解决它?

这是否意味着我需要为每个视图定制标题?

而在使用DRF令牌时,它是否会打开CSRF漏洞(这个问题:Django DRF - 如何使用令牌认证进行CSRF验证)?

非常感谢!!


你需要先学习基础知识。 什么是HTTP,什么是HTTP头,什么是Django会话(它不是HTTP头,会话内容不会影响头),请阅读有关令牌认证的Django REST Framework文档。

如果您想在浏览器中测试您的视图,请在DRF DEFAULT_AUTHENTICATION_CLASSES配置变量中明确允许Django会话身份验证。 它可以与令牌认证共存。

除非使用像RESTClient或DHC或REST Easy这样的插件,否则无法使纯Web浏览器向HTTP请求添加标记。

您将令牌添加到Django会话中,但您已禁用DRF中的会话认证,即使启用它,DRF也不会从Django会话读取令牌,因为API客户端无法将令牌添加到Django会话。 即使DRF从Django会话中读取Token,由于客户端无法控制会话的内容,它将毫无意义。 会话变量在服务器上设置,而不是在客户端上设置。

链接地址: http://www.djcxy.com/p/33777.html

上一篇: Django DRF Token Authentication

下一篇: Django Rest Framework Authentication Errors