hafael/laravel-mesh-auth

Laravel应用之间的API认证方法

v0.0.5 2024-02-17 02:26 UTC

This package is auto-updated.

Last update: 2024-09-17 06:01:05 UTC


README

Latest Stable Version Latest Unstable Version Total Downloads License

此包允许在以下情况下进行通信:微服务"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或更高版本

📦 安装

  1. 在服务器端安装包: composer require "hafael/laravel-mesh-auth"

  2. 在服务器端,配置共享密钥到相应的.env文件中

APP_SHARED_KEY= APP_SHARED_SECRET=

  1. 发布配置文件

php artisan vendor:publish --tag=auth-mesh-config

  1. 迁移数据库

php artisan migrate --tag=auth-mesh-database

  1. 在用户类中包含特质
  ...
  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',
      ....
  1. 在app/Http/Kernel.php中注册认证中间件
  ...
  
  protected $routeMiddleware = [
      ...
      'auth.mesh' => \Hafael\Mesh\Auth\Middlewares\MeshTokenMiddleware::class,
  ];
  1. 在客户端或所有希望的应用中重复上述步骤。

以下是如何在服务器上生成令牌的示例

🌟 入门指南

在客户端,构建以下请求

  <?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;

  ?>

同样的过程也可以在服务器-》客户端方向生成。

📜 许可证

MIT许可证。版权所有(c) 2023 - Hafael 更多信息,请参阅LICENSE文件。