2013-10-03 32 views
2

我使用Python/Django和出色的Django REST框架創建了一個REST Web API。對AJAX網絡應用使用REST令牌認證的好主意?

我正在嘗試使用身份驗證方法,並想知道是否對AJAX Web應用程序使用「令牌身份驗證」是一種很好的做法。

我在一個非常基本的CRUD web應用程序中包含了一個示例HTML文件,演示了我目前如何使用令牌身份驗證。它工作正常,但它確實沒問題(關於安全性等)只在源代碼中包含身份驗證令牌?基本認證似乎是一個很好的選擇,但是我必須在源代碼中包含用戶名和密碼,這對我來說似乎更糟?

腳註:我知道REST通過HTTPS協議更好地用於安全性,但我在開發機器上運行此代碼,顯然。我正計劃在生產中使用HTTPS。

在此先感謝您的任何提示!

親切的問候, 克里斯托夫

{% extends 'base.html' %} 
{% block title %}Games{% endblock %} 
{% block content %}<script type="text/javascript">/*<![CDATA[*/ 
function getBase() { 
    return 'http://api.sandbox.dev:8080/'; 
} 
function getData() { 
    return { 
     id: $('#id').val(), 
     title: $('#title').val(), 
    }; 
} 
function getToken() { 
    return 'b26ffd6ddb66428ce9164d606f694cd4184ce73e'; 
} 
$(document).ready(function(){ 
    $('#create').click(function(e){ 
     $.ajax({ 
      url: getBase() + 'games/', 
      type: 'POST', 
      data: getData(), 
      dataType: 'json', 
      headers: { 
       authorization: 'token ' + getToken(), 
      }, 
      complete: function(xhr, textStatus) { 
       console.log('textStatus = ' + textStatus); 
      }, 
      success: function(data, textStatus, xhr) { 
       console.log('textStatus = ' + textStatus); 
      }, 
      error: function(xhr, textStatus, errorThrown) { 
       console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown); 
      }, 
     }); 
    }); 
    $('#update').click(function(e){ 
     if(getData().id) { 
      $.ajax({ 
       url: getBase() + 'games/' + getData().id + '/', 
       type: 'PUT', 
       data: getData(), 
       dataType: 'json', 
       headers: { 
        authorization: 'token ' + getToken(), 
       }, 
       complete: function(xhr, textStatus) { 
        console.log('textStatus = ' + textStatus); 
       }, 
       success: function(data, textStatus, xhr) { 
        console.log('textStatus = ' + textStatus); 
       }, 
       error: function(xhr, textStatus, errorThrown) { 
        console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown); 
       }, 
      }); 
     } 
    }); 
    $('#delete').click(function(e){ 
     if(getData().id) { 
      $.ajax({ 
       url: getBase() + 'games/' + getData().id + '/', 
       type: 'DELETE', 
       data: {}, 
       dataType: 'json', 
       headers: { 
        authorization: 'token ' + getToken(), 
       }, 
       complete: function(xhr, textStatus) { 
        console.log('textStatus = ' + textStatus); 
       }, 
       success: function(data, textStatus, xhr) { 
        console.log('textStatus = ' + textStatus); 
       }, 
       error: function(xhr, textStatus, errorThrown) { 
        console.log('textStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown); 
       }, 
      }); 
     } 
    }); 
}); 
/*]]>*/</script><form action="" method="post" onsubmit="return false"> 
    <dl> 
     <dt><label for="id">ID</label></dt> 
     <dd><input type="text" id="id" name="id" size="20" maxlength="10" /></dd> 
     <dt><label for="title">Title</label></dt> 
     <dd><input type="text" id="title" name="title" size="20" maxlength="20" /></dd> 
    </dl> 
    <p><button type="button" id="create">Create</button></p> 
    <p><button type="button" id="update">Update</button></p> 
    <p><button type="button" id="delete">Delete </button></p> 
</form>{% endblock %} 

回答

0

TokenAuthentication大多與連接到服務器的本地客戶端,諸如此類的iOS,安卓或Windows的應用程序等使用..

當使用Ajax處理(使用Web應用程序),您應該使用SessionAuthentication。這樣可以避免提供任何其他數據。唯一的要求是用戶登錄。

+0

確定 - 因爲可瀏覽的REST API也使用會話驗證,所以非常有意義。感謝您的確認! :-) – Braek

0

當您查看HTTP電報時,TokenAuthentication和SessionAuthentication行爲類似:它們都以純文本形式發送用戶名和密碼,並在登錄過程中將其標記爲一個散列唯一地標識它們到系統(標記使用標題,會話在服務器端Cookie上保存)。

必須瞭解會話身份驗證會將會話保留在dB後端,這需要在生產系統中進行維護(清理過期會話?),或者它可能是性能瓶頸,基於解決方案

只有當我需要實現某種超時機制時,纔會選擇SessionAuthentication,以便在讓我們假設15分鐘不活動或者檢查用戶是否有多個登錄(從多個瀏覽器這很可能存在於幾臺機器中)。

底線:你是TokenAuthentication完全沒有問題,如果你有SessionAuthentication去關心它會真正成爲你的目的,否則它帶來了一些問題處理不那麼明顯。