Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 令牌身份验证Rest API会话_Javascript_Php_Ajax_Rest - Fatal编程技术网

Javascript 令牌身份验证Rest API会话

Javascript 令牌身份验证Rest API会话,javascript,php,ajax,rest,Javascript,Php,Ajax,Rest,我正在使用Slim框架创建一个无状态RESTAPI。在使用它之前,我在服务器端创建了一个会话,每个页面上都有会话检查。但现在,我不知道如何控制它 我的数据库中为每个用户都有一个api_密钥。用户登录后,我用api_键响应,并将用户重定向到index.php。但api_密钥不会保留。如何使用Javascript将api_键传递到每个页面?原因是,如果有人想从我的RESTAPI中获取数据,他们必须向我发送一个API_密钥,而且如果用户在我不想再次显示登录页面之前登录,他们也必须向我发送一个API_密

我正在使用Slim框架创建一个无状态RESTAPI。在使用它之前,我在服务器端创建了一个会话,每个页面上都有会话检查。但现在,我不知道如何控制它

我的数据库中为每个用户都有一个api_密钥。用户登录后,我用api_键响应,并将用户重定向到index.php。但api_密钥不会保留。如何使用Javascript将api_键传递到每个页面?原因是,如果有人想从我的RESTAPI中获取数据,他们必须向我发送一个API_密钥,而且如果用户在我不想再次显示登录页面之前登录,他们也必须向我发送一个API_密钥

以下是我的REST API部分:

$app->post('/userlogin', function() use ($app) {
    verifyRequiredParams(array('email', 'password'));
    $email = $app->request->post('email');
    $password = $app->request->post('password');

    $objUserRegLog = new UserRegistrationLogin;
    $result = $objUserRegLog->getUserByEmailAndPassword($email, $password);
    if (!$result) {
        $response["error"] = true;
        $response["message"] = "Error! Invalid e-mail address or password.";
    } else {
        $response["error"] = false;
        $response["id"] = $result["id"];
        $response["email"] = $result["email"];
        $response["api_key"] = $result["api_key"];
    }
    echoResponse(200, $response);
});

$app->get('/students', 'authenticateStudent', function() use ($app) {
    $objStd = new Students;
    $result = $objCases->getAllStudents();
    if (!$result) {
        $response["error"] = true;
        $response["error_msg"] = "An error occured.";
        $status_code = 404;
    } else {
        $response["error"] = false;
        $response["cases"] = $result;
        $status_code = 200;
    }
    echoResponse($status_code, $response);
});

function authenticateStudent(\Slim\Route $route) {
    $headers = apache_request_headers();
    $response = array();
    $app = \Slim\Slim::getInstance();

    if (isset($headers['Authorization'])) {
        $db = new DbOperation();
        $api_key = $headers['Authorization'];
        if (!$db->isValidStudent($api_key)) {
            $response["error"] = true;
            $response["message"] = "Access Denied. Invalid Api key";
            echoResponse(401, $response);
            $app->stop();
        }
    } else {
        $response["error"] = true;
        $response["message"] = "Api key is misssing";
        echoResponse(400, $response);
        $app->stop();
    }
}
还有AJAX的调用:

$.signin = function() {
    var inputVals = $("#form_signin").serialize();
    $.ajax({
        url : "api/v1/userlogin",
        data : inputVals,
        dataType : "json",
        type : "post",
        success : function(response) {
            if (response.error) {
                $(".popup").trigger("click");
                $(".modal-title").html(response.message_title);
                $(".modal-body").html(response.message);
            } else {
                window.location.href = "index.php";
            }
            console.log(response);
        }
    });
    return false;
}

嗯,您需要了解客户端发送到服务器的每个请求都是独立的,因此您需要在客户端系统中放置一个变量(令牌),以便让他在每个请求中发送它,这样您就知道谁一直在与您的服务器通话。开始阅读以下内容:


一旦您了解了Cookie是什么以及Cookie是如何工作的,请尝试进一步阅读有关身份验证和授权的主题。

好吧,您需要了解客户端发送到服务器的每个请求都是独立的,因此您需要在客户端系统中放置一个变量(令牌),以便让他在每个请求中发送它,因此,您知道谁一直在与您的服务器通话。开始阅读以下内容:


一旦您了解了什么是Cookie以及Cookie是如何工作的,请尝试进一步阅读有关身份验证和授权的主题。

您有三种方法来提供此类信息

Cookies

在大多数情况下,如果你有一个登录屏幕,你想使用赫克托提到的cookies。cookies的一个潜在问题是,有些人不希望cookies来自“随机”网站。但是,好的是,您可以关闭选项卡,重新打开它,并且仍然可以登录(这取决于cookie的类型,但在大多数情况下,您希望使用这种类型)

查询字符串

另一种单调乏味的方法是添加带有会话标识符的查询字符串参数。这也意味着您必须确保页面上的每个链接都包含该会话标识符。此外,它通常被视为一个安全问题,因为回头看的人可以看到会话标识符(坦白地说,除非他们有照相内存…),对于阻止cookie的人,这是另一种方式。但是,由于它使用的是完全相同类型的会话标识符,因此在阻止cookie时,您可能侵犯了用户的意思

HTML代码

最后一种方法需要做更多的工作,就是将值放入HTML中。例如,您可以使用
标记。至少通过这种方式,它被隐藏起来,不让人们从你身后看。但是你仍然需要在有人点击你的链接时传输它。这意味着您必须使用JavaScript中的帖子加载任何其他页面。那太不传统了。就像前面的方法一样。您可能侵犯了用户“请勿跟踪”的意愿

安全性如何?

最安全的方法是使用标记为仅HTTP的cookie建立HTTPS连接(即JavaScript无法访问它,因此它无法处理它)


所有其他方法都有额外的安全问题。

提供此类信息有三种方法

Cookies

在大多数情况下,如果你有一个登录屏幕,你想使用赫克托提到的cookies。cookies的一个潜在问题是,有些人不希望cookies来自“随机”网站。但是,好的是,您可以关闭选项卡,重新打开它,并且仍然可以登录(这取决于cookie的类型,但在大多数情况下,您希望使用这种类型)

查询字符串

另一种单调乏味的方法是添加带有会话标识符的查询字符串参数。这也意味着您必须确保页面上的每个链接都包含该会话标识符。此外,它通常被视为一个安全问题,因为回头看的人可以看到会话标识符(坦白地说,除非他们有照相内存…),对于阻止cookie的人,这是另一种方式。但是,由于它使用的是完全相同类型的会话标识符,因此在阻止cookie时,您可能侵犯了用户的意思

HTML代码

最后一种方法需要做更多的工作,就是将值放入HTML中。例如,您可以使用
标记。至少通过这种方式,它被隐藏起来,不让人们从你身后看。但是你仍然需要在有人点击你的链接时传输它。这意味着您必须使用JavaScript中的帖子加载任何其他页面。那太不传统了。就像前面的方法一样。您可能侵犯了用户“请勿跟踪”的意愿

安全性如何?

最安全的方法是使用标记为仅HTTP的cookie建立HTTPS连接(即JavaScript无法访问它,因此它无法处理它)


所有其他方法都有额外的安全问题。

为什么不使用cookies?@Héctor Valverde Pareja你能给我举个例子吗?cookies安全吗?@user3142206是的,如果您信任该用户,cookies是安全的。对于代币,这完全没问题。你为什么不使用饼干呢?@Héctor Valverde Pareja你能给我举个例子吗?cookies安全吗?@user3142206是的,如果您信任该用户,cookies是安全的。作为代币,这是完全可以的。