Я новичок в Angular и Data Api с Slim. Я создаю данные Api с Slim, используемыми Angular. Мой код api приведен ниже:
include 'dbConfig.php';
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$slim_app = new \Slim\Slim();
$slim_app->get('/getUser','getUser');
$slim_app->post('/updateUser','updateUser');
$slim_app->post('/newUser','newUser');
$slim_app->run();
function getUser(){
global $mysqli;
$result = $mysqli->query("select * from users");
if(!$result){ echo "not connect";}
$rows = array();
while($row = $result->fetch_assoc()){
$rows[] = $row;
}
//echo "<pre>";
print json_encode($rows);
}
Мой контроллер
myApp.controller('Ctrl',function ($scope, $http) {
$http.get('api/getUser').
success(function(data, status, headers, config){
$scope.obj = data;
});
});
Когда я перехожу к localhost/api/getUser, я могу видеть все мои данные json, чтобы все могли видеть. как я могу только разрешить моему Угловому приложению использовать мой api, чтобы он был безопасным?
Правильно,
Это сложный вопрос, но в простейшей форме вам нужен логин, который возвращает ключ API вашему клиенту, как...
ПРИМЕЧАНИЕ. Это очень простой код, который я использую для целей тестирования, он не имеет надлежащего хэширования паролей и проверки срока доступа к токену плюс справедливый бит другой безопасности. Это просто иллюстрирует простой пример.
app->get('/login/:username/:password', function ($username, $password) use ($app, $db) {
//check the login details against the db...
// TODO Include hashing FIX BEFORE PRODUCTION
$db->where("userName", $username);
$db->where("password", $password);
$result = $db->getOne('Users');
if ($db->count === 0) {
setResponseCode(401, array("Error" => "Incorrect login details."));
return;
}
// The way this key is generated needs updating, only for testing purposes.
$key = date("Y-m-d");
$key = $key . $username;
$key = md5($key);
// Need to add expiry time to access tokens....
$expire = date("Y-m-d H:i:s", strtotime('+15 minutes'));
$data = Array ('accessToken' => $key);
$db->where('id', $result['id']);
if (!$db->update('Users', $data)) {
// Internal error - this shouldn't happen!
setResponseCode(500, array("Error" => "Database error."));
return;
}
// Slim by default returns 200 so no need to call setResponseCode
echo json_encode(array("Authorisation" => $key));
});
function setResponseCode($code, $arrayJson) {
global $app;
/*
Function to save repetition of response headers - params are:
Int Code - HTTP Response Code
Array array_json - an array to be serialized into a JSON response ie array("Key" => "Item")
*/
$app->response->setStatus($code);
$app->response->SetBody(json_encode($arrayJson));
$app->response->headers->set('Content-Type', 'application/json');
}
function authorise($key) {
// Middleware for routes that require auth!
//global $key;
global $userId;
global $app;
global $db;
// need to add check for token expiry here!
$db->where('accessToken', $key);
$results = $db->getOne('Users', null, array('id'));
if ($db->count === 0) {
setResponseCode(401, array("Error" => "Authorisation Failure"));
$app->stop();
//return false;
}
$userId = $results['id'];
return true;
}
Вашему клиенту необходимо сохранить ключ и добавить его к параметрам в любой запрос, который вы можете использовать с заголовками или просто с простыми параметрами. Опять же, я использовал google slim, API, токен доступа, учебник как термины, потому что это очень простой ответ на сложный вопрос.
Теперь вы просто добавляете authorize ($ key) в начало любого маршрута, который ему нужен, если он ложный, он вернет 401 и прекратит дальнейшее выполнение. Я бы рекомендовал сделать еще немного чтения, хотя это очень, очень простой ответ.