接口路由

对外接口与应用资源不同,应用资源为对内的后台 curd 的封装,对外接口则需要定义路由,手动编写路由操作。

Dux Next 系统默认已自带定义后的api 路由,无需以下定义可直接使用,可直接使用 app 名为 api 的定义,以下教程仅限自定义路由使用。

定义路由

在使用路由前需要先设置路由,推荐在应用入口文件中的 init 方法进行路由注册,如下定一个注册名为 test主路由

public function init(Bootstrap $app): void
{
    /**
     * @param string $pattern 路由前缀
     * @param object ...$middleware 中间件
     */
    $app->getRoute()->set("test", new DuxRoute("/test"));
}

路由鉴权

定义的接口路由要对请求数据进行签名,需要通过后台的接口授权进行添加并使用如下中间件:

use Dux\Api\ApiMiddleware;
use App\System\Models\SystemApi;

public function init(Bootstrap $app): void
{
    /**
     * @param string $pattern 路由前缀
     * @param object ...$middleware 中间件
     */
    $app->getRoute()->set("test",
        new DuxRoute("/test",
            new ApiMiddleware(function ($id) {
                $apiInfo = SystemApi::query()->where('secret_id', $id)->firstOr(function () {
                    throw new ExceptionBusiness('Signature authorization failed', 402);
                });
                return $apiInfo->secret_key;
            })
        ),
    );
}

授权路由

定义的接口路由有时需要接入登录等功能可以利用该路由中间件和 jwt token 生成方法进行授权处理。

生成 Token

利用以下方法来生成名为 member 的 jwt token,并且设置过期时间为 2592000秒 来三方或前端使用。


\Dux\Auth\Auth::token("member", [
    'id' => 1,
    ...
], 2592000)

授权中间件

此利用权限中间件来进行 JWT Token 授权检测,并设置续期时间为 1728000秒,当达到续期时间后会在接口的 headers 头中返回 Authorization 来供前端或者三方刷新授权。

use Dux\Api\ApiMiddleware;
use App\System\Models\SystemApi;
use Dux\Auth\AuthMiddleware;

public function init(Bootstrap $app): void
{
    /**
     * @param string $pattern 路由前缀
     * @param object ...$middleware 中间件
     */
    $app->getRoute()->set("test",
        new DuxRoute("/test",
            new ApiMiddleware(function ($id) {
                $apiInfo = SystemApi::query()->where('secret_id', $id)->firstOr(function () {
                    throw new ExceptionBusiness('Signature authorization failed', 402);
                });
                return $apiInfo->secret_key;
            }),
            new AuthMiddleware("member", 1728000)
        ),
    );
}