我有一个 API,我需要在输入验证后对调用者进行身份验证。
这是因为对于某些端点,授权取决于输入参数中提供的信息(例如,调用者想要查询或更改哪个服务器端资源,以及调用者是否对该特定资源具有权限)。
我写了一些中间件,它插入到过程调用链中的
.input()
调用之后。
(参见下面示例路由器中的.use(auth([authMethod1, authMethod2])
)。)
注意,我的
auth()
中间件方法采用函数列表,因此我可以自定义每个端点所需的身份验证类型。某些类型的身份验证可能取决于输入参数,而其他类型则可能不。此外,一些端点需要不记名令牌授权,其他端点需要 API 密钥。这种方法给了我所需的灵活性。
这种方法的问题在于,如果开发人员创建了一个新端点而忘记添加 auth 中间件,端点将完全开放。
因此,我想编写一个单元测试来防止这种情况。
如何从单元测试中枚举我的路由器并检查我的 auth 中间件是否连接到每个端点?
这方面的文档很少,只给出了在顶层(过程)级别完成的身份验证中间件的示例。 正如我在上面解释的那样,对我的所有端点应用相同类型的授权不适用于我的用例。 示例路由器:
export const accountsRouter = router({
getOne: apiProcedure
.input(inputSchema...)
.use(auth([authMethod1, authMethod2]))
.mutation(() => {
// query logic
}),
getTwo: apiProcedure
.use(auth([authMethod1, authMethod3]))
.output(outputSchema...)
.query(() => {
// query logic
}),