m-thalmann / laravel-token-auth
为Laravel REST API提供基于令牌的认证系统
v2.0.0
2024-08-24 11:01 UTC
Requires
- php: ^8.1
- illuminate/contracts: ^10.0|^11.0
- illuminate/database: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^8.8.3|^9.0
- phpunit/phpunit: ^10.5
README
目录
详见详细文档: /docs
介绍
Laravel Token Auth提供了使用访问令牌和刷新令牌对Laravel API进行认证的功能。
它深受Laravel Sanctum的启发。
刷新令牌
刷新令牌用于创建新的访问令牌。这样,访问令牌可以只有很短的过期时间,而不需要用户再次登录。
为了保持这些刷新令牌的安全,我们可以实现刷新令牌轮换。当使用刷新令牌请求新的访问令牌时,将返回新的访问令牌和新的刷新令牌。然后,所使用的刷新令牌将被撤销,但保留在数据库中。这样,可以检测到刷新令牌是否被重复使用。
更多详情请见: https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
安装
composer require m-thalmann/laravel-token-auth
如果您想自定义迁移和配置,请运行发布命令
php artisan vendor:publish --provider="TokenAuth\TokenAuthServiceProvider"
如果您只想自定义部分内容,可以运行以下命令
-
迁移:
php artisan vendor:publish --tag="token-auth-migrations"
-
配置:
php artisan vendor:publish --tag="token-auth-config"
接下来,您应该运行迁移
php artisan migrate
快速开始
将HasAuthTokens
特性添加到Eloquent用户模型中
use TokenAuth\Concerns\HasAuthTokens; class User extends Authenticatable { use HasAuthTokens; // ... }
添加以下认证路由
注意:当然,您应该为这些创建自己的控制器。这里只是为了简化。
use TokenAuth\Enums\TokenType; use TokenAuth\Facades\TokenAuth; use TokenAuth\Models\AuthToken; Route::post('/login', function (Request $request) { $credentials = $request->validate([ 'email' => 'required', 'password' => 'required', ]); if (!Auth::once($credentials)) { throw new HttpException(401); } $tokenPair = TokenAuth::createTokenPair(auth()->user())->buildPair(); return [ 'refresh_token' => $tokenPair->refreshToken->plainTextToken, 'access_token' => $tokenPair->accessToken->plainTextToken, ]; }); Route::post('/logout', function () { AuthToken::deleteTokensFromGroup(TokenAuth::currentToken()->getGroupId()); })->middleware('auth:token-access'); Route::post('/refresh', function () { // ... $tokenPair = TokenAuth::rotateTokenPair( TokenAuth::currentToken() )->buildPair(); return [ 'refresh_token' => $tokenPair->refreshToken->plainTextToken, 'access_token' => $tokenPair->accessToken->plainTextToken, ]; })->middleware('auth:token-refresh'); Route::post('/tokens', function () { // ... /** * @var \TokenAuth\Concerns\HasAuthTokens */ $user = auth()->user(); $accessToken = $user->createToken(TokenType::ACCESS)->build(); return [ 'access_token' => $accessToken->plainTextToken, ]; })->middleware('auth:token-refresh');
保护路由
Route::get('/private', function () { // only allows access tokens ... })->middleware('auth:token-access'); Route::get('/private-refresh-token', function () { // only allows refresh tokens ... })->middleware('auth:token-refresh');
撤销令牌
Route::get('/revoke/{token}', function (AuthToken $token) { $token->revoke()->store(); })->middleware('auth:token-refresh');
修剪撤销/过期令牌
// app/Console/Kernel.php protected function schedule(Schedule $schedule) { // ... $schedule->command('model:prune')->daily(); }