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