У меня есть следующий код PHP, в котором я намереваюсь преобразовать его в API для отображения моих спортивных новостей, размещенных в приложении PHP, и данных, хранящихся в MYSQL, поэтому я хочу показать эти записи моих новостей в приложении, разработанном в Expo. Реагировать нативно.
$stmt = $con->prepare("SELECT
url,
cover_page,
alt_img,
mini_title,
mini_description,
date_post,
confg_img,
main_cover
FROM news ORDER BY id_news DESC LIMIT 5");
//$stmt->bind_param("i", $id);
$stmt->execute();
$member = array();
$stmt->bind_result(
$member['url'],
$member['cover_page'],
$member['alt_img'],
$member['mini_title'],
$member['mini_description'],
$member['date_post'],
$member['confg_img'],
$member['main_cover']
);
//Los {}corchetes " " especifican un objeto y " []" se utilizan para matrices de acuerdo con la especificación JSON.
header('Content-Type: application/json');
//header('Content-type: application/json; charset=utf-8');
echo '[';
$count = 0;
while ($stmt->fetch()) {
if ( $count ) {
echo ',';
}
//echo json_encode($member, JSON_UNESCAPED_SLASHES);
echo json_encode($member, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_FORCE_OBJECT);
++$count;
}
echo ']';
Код уже генерирует для меня структуру JSON, выводя данные в JSON таким образом:
[{
"url": "es/deportes/futbol/ecuador/ligapro/serie-a/679/oscar-bagui-es-el-hombre-record-en-emelec",
"cover_page": "https://i.imgur.com/UI5IaZ5.jpg",
"alt_img": "Oscar Bagui ",
"mini_title": "Oscar Bagui es el hombre r\u00e9cord en Emelec",
"mini_description": "El defensa el\u00e9ctrico sigue siendo importante para los el\u00e9ctricos",
"date_post": "2020-12-13 21:24:37",
"confg_img": null,
"main_cover": "featured_news"
},{
"url": "es/deportes/futbol/ecuador/ligapro/serie-a/675/la-dirigencia-de-liga-de-quito-quiere-cerrar-el-fichaje-de-este-jugador-del-extranjero",
"cover_page": "https://i.imgur.com/7p6l5ZA.jpg",
"alt_img": "Posible fichaje de Liga de Quito desde la MLS",
"mini_title": "La dirigencia de Liga de Quito quiere cerrar el fichaje de este jugador del extranjero",
"mini_description": "Los albos quieren potenciar su plantilla para 2021",
"date_post": "2020-12-13 13:56:45",
"confg_img": null,
"main_cover": "relevant_news"
}]
Но на этом маршруте example.com/api/json.php мне нужно создать код, ключ, который разрешает только соединение с приложением, только приложение, имеющее ключ доступа к приложению, покажет данные, этот ключ в некоторых Примеры, которые я видел, я понимаю, что некоторые параметры проходят через URL.
Итак, мой вопрос в том, как распечатать данные в expo, реагирующие на родные, но вызов данных связан с ключом между приложением и API json php






php ==>
if (!isset($_POST['Key'])){
//return error json code (you dont have access)
}
реагировать родной ==>
fetch('example.com/api/json.php', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
Key: 'yourKey'
})
});
вы также можете указать ключ в php-коде
if ($_POST['Key']!=='Your key'){
//return json error code (key doesnt match)
}
То, что вы ищете, называется Аутентификация носителя. При аутентификации носителя пользователь должен отправить токен в Authorization заголовке HTTP, чтобы использовать API.
Authorization: Bearer <token>
В PHP этот заголовок будет доступен как $_SERVER['HTTP_AUTHORIZATION'].
Вы можете извлечь токен и проверить его по базе данных.
[$type, $token] = explode(' ', $_SERVER['HTTP_AUTHORIZATION'] ?? '', 2) + ['', ''];
if (strtolower($type) !== 'bearer' || !validate_token($token)) {
http_response_code(403); // forbidden
echo "Missing or invalid Bearer authentication";
exit();
}
Во-первых, в вашем приложении есть секретный ключ (например, Stackoverflow1234#@$%x), который никто не знает.
и в вашем php вы можете использовать это
<?php
if ( isset($_REQUEST['key']) && $_REQUEST["key"]== "Stackoverflow1234#@$%x") {
/// codes to connect to your DB and generate the JSON
}
?>
а в своем родном приложении вы можете использовать https://www.yourdomain.com/xxx.php?key=Stackoverflow1234#@$%x для получения данных, например:
return fetch('https://www.yourdomain.com/xxx.php?key=' + secretkey)
.then((response) => response.json())
.then((responseJson) => {
this.setState({
retrievedata: responseJson
}, function() {
// In this block you can do something with new state.
});
})
.catch((error) => {
console.error(error);
});
У меня есть сомнения, есть методы, позволяющие извлечь файлы приложения из его APK, сделав что-то вроде этого, эти данные, такие как ключи API, KEY среди прочего, эта экспозиция данных реагирует, как-то защищает их или они уязвимы
Чтобы избежать этого, вы можете попробовать не помещать «Stackoverflow1234#@$%x» в качестве строки в свой APK. На самом деле вы должны разделить данные, скажем, на 3-4 части и поместить их в отдельные переменные, а затем в своей строке выборки вы объедините их вместе перед отправкой. (таких трюков много, иногда я тоже возвращаю строку).
И вы также заметите, что я всегда буду использовать https , поэтому даже кто-то использует ваше приложение и прослушивает трафик, он / она не сможет получить строку «Stackoverflow1234#@$%x»
Очень интересно звучит метод деления на 3 или 4 части примерно так можно stackoverflow.com/questions/51786990/…
Да, есть много методов, вы можете использовать свое собственное воображение, чтобы изобрести желаемое «шифрование». Получайте удовольствие от кодирования.
Основываясь на ответе Арнольда Дэниэлса, вот часть вашего ответа на запрос.
fetch('example.com/api/json', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + btoa('username:password'),
},
body: ...
});
Комбинация username:password — это просто пример. Вместо комбинации имени пользователя и пароля вы можете использовать любую закодированную строку, которую хотите. Он должен быть действителен с токеном на вашей серверной (PHP) стороне.
Имейте в виду, что переменная
$_SERVER['HTTP_AUTHORIZATION']не всегда доступна на каждом веб-сервере. Как правильно использовать токены на предъявителя с PHP