编程

Laravel Bastion - 一个 Stripe 风格的 API 身份验证包

19 2026-01-09 01:04:00

Laravel Bastion 是一个受 Stripe 启发而创建的 API 身份验证包,由 Steve McDougall 创建,具有环境隔离、细粒度范围、内置安全性等功能。

特性

  • Stripe 风格的 API 令牌 - 带有环境指示符前缀的令牌(app_test_pk_、app_live_sk_
  • 环境隔离 - 独立的测试环境和生产环境,并自动验证
  • 细粒度权限控制 - 支持通配符的精细权限控制
  • 令牌类型 - 公钥、私钥和受限密钥,具有不同的访问级别
  • 审计日志 - 全面的活动跟踪,用于合规性和调试
  • Webhook 支持 - 内置 Webhook 端点,支持签名验证
  • 安全至上 - 设置过期日期并采用安全的令牌哈希算法
  • Laravel 原生 - 遵循 Laravel 的约定和最佳实践

安装此软件包后,请确保将 HasBastionTokens trait 添加到您的 User 模型中:

use JustSteveKing\Bastion\Concerns\HasBastionTokens;
 
class User extends Authenticatable
{
    use HasBastionTokens;
 
    // ...
}

然后,要生成令牌,你可以:

use JustSteveKing\Bastion\Enums\TokenEnvironment;
use JustSteveKing\Bastion\Enums\TokenType;
 
$result = $user->createBastionToken(
    name: 'LN API Key',
    scopes: ['posts:read', 'posts:write'],
    environment: TokenEnvironment::Test,
    type: TokenType::Restricted,
);
 
$token = $result['plainTextToken'];
// Example: app_test_rk_a8Kx7mN2pQ4vW9yB1cD3eF5gH6jK8lM
 
echo "Token: " . $token;

要保护路由,Bastion 提供了 AuthenticateToken 中间件:

use JustSteveKing\Bastion\Http\Middleware\AuthenticateToken;
 
Route::middleware(AuthenticateToken::class)->group(function () {
    Route::get('/api/posts', [PostController::class, 'index']);
});

当向已认证的端点发送请求时,应使用 Bearer 模式通过 Authorization 标头传递令牌:

use GuzzleHttp\Client;
 
$client = new Client(['base_uri' => 'https://example.com/api']);
$token = 'YOUR_BEARER_TOKEN';
 
$response = $client->request('GET', '/posts', [
        'headers' => [
                'Authorization' => 'Bearer ' . $token,
                'Accept'        => 'application/json',
        ],
]);

如果你需要轮换令牌,Bastion 也支持此功能。使用 rotate() 方法:

$result = $token->rotate();

甚至提供了一个 CLI 选项:

php artisan bastion:rotate {token-id}

说到命令行界面 (CLI),Bastion 允许你使用各种 Artisan 命令来管理你的令牌:

# Generate tokens
php artisan bastion:generate {user-id} "LN App Token" \
    --environment=test \
    --type=restricted \
    --scopes=posts:read --scopes=posts:write
 
# Revoke tokens
php artisan bastion:revoke {token-id} --reason="Token no longer used"
 
# Prune expired tokens
php artisan bastion:prune-tokens --expired
 
# and more...

Steve 开发了一款功能齐全、非常实用的软件包。想了解更多关于 Bastion 的信息、功能特性以及查看源代码,请访问 GitHub 代码库