Я создаю RESTful API с использованием Lumen и хотел бы добавить базовую аутентификацию HTTP для безопасности.
На routes.php
файл, он устанавливает auth.basic
середина для каждого маршрута:
$app->get('profile', ['middleware' => 'auth.basic', function() {
// logic here
}]);
Теперь, когда я получаю доступ http://example-api.local/profile
Теперь мне предлагают базовую аутентификацию HTTP, что хорошо. Но когда я пытаюсь войти, я получаю это сообщение об ошибке: Fatal error: Class '\App\User' not found in C:\..\vendor\illuminate\auth\EloquentUserProvider.php on line 126
Я не хочу, чтобы проверка пользователей проводилась в базе данных, поскольку у меня будет только одно удостоверение, поэтому, скорее всего, он просто получит имя пользователя и пароль для переменной и подтвердит ее оттуда.
Кстати, я упоминаю это через это учебник по Laracast. Хотя это учебник по Laravel, я реализую его в приложении Lumen.
Я отвечаю на свой собственный вопрос, поскольку я смог заставить его работать, но все же хотел бы узнать больше информации от других относительно моего решения и правильного способа сделать это.
Я смог поработать над этим, создав специальное промежуточное программное обеспечение, которое делает это:
<?php
namespace App\Http\Middleware;
use Closure;
class HttpBasicAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$envs = [
'staging',
'production'
];
if(in_array(app()->environment(), $envs)) {
if($request->getUser() != env('API_USERNAME') || $request->getPassword() != env('API_PASSWORD')) {
$headers = array('WWW-Authenticate' => 'Basic');
return response('Unauthorized', 401, $headers);
}
}
return $next($request);
}
}
Если вы посмотрите на код, он довольно простой и хорошо работает. Хотя мне интересно, есть ли способ «Laravel» сделать это, так как приведенный выше код представляет собой простой код PHP, который выполняет базовую аутентификацию HTTP.
Если вы заметите, проверка имени пользователя и пароля жестко запрограммирована на .env
файл, как я не вижу необходимости доступа к базе данных для проверки.
Проверьте свои bootstrap/app.php
, Убедитесь, что вы зарегистрировали свой auth.basic
промежуточное программное обеспечение, что-то вроде этого:
$app->routeMiddleware([
'auth.basic' => Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
]);
После этого измените ваши маршруты:
$app->get('/profile', ['middleware' => 'auth.basic', function() {
// Logic
}]);
Если вы хотите использовать database
вместо eloquent
аутентификацию, вы можете позвонить:
Auth::setDefaultDriver('database');
Прежде чем пытаться пройти проверку подлинности:
Auth::attempt([
'email' => '[email protected]',
'password' => 'secret',
]);
Если вы хотите аутентифицироваться жестким способом, вы можете определить свой собственный драйвер для AuthManager
учебный класс:
Auth::setDefaultDriver('basic');
Auth::extend('basic', function () {
return new App\Auth\Basic();
});
И тогда ниже основной App\Auth\Basic
учебный класс:
<?php
namespace App\Auth;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Auth\Authenticatable;
class Basic implements UserProvider
{
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
}
/**
* Retrieve a user by their unique identifier and "remember me" token.
*
* @param mixed $identifier
* @param string $token
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByToken($identifier, $token)
{
}
/**
* Update the "remember me" token for the given user in storage.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string $token
* @return void
*/
public function updateRememberToken(Authenticatable $user, $token)
{
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
return new User($credentials);
}
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(Authenticatable $user, array $credentials)
{
$identifier = $user->getAuthIdentifier();
$password = $user->getAuthPassword();
return ($identifier === '[email protected]' && $password = 'password');
}
}
Обратите внимание, что validateCredentials
Метод нуждается в первом аргументе является реализацией Illuminate\Contracts\Auth\Authenticatable
интерфейс, поэтому вам нужно создать свой собственный User
учебный класс:
<?php
namespace App\Auth;
use Illuminate\Support\Fluent;
use Illuminate\Contracts\Auth\Authenticatable;
class User extends Fluent implements Authenticatable
{
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier()
{
return $this->email;
}
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->password;
}
/**
* Get the token value for the "remember me" session.
*
* @return string
*/
public function getRememberToken()
{
}
/**
* Set the token value for the "remember me" session.
*
* @param string $value
* @return void
*/
public function setRememberToken($value)
{
}
/**
* Get the column name for the "remember me" token.
*
* @return string
*/
public function getRememberTokenName()
{
}
}
И вы можете проверить свой собственный драйвер через Auth::attempt
метод:
Auth::setDefaultDriver('basic');
Auth::extend('basic', function () {
return new App\Auth\Basic();
});
dd(Auth::attempt([
'email' => '[email protected]',
'password' => 'password',
])); // return true
Сначала мы расширим AuthenticateWithBasicAuth в нашем промежуточном программном обеспечении.
<?php
namespace App\Http\Middleware;
use \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;
class HttpBasicAuth extends AuthenticateWithBasicAuth
{
}
В config / auth.php создайте настраиваемую защиту, и мы будем использовать custom_http_guard с HttpBasicAuth.
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'custom_http_guard' => [
'driver' => 'token',
'provider' => 'custom_http_provider',
],
],
Мы будем использовать стандартный драйвер токена Laravel.
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'custom_http_provider' => [
'data' => [
'email' => '[email protected]',
'password' => 'secret',
]
],
],
Если вы можете найти способ вернуть данные, как указано выше. Затем вы качаете и получаете код, соответствующий стандартам Laravel.
Надеюсь, у вас есть идея!
Ищем окончательное решение. Если кто-то может завершить 🙂
Вайбхав Арора