2

我正在使用Django的cookie身份驗證。Chrome擴展和Django:驗證是否允許第三方Cookie

我有一個Chrome擴展。當用戶單擊分機按鈕時,分機向my_site.com/cookie_test/發送xmlHttp請求

附加到此URL的視圖可讓用戶知道他是否已登錄到my_site.com。 (它確實其他的東西爲好。)

Content_script.js

function got_response(){ 
    if (xmlHttp.readyState == 4){ 
     alert(xmlHttp.responseText); 
    } 
} 

var xmlHttp=new XMLHttpRequest(); 
xmlHttp.open("POST", "my_site.com/cookie_test/",true); 
xmlHttp.onreadystatechange = got_response; 
xmlHttp.send(); 

通過my_site.com/cookie_test/

@csrf_exempt 
def cookie_test(request): 
    if not request.user.is_authenticated(): 
     return HttpResponse("not logged in") 
    else: 
     return HttpResponse("logged in") 

病例1名爲View功能:用戶是登錄到我的網站和瀏覽器允許第三方cookies

結果:「登錄」正確

案例2:用戶沒有登錄在

結果:「在沒有登錄」正確

案例3:用戶登錄,但瀏覽器不不是允許第三方Cookie

結果:「在沒有登錄」不正確

我的問題

如果用戶的瀏覽器不允許使用第三方cookie,如何顯示消息「更改cookie設置!」換句話說,我該如何區分未登錄和不允許第三方Cookie的區別?這可以是服務器端或客戶端。

+0

也許牛逼View功能ry使用另一個cookie進行測試 - 在每個頁面上設置並在您的請求中進行檢查。 – Tzach

回答

1

最後我做什麼:

摘要:待辦事項request.session.set_test_cookie()在第一次調用如果沒有餅乾。在這種情況下,回覆「潛在的cookie問題」。在content_script中,如果獲得此響應,請使用request.session.test_cookie_worked()進行第二次調用並測試cookie是否存在。

通過第一個電話

if not request.user.is_authenticated(): 
    if len(request.COOKIES) == 0: 
     # User does not allow third party cookies or cookies are deleted/expired 
     request.session.set_test_cookie() # Django function 
     return HttpResponse("potential cookie issue") 
    else: 
     return HttpResponse("not logged in") 
else: 
    return HttpResponse("logged in") 
    # would actually continue and do stuff here instead 

View功能通過第二個電話叫叫

if not request.session.test_cookie_worked(): # Django function 
    return HttpResponse("third party cookies not allowed")  
else: 
    return HttpResponse("not logged in") 

content_script.js

function got_response(){ 
    if (xmlHttp.readyState == 4){ 
     if (response_data == "potential cookie issue"){ 
       function got_response2(){ 
        if (xmlHttp2.readyState == 4){ 
         display_response(xmlHttp2.responseText); 
         /*either not logged in or cookie issue depending on response*/ 
        } 
       } 
       var xmlHttp2=new XMLHttpRequest(); 
       xmlHttp2.open("GET", domain+"/second_call/",true); 
       xmlHttp2.onreadystatechange = got_response2; 
       xmlHttp2.send(); 
     } 
     else{/* not logged in or logged in depending on response*/} 
    } 
} 

var xmlHttp=new XMLHttpRequest(); 
xmlHttp.open("POST", "my_site.com/first_call/",true); 
xmlHttp.onreadystatechange = got_response; 
xmlHttp.send();