hafael / laravel-mesh-auth
Laravel应用之间的API认证方法
v0.0.5
2024-02-17 02:26 UTC
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0
Requires (Dev)
- phpunit/phpunit: >=5.5
README
此包允许在以下情况下进行通信:微服务"A"(客户端)通过基于令牌sanctum的双因素认证方法在微服务"B"(服务器端)生成API密钥。
由一对密钥保护的服务器端受保护路由能够生成代表已注册用户的sanctum令牌,并通过http响应格式返回json。客户端(A)必须存储密钥,以便在服务器(B)的中间件受保护的路径中使用。
如果在该包的两个(或更多)端点安装,允许应用程序之间的双向通信。
Mesh网络也称为东西向流量网络,简而言之,它可以被定义为一个用于服务通信的网络抽象层。
示例结构
- 客户端(A)
- 订单(B)
- 报告(C)
案例:管理员需要一份包含每个客户完成订单总数的销售报告。每个应用都由不同的Laravel安装和在不同服务器上隔离的数据库组成。
工作原理:特定用户访问"C"应用,该应用需要查询服务"A"中的客户数据库,而"A"应用在同一查询中聚合服务"B"中的订单数量。
必须在所有安装之间共享一对密钥:APP_SHARED_KEY和APP_SHARED_SECRET。
💡 要求
PHP 7.3或更高版本 Laravel 8或更高版本
📦 安装
-
在服务器端安装包:
composer require "hafael/laravel-mesh-auth"
-
在服务器端,配置共享密钥到相应的.env文件中
APP_SHARED_KEY= APP_SHARED_SECRET=
- 发布配置文件
php artisan vendor:publish --tag=auth-mesh-config
- 迁移数据库
php artisan migrate --tag=auth-mesh-database
- 在用户类中包含特质
... class User extends Authenticatable //implements MustVerifyEmail { use ... HasApiTokens,//required WithMeshAuth; //<---- package trait /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'lastname', 'email', ....
- 在app/Http/Kernel.php中注册认证中间件
... protected $routeMiddleware = [ ... 'auth.mesh' => \Hafael\Mesh\Auth\Middlewares\MeshTokenMiddleware::class, ];
- 在客户端或所有希望的应用中重复上述步骤。
以下是如何在服务器上生成令牌的示例
🌟 入门指南
在客户端,构建以下请求
<?php $user = Auth::user(); $sharedSecret = env('APP_SHARED_SECRET'); //Dessa forma é possível identificar o usuário solicitante no lado servidor. $apiSecret = base64_encode( $user->id . '|' . $sharedSecret); //Solicite um token sanctum $response = Http::withHeaders([ 'X-API-KEY' => env('APP_SHARED_KEY'), 'X-API-SECRET' => $apiSecret, ])->acceptJson() ->post('http://server-side-app.com/api/auth/token', [ 'name' => 'ClientAppName', 'abilities' => ['*'], ]); $tokenName = $response['name']; $accessToken = $response['access_token']; $tokenAbilities = $response['abilities']; //Armazene o token relacionado ao usuário autenticado: $user->savePlainTextToken($accessToken, $tokenName, $tokenAbilities); //Crie uma nova requisição incluindo o token de acesso recém gerado. $authResponse = Http::withHeaders([ 'Authorization' => 'Bearer '. $accessToken, ])->acceptJson() ->get('http://server-side-app.com/api/user'); var_dump($authResponse); die; ?>
同样的过程也可以在服务器-》客户端方向生成。