Прошло много времени с тех пор, как я писал PHP-код, особенно Lumen, я большой пользователь Lumen, и я использовал Lumen в качестве основного фреймворка для своего API с момента его создания.
Но когда дело доходит до API, есть концепция, которую я должен сказать: «Разделение фронтенда и бекенда».Сейчас все больше и больше команд принимают разделение фронтенда и бекенда, что полностью высвобождает преимущества фронтенда. и позволяет серверной части больше сосредоточиться на выводе данных. Обсуждение этого аспекта здесь не обсуждается, и вы можете обратиться к некоторым статьям для дальнейшего изучения:
Из-за разделения фронтенда и бекенда бэкенд сосредоточился на выводе интерфейсного API.В то время Lumen родился для RESTful API:
Decidedly Laravel. Delightfully Minimal.
Lightning fast micro-services and APIs delivered with the elegance you expect.
Использование Lumen в качестве фреймворка интерфейса должно решить основную проблему: как «аутентифицировать» посетителей.
Аутентификация пользователя
Хотя Lumen использует ту же реализацию базовой библиотеки классов, что и Laravel, поскольку Lumen нацелен на разработку API без сохранения состояния и не поддерживает сеансы, конфигурация по умолчанию отличается. Lumen должен быть реализован с использованием механизма без сохранения состояния, такого как токен API.
Давайте посмотрим на примеры, представленные на официальном сайте Lumen:
use Illuminate\Http\Request;
$app->get('/post/{id}', ['middleware' => 'auth', function (Request $request, $id) {
$user = Auth::user();
$user = $request->user();
//
}]);
Который использует промежуточное ПО:'middleware' => 'auth'
, давайте посмотрим на промежуточную функцию аутентификации:
$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
]);
В связи с классом Authenticate давайте посмотрим на функцию дескриптора Authenticate:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($this->auth->guard($guard)->guest()) {
return response('Unauthorized.', 401);
}
return $next($request);
}
первый судья$this->auth->guard($guard)->guest()
. Мы продолжаем следить за кодом, чтобыAuthManager
середина:
/**
* Attempt to get the guard from the local cache.
*
* @param string $name
* @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard
*/
public function guard($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return isset($this->guards[$name])
? $this->guards[$name]
: $this->guards[$name] = $this->resolve($name);
}
входящий по умолчанию$name = null
, так что смотрим$this->getDefaultDriver()
:
/**
* Get the default authentication driver name.
*
* @return string
*/
public function getDefaultDriver()
{
return $this->app['config']['auth.defaults.guard'];
}
Это приводит нас к конфигурации конфигурации по умолчанию:
Из исходного кода Lumen мы видим, что метод аутентификации Lumen по умолчанию — «api».
Давайте посмотрим на метод аутентификации Laravel по умолчанию:
Laravel по умолчанию использует «веб-метод», а веб-метод использует сеанс для аутентификации пользователя. Это также хорошая иллюстрация безгражданства Lumen.
Далее нам нужно понять, как Lumen аутентифицирует пользователей через «API».
AuthServiceProvider находится в папке app/Providers, и в этом файле есть только один вызов Auth::viaRequest. viaRequest будет вызываться, когда системе потребуется аутентификация. Этот метод принимает в качестве параметра анонимную функцию. В этой анонимной функции вы можете произвольно анализировать приложение\пользователя и возвращать его или возвращать значение null, когда синтаксический анализ завершается неудачно, например:
/**
* Boot the authentication services for the application.
*
* @return void
*/
public function boot()
{
// Here you may define how you wish users to be authenticated for your Lumen
// application. The callback which receives the incoming request instance
// should return either a User instance or null. You're free to obtain
// the User instance via an API token or any other method necessary.
$this->app['auth']->viaRequest('api', function ($request) {
if ($request->input('api_token')) {
return User::where('api_token', $request->input('api_token'))->first();
}
});
}
Давайте посмотримviaRequest
функция:
/**
* Register a new callback based request guard.
*
* @param string $driver
* @param callable $callback
* @return $this
*/
public function viaRequest($driver, callable $callback)
{
return $this->extend($driver, function () use ($callback) {
$guard = new RequestGuard($callback, $this->app['request'], $this->createUserProvider());
$this->app->refresh('request', $guard, 'setRequest');
return $guard;
});
}
Ключ здесьRequestGuard
, основная функция этого класса:
/**
* Get the currently authenticated user.
*
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function user()
{
// If we've already retrieved the user for the current request we can just
// return it back immediately. We do not want to fetch the user data on
// every call to this method because that would be tremendously slow.
if (! is_null($this->user)) {
return $this->user;
}
return $this->user = call_user_func(
$this->callback, $this->request, $this->getProvider()
);
}
Это делается для того, чтобы определить, следует ли получать информацию о пользователе, в основном путем вызоваcallback
функция, и эта функция есть то, что мы получаем изviaRequest
Входящие:
function ($request) {
if ($request->input('api_token')) {
return User::where('api_token', $request->input('api_token'))->first();
}
}
И это всего лишь пример аутентификации пользователя, судя по входящему запросуapi_token
параметры и получить User или null с помощью прямого поиска совпадения User Model.
Конечно, в реальной разработке мы не можем просто получитьapi_token
Непосредственно свяжите базу данных, чтобы найти информацию о пользователе.
При разработке API аутентификация пользователя является основным и обязательным условием безопасности данных.В настоящее время существует два распространенных метода аутентификации пользователей: JWT и OAuth2.
Следующий шаг
В настоящее время у меня есть только краткое представление о «аутентификации пользователя» Lumen.Следующий шаг — узнать о «JWT», чтобы увидеть, как использовать JWT для эффективной аутентификации пользователя и более безопасно обеспечить доступ к информации интерфейса эффективные пользователи.
Прикрепил:
Веб-токен Json (JWT) — это открытый стандарт на основе JSON (RFC 7519), реализованный для передачи утверждений между средами веб-приложений. Маркер разработан, чтобы быть компактным и безопасным, особенно для сценариев единого входа (SSO) для распределенных сайтов. Заявки JWT обычно используются для передачи аутентифицированной информации об удостоверении пользователя между поставщиками удостоверений и поставщиками услуг для получения ресурсов с серверов ресурсов, а также могут добавлять некоторую дополнительную информацию о заявке, необходимую для другой бизнес-логики.Можно использовать непосредственно для проверки подлинности или зашифровать.
"Продолжение следует"
coding01 с нетерпением ждет вашего дальнейшего внимания