Базовая аутентификация Lumen HTTP без использования базы данных

Я создаю 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.

6

Решение

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

Я смог поработать над этим, создав специальное промежуточное программное обеспечение, которое делает это:

<?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 файл, как я не вижу необходимости доступа к базе данных для проверки.

11

Другие решения

Проверьте свои 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',
]);

Редактировать № 2

Если вы хотите аутентифицироваться жестким способом, вы можете определить свой собственный драйвер для 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
2

Сначала мы расширим 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.

Надеюсь, у вас есть идея!
Ищем окончательное решение. Если кто-то может завершить 🙂

Вайбхав Арора

1
По вопросам рекламы [email protected]