m-thalmann/laravel-token-auth

为Laravel REST API提供基于令牌的认证系统

v2.0.0 2024-08-24 11:01 UTC

This package is auto-updated.

Last update: 2024-09-24 11:14:28 UTC


README

Build Status codecov Total Downloads Latest Stable Version License

目录

详见详细文档: /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();
}