2017-05-29 137 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'' –