Изучение аутентификации пользователя Lumen (2) — Использование плагина jwt-auth

задняя часть база данных API Laravel

Пройдите предыдущую статью "Изучите аутентификацию пользователей Lumen (1)"Tickets.WeChat.QQ.com/Yes/kV u QE2due…Изучив, я примерно понимаю, что аутентификация пользователей Lumen в основном использует метод "api" для аутентификации пользователей по умолчанию:

<?php

namespace App\Providers;

use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * 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();
            }
        });
    }
}

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

При разработке API аутентификация пользователя является основным и обязательным условием безопасности данных.В настоящее время существует два распространенных метода аутентификации пользователей: JWT и OAuth2.

В этой статье будет кратко рассказано о том, как использовать JWT для аутентификации пользователей.

JWT

Веб-токен Json (JWT) — это открытый стандарт на основе JSON (RFC 7519), реализованный для передачи утверждений между средами веб-приложений. Маркер разработан, чтобы быть компактным и безопасным, особенно для сценариев единого входа (SSO) для распределенных сайтов. Заявки JWT обычно используются для передачи аутентифицированной информации об удостоверении пользователя между поставщиками удостоверений и поставщиками услуг для получения ресурсов с серверов ресурсов, а также могут добавлять некоторую дополнительную информацию о заявке, необходимую для другой бизнес-логики.Можно использовать непосредственно для проверки подлинности или зашифровать.

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

Чтобы научиться использовать JWT в Lumen, лучше всего поискать соответствующие плагины в «Comrade Programmer Network — GitHub» и найтиstarsТот, у кого больше всего, используется для исследований.

tymondesigns/jwt-auth

JSON Web Token Authentication for Laravel & Lumen

Установить jwt-аутентификацию

Установить через композер:

composer require tymon/jwt-auth:"^1.0@dev"

Примечание:Версия 0.5.* специально не упаковывает Lumen.

Удалите комментарии, связанные с $app->withFacades() и авторизацией:

<?php

require_once __DIR__.'/../vendor/autoload.php';

try {
    (new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
    //
}

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../')
);

// 取消注释,这样就可以通过 Auth::user(),获取当前授权用户
$app->withFacades();

$app->withEloquent();

/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
*/

// $app->middleware([
//    App\Http\Middleware\ExampleMiddleware::class
// ]);

// 增加 auth 中间件
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);

/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/

$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);

/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
*/

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    require __DIR__.'/../routes/web.php';
});

return $app;

Затем зарегистрируйте LumenServiceProvider в AppServiceProvider:

$this->app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);

В проекте Lumen папки config по умолчанию нет, нужно создать ее в корневой директории проекта, скопировать auth.php из исходников вендора, а аутентификацию API указать как "jwt":

<?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' => env('AUTH_GUARD', 'api'),
    ],

    /*
    |--------------------------------------------------------------------------
    | 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' => [
        'api' => [
            'driver' => 'jwt',
            'provider' => 'users'
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 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,
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | Here you may set the options for resetting passwords including the view
    | that is your password reset e-mail. You may also set the name of the
    | table that maintains all of the reset tokens for your application.
    |
    | 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' => [
        //
    ],

];

Наконец, поскольку для протокола JWT требуется секрет, необходимо сгенерировать секрет:

php artisan jwt:secret

использовать jwt-аутентификацию

1.Обновить модель пользователя

Наследовать Tymon\JWTAuth\Contracts\JWTSubject:

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{
    use Authenticatable, Authorizable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

2.Напишите метод Login, проверьте информацию для входа и верните токен обратно клиенту:

// 路由
$router->post('/auth/login', 'AuthController@postLogin');

Метод postLogin:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Tymon\JWTAuth\JWTAuth;

class AuthController extends Controller
{
    protected $jwt;

    public function __construct(JWTAuth $jwt)
    {
        $this->jwt = $jwt;
    }

    public function postLogin(Request $request)
    {
        if (! $token = $this->jwt->attempt($request->only('email', 'password'))) {
            return response()->json(['user_not_found'], 404);
        }

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

Вы можете запросить его опробовать и запустить с помощью Postman:

Есть жетон. Мы можем использовать его для проверки успешности аутентификации и получения информации о пользователе.

3.Используйте токен для получения информации о пользователе

// 使用 auth:api 中间件
$router->group(['middleware' => 'auth:api'], function($router)
{
    $router->get('/test', 'ExampleController@getUser');
});

Пока проверка пройдена, вы можете использовать метод Auth:user() для получения информации о пользователе.

public function getUser(Request $request) {
        return response()->json(['user' => Auth::user()]);
    }

Проверить базу данных:

В будущем, если информация о маркере будет добавлена ​​в заголовки запроса, аутентификация пользователя может быть полностью реализована.

Чтобы узнать больше о сертификации Lumen, вы можете обратиться к предыдущей статье «Изучение аутентификации пользователя Lumen (1)».Tickets.WeChat.QQ.com/Yes/kV u QE2due…

Вы также можете обратиться к официальному сайту Lumen.
Дверца печи.Потяните Ravel-China.org/docs/5.3/AU…

Суммировать

На следующем этапе мы изучим принцип JWT и напишем плагин аутентификации Lumen на основе JWT самостоятельно.

"Продолжение следует"


coding01 с нетерпением ждет вашего дальнейшего внимания

qrcode
qrcode


Спасибо, что тоже это увидели

qrcode
qrcode