PHPackages                             miaoxn/webman-api-sign - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. miaoxn/webman-api-sign

ActiveLibrary[API Development](/categories/api)

miaoxn/webman-api-sign
======================

适用于webman的api签名

01PHP

Since Jan 21Pushed 1y agoCompare

[ Source](https://github.com/miaoxn/webman-api-sign2)[ Packagist](https://packagist.org/packages/miaoxn/webman-api-sign)[ RSS](/packages/miaoxn-webman-api-sign/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

webman-api-sign
===============

[](#webman-api-sign)

适用于webman项目的api签名，本插件基于  修改，不需要防止重放请求和RSA加密的直接使用原作者的插件即可。

更新日志
====

[](#更新日志)

2024-03-18 修复无法安装问题

安装
==

[](#安装)

composer require gitfei1231/webman-api-sign

配置
==

[](#配置)

```
return [
    'enable' => true,

    /**
     * 配置 driver
     * 数组配置驱动   \Wengg\WebmanApiSign\Driver\ArrayDriver::class
     * 数据库配置驱动 \Wengg\WebmanApiSign\Driver\DatabaseDriver::class (使用的是 ThinkORM)
     * 如需要自定义驱动，继承 \Wengg\WebmanApiSign\Driver\BaseDriver::class
    */
    'driver' => \Wengg\WebmanApiSign\Driver\ArrayDriver::class,
    'encrypt' => 'sha256', //加密sign方式,
    'timeout' => 3600,  //接口sign超时范围，客户端请求的timestamp和服务器时间对比出超时时间秒，0不限制
    'table' => 'app_sign', //表名

    /**
     * 防重放请求是否开启 true只能在一定时间内请求一次
     * replay 主要借助 ip + noncestr 随机值进行验证, 一定的时间内noncestr如果重复，那就判定重放请求
     * noncestr 建议生成随机唯一UUID 或者你使用 13位时间戳+18位随机数。1678159075243(13位)+随机数(18位)
     */
    'replay' => false,
    'replay_timeout' => 604800,  //接口重放超时时间秒，客户端在本时间范围内相同的ip + noncestr不可重复请求，过时后清空，0永久缓存永远不能二次重放请求

    /**
     * 如果使用 DatabaseDriver 需要缓存查询后的数据
     * 设置缓存时间即可缓存对应的app_id数据
     * db_cache_time => null 关闭缓存
     */
    'db_cache_time' => 604800, // null 关闭缓存

    //字段对照，可从(header,get,post)获取的值
    'fields' => [
        'app_id'     => 'appId',     //app_id
        'app_key'    => 'appKey',    //app_key rsa加密才需要传，appKey为前端随机生成的app_secret秘钥，用于加密sign和报文数据
        'timestamp'  => 'timestamp', //时间戳
        'noncestr'   => 'nonceStr',  //随机字符串
        'signature'  => 'signature', //签名字符串
    ],

    //driver为ArrayDriver时生效，对应table
    'app_sign' => [
        [
            'app_id' => '1161408635', //应用id
            'app_name' => '默认', //应用名称
            'status' => 1,        //状态：0=禁用，1=启用
            'expired_at' => null, //过期时间，例如：2023-01-01 00:00:00，null不限制
            'app_secret' => 'D24668E7B3F24F4DAB32E5B88EAE25AC', //应用秘钥 不启用RSA使用
            'encrypt_body' => 0, //状态：0=禁用，1=启用 算法：aes-128-cbc 是否加密body传入加密后的报文字符串，启用RSA需要使用自动生成的app_secret进行对称加密，否则使用固定的app_secret进行对称加密
            'rsa_status' => 0, //状态：0=禁用，1=启用 启用RSA，主要用rsa加密随机生成的app_secret，而不使用固定app_secret
            /**
             * sign私钥 RS256加密
             */
            'private_key' =>  setParams(['notSign' => true]);

// 此路由经过sign验证
Route::get('/login', [app\api\controller\LoginController::class, 'login'])->setParams(['notSign' => false]);

// 此路由经过sign验证
Route::get('/login', [app\api\controller\LoginController::class, 'login']);
```

```
// 控制器中配置排除sign校验
class TestController
{
    /**
     * 无需sign校验
     * index、save不需要校验 ['index','save']
     * 所有方法都不需要sign校验 ['*']
     * @var string[]
     */
    protected $noNeedSign = ['login'];

    /**
     * 登录
     */
    public function login()
    {

    }
}
```

开启非对称加密 rsa\_status
===================

[](#开启非对称加密-rsa_status)

注意：开启后客户端需自行随机动态生成app\_secret（不开启则使用服务端固定的app\_secret），用公钥进行加密app\_secret，服务器端会进行解密出app\_secret, 生成sign进行比对。

> 非对称加密算法为 RSAES-PKCS1-V1\_5

1. app\_secret 客户端自行生成
2. sign使用自动生成的app\_secret按照下面签名算法客户端计算出来
3. 使用公钥加密app\_secret，通过header中的appKey字段进行传输（未开启rsa，此字段不用传）

### php端非对称加密和解密代码例子

[](#php端非对称加密和解密代码例子)

```
