2017-05-29 140 views
0

我遇到DRF基于令牌的认证问题。以下是我的登陆页面的代码(登录后):Django 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 - How to do CSRF validation with token authentication)?

非常感谢!

回答

0

您需要先学习基础知识。什么是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,由于客户端无法控制会话的内容,它将毫无意义。会话变量在服务器上设置,而不是在客户端上设置。

+0

后悔如果我的措辞有点不正确我不希望我的浏览器追加任何东西。我想要的是登录,并且在登录过程中没有看到我的用户名/密码令牌。 Django身份验证正在发挥作用,并且作为后备,它的表现非常好。但是,基于令牌的使用方式无法正常工作。重申:这一切都没有DRF(香草Django),但令牌认证无效。 – Sayantan

+0

@Sangs我已经开始了我的答案,并建议先阅读文档。您没有正确使用令牌认证,因为您不明白什么是令牌认证以及如何使用它。要使用令牌认证,您必须:1)创建令牌2)将请求中的令牌传递给Authorization http头中的API方法。 –

+0

DRF包含一个确切的命令行,用于在此页面上使用令牌验证发出请求:http://www.django-rest-framework.org/api-guide/authentication/:'curl -X GET http://127.0.0.1 :8000/api/example/-H'授权:令牌9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'' –