Как создать json php api, который подключается только к собственному приложению expo response?

У меня есть следующий код 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 в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
407
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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();
}

Имейте в виду, что переменная $_SERVER['HTTP_AUTHORIZATION'] не всегда доступна на каждом веб-сервере. Как правильно использовать токены на предъявителя с PHP

Marcel 14.12.2020 14:02
Ответ принят как подходящий

Во-первых, в вашем приложении есть секретный ключ (например, 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 среди прочего, эта экспозиция данных реагирует, как-то защищает их или они уязвимы

user12865281 14.12.2020 14:08

Чтобы избежать этого, вы можете попробовать не помещать «Stackoverflow1234#@$%x» в качестве строки в свой APK. На самом деле вы должны разделить данные, скажем, на 3-4 части и поместить их в отдельные переменные, а затем в своей строке выборки вы объедините их вместе перед отправкой. (таких трюков много, иногда я тоже возвращаю строку).

Ken Lee 14.12.2020 14:14

И вы также заметите, что я всегда буду использовать https , поэтому даже кто-то использует ваше приложение и прослушивает трафик, он / она не сможет получить строку «Stackoverflow1234#@$%x»

Ken Lee 14.12.2020 14:15

Очень интересно звучит метод деления на 3 или 4 части примерно так можно stackoverflow.com/questions/51786990/…

user12865281 14.12.2020 14:21

Да, есть много методов, вы можете использовать свое собственное воображение, чтобы изобрести желаемое «шифрование». Получайте удовольствие от кодирования.

Ken Lee 14.12.2020 14:24

Основываясь на ответе Арнольда Дэниэлса, вот часть вашего ответа на запрос.

fetch('example.com/api/json', {
    method: 'POST',
    headers: {
        'Authorization': 'Bearer ' + btoa('username:password'),
    },
    body: ...
});

Комбинация username:password — это просто пример. Вместо комбинации имени пользователя и пароля вы можете использовать любую закодированную строку, которую хотите. Он должен быть действителен с токеном на вашей серверной (PHP) стороне.

Другие вопросы по теме