imanrjb / passport-auth
Laravel和Lumen护照包
v1.0.5
2022-06-19 18:49 UTC
Requires
- hisorange/browser-detect: ^4.4
- imanrjb/lumen-vendor-publish: ^1.0
- laravel/passport: ^10.3
- nyholm/psr7: ^1.5
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);