Защита авторизации Laravel 5 с RESTful API

У меня есть решение, которое использует Laravel 5. Он не полностью разработан на laravel.

Уровень API находится в другом проекте, и только веб-уровень использует laravel.

До сих пор я сохранял данные аутентификации в сеансе и использовал базовый способ обработки аутентифицированных пользователей.

Теперь я пытаюсь обновить структуру веб-приложения до модуля laravel frontend & backend. Трудность, с которой я сталкиваюсь, заключается в использовании концепции providers и guards, поскольку она не взаимодействует с базой данных напрямую.

Пока что я сделал контроллер, я проверяю роль пользователя и аутентифицируюсь с использованием $_Session.

Было бы очень полезно, если бы кто-нибудь мог просветить меня об использовании RESTful API с защитой Laravel Auth.

Регистрационный контроллер

    <?php

namespace App\Http\Controllers;

require_once dirname(__DIR__, 3) . '/web_api/DependencyManager.php';

use DBHandlers;
use Facebook;
use Google;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use SessionManager;
use Session;

class RegisterController extends Controller
{
    public function mRegister($ref = null)
    {
        $session = new SessionManager();
        $db = new DBHandlers();


        isset($ref) && $ref == 'google' ? $registered_via_google = true : $registered_via_fb = true;

        if (isset($_SERVER['QUERY_STRING'])) {
            if (isset($ref)) {
                if (strcmp($ref, "facebook") == 0) {
                    $registered_via_fb = true;
                } else {
                    $registered_via_google = true;
                }
            }
        }


        if (isset($registered_via_fb) && $registered_via_fb) {
            //  echo 'Facebook';
            try {
                $fb = new Facebook();
                $fb->mProcess();
                //   echo $_GET['code'];
                //     print_r($fb->getAcessToken());
                $fb_access_token = (string)$fb->getAcessToken();
                //  echo $fb_access_token;
                if (isset($fb_access_token) && $fb_access_token != '' && !empty($fb_access_token)) {
                    $result = $db->mFBLogin($fb_access_token);
                    $session->LogUserIn($result);

                } else {
                    $registration_error = true;
                }
            } catch (Exception $e) {
                $registration_error = true;
            }

        } 

    }

    public function mLogout()
    {
        Session::flush();
        redirect()->route('index')->send();
        die();
    }

person silverFoxA    schedule 21.01.2018    source источник


Ответы (1)


Для начала неплохо было бы прочитать документацию Passport.

https://laravel.com/docs/5.5/passport

Это может быть не то, что вы используете, но это даст вам хорошее представление о том, как Laravel обрабатывает аутентификацию и авторизацию через API.

Защита аутентификации по умолчанию в Laravel использует session, но часто API-интерфейсы Restful не имеют состояния, поэтому вам нужно управлять токеном аутентификации. Это делается с помощью промежуточного программного обеспечения auth:api.

Passport — отличный пакет для этого, будучи полноценным сервером OAuth2, тогда для JWT я бы рекомендовал:

https://github.com/tymondesigns/jwt-auth

Обновлять:

У вас есть таблица users в приложении Laravel, с которой вы можете связать логин API? Если да, то в вашей ситуации можно использовать web гарду и session драйвер. После того, как вы прошли аутентификацию и получили ответ, запросите пользователя, а затем вручную войдите в Laravel:

// use the same email address here they used to login to the api.
$user = User::where('email', '[email protected]')->first();
auth()->login($user);

С этого момента вы будете использовать группу промежуточного программного обеспечения web для управления запросами на авторизацию.

Если вам действительно нужно индивидуальное решение, в документации Laravel есть хороший пример того, как реализовать собственное:

https://laravel.com/docs/5.5/authentication#adding-custom-guards

person Community    schedule 21.01.2018
comment
Обратите внимание, что я не ищу пакет API и даже не рассматриваю возможность переноса уровня API. - person silverFoxA; 21.01.2018
comment
Отмечено, просто хороший материал для чтения о различных подходах к аутентификации API. Можете ли вы опубликовать код контроллера, где вы аутентифицируете пользователя с помощью $_SESSION? - person ; 21.01.2018
comment
Пожалуйста, позвольте мне кратко рассказать о моей проблеме, я ищу решение для создания защиты авторизации из ответа API, я не собираюсь использовать токены для аутентификации API. Пожалуйста, найдите обновленный запрос с подключенным контроллером - person silverFoxA; 21.01.2018
comment
Извините, но я не использую логику базы данных. Что касается пользовательской защиты, не будет ли проще, если я смогу просто инициализировать или назначить роль или пользователя авторизации после завершения регистрации? - person silverFoxA; 21.01.2018