Как использовать другую охрану при входе из сети или API в Laravel? - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю приложение Laravel (5.7) для мобильного приложения.Итак, у меня есть API и веб-панель, оба должны войти в систему, и у каждого есть модель.Для входа в Интернет я использую модель User (поскольку это рабочие роли) и другую модель Client для пользователей, зарегистрированных через приложение.

Я использую JWT для создания токенов авторизации для мобильных устройств.приложение и использование обычного входа в систему для веб-панели.

Сложность заключается в том, что по умолчанию auth.php guard равен web, и если я использую (следующий) метод проверки подлинности из API, он идет посмотретьк таблице пользователей, вместо таблицы клиентов, и она исправлена, когда я изменяю защиту по умолчанию на api , но веб-логин пытается найти в таблице clients 1012 *.

Короче говоря, я попытался переключить охрану по умолчанию разными способами, но он просто не будет работать.Вот некоторые из тестов (которые не прошли):

  • Изменение переменной $ guard в контроллере входа в Интернет и установка api по умолчанию в auth.php
  • Перезапись значений по умолчаниюauth.php для защиты во время выполнения, используя Config::set('auth.defaults.guard' , 'api'); или config('auth.defaults.guard' , 'api'); (и все его варианты) в методе аутентификации моего API

Это мой файл auth.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    | This option controls the default authentication "guard" and password
    | reset options for your application. You may change these defaults
    | as required, but they're a perfect start for most applications.
    |
    */

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | Next, you may define every authentication guard for your application.
    | Of course, a great default configuration has been defined for you
    | here which uses session storage and the Eloquent user provider.
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | Supported: "session", "token"
    |
    */

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'session',
            'provider' => 'clients'
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

         'clients' => [
             'driver' => 'eloquent',
             'model' => App\Client::class,
         ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | You may specify multiple password reset configurations if you have more
    | than one user table or model in the application and you want to have
    | separate password reset settings based on the specific user types.
    |
    | The expire time is the number of minutes that the reset token should be
    | considered valid. This security feature keeps tokens short-lived so
    | they have less time to be guessed. You may change this as needed.
    |
    */

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

Мой метод аутентификации в моем ApiClientController.php

 public function authenticate(Request $request)
    {
//        config('auth.defaults.guard' , 'api'); // NOT WORKING!!
//        Config::set('auth.guards.web.provider', 'clients'); // NOT WORKING!!
//        Config::set('auth.providers.users.model', Client::class); // NOT WORKING!!
//        config('auth.providers.users.model', Client::class); // NOT WORKING!!

        $credentials = $request->only('phone', 'password');

        try {
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 400);
            }
        } catch (JWTException $e) {
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        Log::info("JWT Token: $token");

        return response()->json(compact('token'));
    }

Кроме того, вот моя модель клиента

<?php

namespace App;


use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Client extends Authenticatable implements JWTSubject
{

    protected $hidden = [
        'password', 'phone_verification_code', 'phone_verified_at'
    ];

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }
    public function getJWTCustomClaims()
    {
        return [];
    }

}

1 Ответ

0 голосов
/ 20 ноября 2018

В экземпляре $request есть метод user, который принимает один аргумент:

$request->user('apiguard');

Если вы пытаетесь выполнить аутентификацию:

Auth::guard('apiguard')->attempt($credentials);
...