Laravel 7 — используйте REST API вместо базы данных

Я использую rest API для хранения/извлечения моих данных, которые хранятся в базе данных postgres. API — это не laravel, это внешний сервис!

Теперь я хочу создать веб-сайт с laravel (версия фреймворка 7.3.0), и я застрял в том, как правильно реализовать вызовы API.

Например: я хочу иметь настраиваемого поставщика пользователей, с помощью которого пользователи могут входить в систему на веб-сайте. Но проверка предоставленных учетных данных выполняется API, а не laravel.

Как я могу это сделать?


person pollux    schedule 01.04.2020    source источник
comment
Это не вместо ситуации. Ваш REST API обращается к базе данных.   -  person ceejayoz    schedule 01.04.2020
comment
Вот так. Я должен был уточнить это сейчас, удалив некоторые части исходного текста.   -  person pollux    schedule 01.04.2020


Ответы (2)


Просто создайте контроллер регистрации и контроллер входа с помощью «php artisan make:controller ControllerName» и напишите там логику аутентификации.

В предыдущих версиях Laravel у вас была такая команда, как «php artisan make:auth», которая сделает все необходимое для выполнения этих операций. Но в Laravel 7.0 вам нужно установить пакет с именем laravel/ui.

Запустите "composer required laravel/ui", чтобы установить этот пакет. Затем запустите «php artisan ui bootstrap --auth», и теперь вы можете запустить «php artisan make: auth».

Эта команда сделает за вас всю систему регистрации (Signup) и входа в систему.

и для того, чтобы работать с REST, вам может понадобиться знать глаголы REST (Http). Узнайте о запросах GET, POST, PUT, PATH, DELETE и о том, как выполнять эти запросы с помощью методов сбора PHP и Laravel. Узнайте об анализе, кодировании и декодировании JSON. Тогда вы сможете легко работать с REST. и работать без кодов шаблонов из других пакетов.

Большое спасибо. Я надеюсь, что этот ответ даст вам новую информацию/мысль. Спасибо еще раз.

person Sunwarul Islam    schedule 01.04.2020
comment
Спасибо за ваш комментарий. API также написан мной, поэтому я знаю, что делаю... по крайней мере, вроде как. Как правильно упомянул Омар, я застрял в том, как реализовать это с помощью laravel. Так что посмотрю паспорт. - person pollux; 01.04.2020

Редактировать:

Это может быть не лучший способ. Но это то, что я сделал в то время. Я попробовал curl и guzzle, чтобы создать запрос с файлом cookie сеанса и всем в заголовке, чтобы он выглядел как запрос из веб-браузера. Не удалось заставить это работать.

Я использовал идентификатор канала веб-сокета для браузера, в котором я хочу, чтобы изменения произошли, и объединил его с другими вещами, а затем зашифровал его с помощью encrypt($string). После этого я использовал зашифрованную строку для создания QR-кода.

Мобильное приложение (которое уже входило в систему как аутентифицированный пользователь) отсканировало его и сделало почтовый запрос с этой строкой QR и другими данными. Паспорт позаботился об аутентификации этого запроса. После расшифровки строки QR у меня был идентификатор канала веб-сокета.

Затем я транслировал на этом канале правильные событие и данные. Перехватил эту трансляцию в браузере и перезагрузил эту страницу с помощью JavaScript.

/*... processing other data ...*/     
$broadcastService = new BroadcastService();
$broadcastService->trigger($channelId, $eventName, encrypt($$data));
/*... returned response to the mobile app...*/

Моя служба вещания:

namespace App\Services;

use Illuminate\Support\Facades\Log;
use Pusher\Pusher;
use Pusher\PusherException;

class BroadcastService {
    public $broadcast = null;

    public function __construct() {
        $config = config('broadcasting.connections.pusher');
        try {
            $this->broadcast = new Pusher($config['key'], $config['secret'], $config['app_id'], $config['options']);
        } catch (PusherException $e) {
            Log::info($e->getMessage());
        }
    }

    public function trigger($channel, $event, $data) {
        $this->broadcast->trigger($channel, $event, $data);
    }
}

С моей точки зрения :

<script src="{{asset('assets/js/pusher.js')}}"></script>
<script src="{{asset('assets/js/app.js')}}" ></script>
<script>
    <?php
    use Illuminate\Support\Facades\Cookie;
    $channel = 'Channel id';
    ?>
    Echo.channel('{{$channel}}')
        .listen('.myEvent' , data => {
            // processing data
            window.location.reload();
        });
</script>

Для этого я использовал Laravel Echo.

Опять же, это не лучший способ сделать это. Это то, что просто сработало для меня для этой конкретной функции.

Там может быть много лучших способов сделать это. Если кто-то знает лучший подход, пожалуйста, дайте мне знать.


Насколько я понимаю, вы хотите реализовать создание и аутентификацию пользователей через REST. А затем получить данные из базы данных. Поправьте меня если я ошибаюсь.

И я предполагаю, что вы уже знаете, как общаться через API с помощью токена. Вы просто застряли в том, как реализовать это с помощью laravel.

Вы можете использовать Laravel Passport для аутентификации. У него очень хорошая документация.

Также воспользуйтесь этой статьей medium. . Это поможет вам пройти пошаговый процесс.

person omar jayed    schedule 01.04.2020
comment
Спасибо за ваш ответ. Как я видел в документации, паспорт действует как сервер. Но у меня уже есть API. Итак, что мне нужно, так это то, что laravel действует как клиент, который, например, получает токен jwt, когда пользователь входит в систему, а затем заполняет сеанс данными пользователя и сохраняет токен для последующего использования, пока пользователь не выйдет из системы. - person pollux; 01.04.2020
comment
Итак, вы просто хотите получить доступ к веб-сессии из API? - person omar jayed; 01.04.2020
comment
Да. Веб-сайт используется для отображения информации пользователям и позволяет им изменять свои данные. Но все это нужно делать через API. - person pollux; 01.04.2020
comment
Дело в том, что охранники авторизации разные. Защита авторизации API - это API, а сессия - это сеть. Я также столкнулся с той же проблемой некоторое время назад и задал вопрос здесь. К сожалению, мне не удалось получить никаких ответов. Что я сделал, так это то, что я сделал еще один вызов из API в Интернет, чтобы перезагрузить страницу с определенным сеансом, чтобы преодолеть это. Если хотите, я могу добавить это в отдельный ответ. - person omar jayed; 01.04.2020
comment
Я также использовал WebSocket для перезагрузки. - person omar jayed; 01.04.2020
comment
Было бы неплохо, если бы вы могли поделиться своим решением. - person pollux; 02.04.2020
comment
Я отредактировал свой ответ выше, указав, как я управлял своей функцией. Надеюсь, это даст вам некоторое представление. - person omar jayed; 02.04.2020