代码之家  ›  专栏  ›  技术社区  ›  Braek

为AJAX web应用程序使用REST令牌身份验证是个好主意?

  •  2
  • Braek  · 技术社区  · 12 年前

    我使用Python/Django和出色的Django REST框架创建了一个REST web API。

    我目前正在试验身份验证方法,想知道对AJAX网络应用程序使用“令牌身份验证”是否是一种好的做法。

    我包含了一个示例HTML文件和一个非常基本的CRUD web应用程序,演示了我目前如何使用令牌身份验证。它工作得很好,但在源代码中只包含身份验证令牌真的可以吗(关于安全性等)?基本身份验证似乎是一个很好的选择,但我必须在源代码中同时包含用户名和密码,这对我来说似乎更糟?

    脚注:我知道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 %}
    
    2 回复  |  直到 12 年前
        1
  •  0
  •   mariodev    12 年前

    TokenAuthentication 主要用于连接到服务器的本地客户端,如iOS、Android或windows应用程序等。。

    在处理ajax(使用web应用程序)时,您应该使用 SessionAuthentication 。这样可以避免您提供任何其他数据。唯一的要求是用户必须登录。

        2
  •  0
  •   Roba    10 年前

    当你查看HTTP电报时,TokenAuthentication和SessionAuthentication的行为是相似的:它们都在登录期间以纯文本发送用户名和密码,然后用一个哈希标记它们的请求,该哈希向系统唯一标识它们(令牌使用标头,会话持久化在服务器端cookie上)。

    人们必须理解,会话身份验证将会话保留在dB后端,这确实需要在生产系统中进行维护(谁来清理过期的会话?),或者这可能是一个性能瓶颈,需要基于缓存的解决方案。

    只有当我需要实现某种超时机制时,我才会选择SessionAuthentication,这样我就会在15分钟的非活动状态后将会话渲染为过期,或者检查用户是否有多次登录(来自多个浏览器,这些浏览器很可能驻留在多台机器中)。

    要旨 :您对TokenAuthentication非常满意,如果您使用SessionAuthentication,请注意它将真正达到您的目的,否则会带来一些不那么明显的问题。