reksakarya/laravel-signature

此包的最新版本(v2.0.0)没有可用的许可证信息。

通过签名进行安全保护

v2.0.0 2023-02-16 02:22 UTC

This package is auto-updated.

Last update: 2024-09-16 05:57:36 UTC


README

介绍

Laravel Signature 通过签名来识别访问您端点的用户,从而帮助您保护数据。

需求

目前,Laravel Signature 仅支持

  • Laravel ^7.x。
  • PHP ^7.3.0

安装

  1. 运行 composer require reksakarya/laravel-signature

  2. composer.json 中添加自动加载

...
  "autoload": {
    "psr-4": {
      ...
      "LaravelSignature\\": "vandor/reksakarya/laravel-signature/src",
      ...
    }
  }
...
  1. 运行命令 composer dump-autoload

  2. 在 `config/app.php` 中添加提供者

  "providers" => [
    ...
    /*
    * Package Service Providers...
    */
    LaravelSignature\SignatureServiceProvider::class,
    ...
  ]
  1. 要将签名配置发布到应用程序,运行
$ php artisan vendor:publish --tag=laravel-signature
  1. 接下来,我们需要在您的 .env 中设置环境变量
SIGNATURE_EPNBP_ID=
SIGNATURE_EPNBP_KEY=
SIGNATURE_EPNBP_SECRET=
SIGNATURE_KERJASAMABU_ID=
SIGNATURE_KERJASAMABU_KEY=
SIGNATURE_KERJASAMABU_SECRET=
SIGNATURE_JASAPERBANKAN_ID=
SIGNATURE_JASAPERBANKAN_KEY=
SIGNATURE_JASAPERBANKAN_SECRET=
SIGNATURE_PENDAPTANLAINLAIN_ID=
SIGNATURE_PENDAPTANLAINLAIN_KEY=
SIGNATURE_PENDAPTANLAINLAIN_SIGNATURE=
  1. 别忘了运行 php artisan config:cache 保存您的配置更改到缓存

然后,安装过程就完成了

如何使用

默认情况下,Reksa Karya Laravel Signature 为现有的应用程序创建签名,包括 E-PNBP Telekomunikasi, E-PNBP POS, Kerjasama Badan Usaha, Management Kas, and Pendapatan Lain Lain

要创建签名,在您的类中调用 Signature 并可以调用静态方法 Signature::make(string $url, array $credential),或者您可以在您的应用程序中指定

注意!$credential 变量应该是数组,其值如下

$credentiial = [
    id: $your-signature-id
    key: $your-signature-key
    secret: $your-signature-secret
];
<?php
...
use LaravelSignature\Helpers\Signature;
...

class YourPortalController {
  ...
  
  public function getRealisasiPendapatan($year)
  {
      ...
      $url = 'https://ditdal.kominfo.go.id/api/portal-pendapatan/realisasi?tahun='.$year
      $signatureEpnbp = Signature::epnbp($url);
      ...
      
      ...
      $url = 'https://epnbp.baktikominfo.id/api/portal-pendapatan/realisasi?tahun='.$year
      $signatureKerjasamaBU = Signature::kerjasamabu($url);
      ...
      
      ...
      $url = 'https://epnbp.baktikominfo.id/bank/api/portal-pendapatan/realisasi?tahun='.$year
      $signatureJasaPerbankan = Signature::jasaperbankan($url);
      ...

      ...
      $url = 'https://epnbp.baktikominfo.id/pendapatanlainlain/api/portal-pendapatan/realisasi?tahun='.$year
      $signatureJasaPerbankan = Signature::pendapatanlainlain($url);
      ...
  } 
  ...
}

如果您想验证签名,可以调用方法 Signature::validate($request, $app);,其中参数 $app 是字符串 'epnbp''kerjasamabu''jasaperbankan''pendapatanlainlain'。以下是一个示例

<?php
...
use Illuminate\Http\Request;
use LaravelSignature\Helpers\Signature;
...

class PortalApiController extends Controller {
  ...
  
  public function getRealisasiPendapatan(Request $request, $year)
  {
      ...
      $isValid = Signature::validate($request, 'epnbp');
      ...
      
      ...
      $isValid = Signature::validate($request, 'kerjasamabu');
      ...
      
      ...
      $isValid = Signature::validate($request, 'jasaperbankan');
      ...

      ...
      $isValid = Signature::validate($request, 'pendapatanlainlain');
      ...
  } 
  ...
}

在 Postman 中的实现

如果您想通过 Postman 测试签名,首先设置 Postman 的 Pre-request Script 以测试带有签名的 API。

首先添加以下变量到环境

接下来,将此脚本添加到每个请求的 Pre-request Script 以在发送请求之前生成签名

function getPath(url) {
    var pathRegex = /.+?\:\/\/.+?(\/.+?)(?:#|\?|$)/;
    var result = url.match(pathRegex);
    return result && result.length > 1 ? result[1] : ''; 
}
 
 
function getAuthHeader(httpMethod, requestUrl) {
    var requestPath = getPath(requestUrl);
    
    payload = pm.environment.get('SIGNATURE_EPNBP_ID') + ':' + requestPath + ':' + pm.environment.get('SIGNATURE_EPNBP_KEY');
    postman.setEnvironmentVariable('signature_payload', payload);
    
              
    var hmacSignature = CryptoJS.HmacSHA256(payload, pm.environment.get('SIGNATURE_EPNBP_SECRET'));
    return hmacSignature;
}

postman.setEnvironmentVariable('signature', getAuthHeader(request['method'], request['url']));

别忘了在您的 header request 中添加 signature 键,如下所示