imanrjb/passport-auth

Laravel和Lumen护照包

v1.0.5 2022-06-19 18:49 UTC

This package is auto-updated.

Last update: 2024-09-25 11:52:13 UTC


README

让Laravel Passport与Lumen兼容

一个简单的服务提供者,使Laravel Passport与Lumen兼容

依赖关系

  • PHP >= 8.0
  • Lumen >= 9.0

通过Composer安装

$ composer require imanrjb/passport-auth

或者,如果您愿意,可以手动编辑composer.json

{
    "require": {
        "imanrjb/passport-auth": "^1.0"
    }
}

修改引导流程(bootstrap/app.php文件)

// Enable Facades
$app->withFacades();

// Enable Eloquent
$app->withEloquent();

// Enable auth middleware (shipped with Lumen)
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);

$app->register(App\Providers\AuthServiceProvider::class);
$app->register(\PassportAuth\PassportAuthServiceProvider::class);

注册路由

接下来,您应该在您的应用程序(AuthServiceProvider.php)的boot方法中调用LumenPassport::routes方法。此方法将注册必要的路由以颁发访问令牌和撤销访问令牌、客户端和个人访问令牌。

\PassportAuth\LumenPassport::routes($this->app->router);

您可以将它添加到现有的组中,或者像这样独立地添加此路由注册器:

\PassportAuth\LumenPassport::routes($this->app->router, ['prefix' => 'v1/oauth']);

迁移并安装Laravel Passport

# Publish config files
php artisan vendor:publish --tag=passport-auth

# Create new tables for Passport
php artisan migrate

# Install encryption keys and other necessary stuff for Passport
php artisan passport:install

已安装的路由

在调用routes()方法后,此包将在以下路由上进行挂载(请参阅以下说明)

请注意,由于一些Laravel Passport的路由是Web相关的并且依赖于会话(例如授权页面),因此必须“消失”。Lumen是一个API框架,所以只存在与API相关的路由。

用户模型

确保您的用户模型使用Passport的HasApiTokens特质,例如。

class User extends Model
{
    use HasApiTokens, Authenticatable, Authorizable;

    public function findForPassport($email)
    {
        return $this->where('email', $email)->first();
    }

    public function validateForPassportPasswordGrant($password)
    {
        return Hash::check($password, $this->password);
    }
}

不同密码客户端的不同TTL

Laravel Passport允许设置一个全局的TTL用于访问令牌,但在某些情况下,为不同的客户端设置不同的TTL可能很有用(例如,移动用户比桌面用户获得更多时间)。

只需在您的服务提供者中执行以下操作

// Second parameter is the client Id
\PassportAuth\LumenPassport::tokensExpireIn(Carbon::now()->addMinutes(50), 2); 
\Laravel\Passport\Passport::refreshTokensExpireIn(Carbon::now()->addDays(2));

如果您没有指定客户端ID,它将简单地回退到Laravel Passport实现。

用于清除过期令牌的控制台命令

只需运行php artisan passport:purge即可从数据库中删除过期的刷新令牌及其对应的访问令牌。

颁发令牌

// Generate new token with user credential
    $client = Client::whereProvider('users')->first();

    $request = Request::create('/oauth/token', 'POST', [
        'grant_type' => 'password',
        'client_id' => $client->id,
        'client_secret' => $client->secret,
        'username' => $request->email,
        'password' => $request->password,
        'scope' => '*',
        'user_agent' => Browser::platformName() . ", " . Browser::browserFamily(),
        'ip' => request()->ip()
    ]);

    return app()->handle($request);


// Create route with middleware and return user information
    $router->group(['middleware' => 'auth:api'], function () use ($router) {
        $router->get('/user', function () {
            return \Illuminate\Support\Facades\Auth::user();
        });
    });

刷新令牌

// Generate new token with refresh token
    $client = Client::whereProvider('users')->first();

    $request = Request::create('/oauth/token', 'POST', [
        'grant_type' => 'refresh_token',
        'client_id' => $client->id,
        'client_secret' => $client->secret,
        'refresh_token' => $request->refresh_token,
        'scope' => '',
    ]);

    return app()->handle($request);