# @defra/lis-hubs-infra-access 中文文档

规范地址：https://npmcn.com/package/%40defra/lis-hubs-infra-access/

版本：0\.45\.8
npm 元数据更新时间：2026-11-10T10:06:45.265Z
中文译文更新时间：2026-11-11T21:10:56.246Z
软件包许可：OGL-UK-3\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40defra/lis-hubs-infra-access
原文对照：https://npmcn.com/package/%40defra/lis-hubs-infra-access/?lang=original
项目主页：https://github.com/DEFRA/lis-hubs-infra-access#readme
源码仓库：https://github.com/DEFRA/lis-hubs-infra-access

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：106 kB，31 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- Node.js 要求：\>=24
- 运行依赖：1 个
- peer 依赖：@hapi/boom 10\.0\.1，@defra/lis-hubs-infra-core \>=0\.31\.0 \<1\.0\.0，@defra/lis-hubs-infra-registry \>=0\.5\.0 \<1\.0\.0
- 首次发布：2026-08-10T13:03:46.156Z
- 最新版本发布：2026-11-10T10:06:44.745Z
- 近 30 天下载量：9923（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：115（近 12 个月 115 个）

## 中文简介

牲畜平台共享枢纽接入和能力分辨率.

## 安装

```sh
npm install @defra/lis-hubs-infra-access
```

也可以使用：`pnpm add @defra/lis-hubs-infra-access`、`yarn add @defra/lis-hubs-infra-access`、`bun add @defra/lis-hubs-infra-access`

## README

# 下层访问

畜牧信息服务(LIS)的一部分,它允许牲畜饲养者、所有者、代理商和牲畜饲养者使用 代表们记录和管理他们的动物.

`@defra/lis-hubs-infra-access` 是一个共享 npm 软件包, 提供 hopi 认证方案, 为地雷影响调查中心和演讲者举办的会议和访问决定。 它以 OpenID 连接处理登录 (OIDC),中枢会话,中枢与服务符号传递给发言人,并翻译 身份提供者在LIS角色和权限中的作用.

它故意不持有供应商特定配置或索赔映射。 每个中心都保留着 自己:前台使用Defra CI角色,后台使用Microsoft Entra ID角色. 这个 不决定中心站所服务的模块(见 [登记](https://github.com/DEFRA/lis-hubs-infra-registry))或向 发言(见 [双核](https://github.com/DEFRA/lis-hubs-infra-core)) (中文(简体) ).

用于:

-   中枢 : [lis-hubs-前台办公室](https://github.com/DEFRA/lis-hubs-front-office), (中文(简体) ), [后办公室](https://github.com/DEFRA/lis-hubs-back-office)
-   发言: [丽丝-苹果-牛-家](https://github.com/DEFRA/lis-apps-cattle-home), (中文(简体) ), [lis -apps - crattle - register (英语)](https://github.com/DEFRA/lis-apps-cattle-register), (中文(简体) ), [百花齐放](https://github.com/DEFRA/lis-apps-cattle-move), (中文(简体) ), [鼠类动物死亡](https://github.com/DEFRA/lis-apps-cattle-death), (中文(简体) ), [丽丝-苹果-羊家](https://github.com/DEFRA/lis-apps-sheep-home)
-   软件包 : [服务](https://github.com/DEFRA/lis-infra-ui-services)

## 安装

```bash
npm install @defra/lis-hubs-infra-access @defra/lis-hubs-infra-core @defra/lis-hubs-infra-registry @hapi/boom
```

`@defra/lis-hubs-infra-core`, (中文(简体) ), `@defra/lis-hubs-infra-registry` 财务报告和审定财务报表 `@hapi/boom` 是对等点 依赖,所以消耗的应用也必须安装. 见 `package.json` 支助 各个版本.

## 使用量

### Hapi 认证计划

通过两个Hapi认证方案认证枢纽和语音,每个方案登记为 服务器的默认策略 。 身份已经公布 `request.auth.credentials.user` (单位:千美元)`request.app` 不具备认证状态; `@defra/lis-infra-ui-services`尼姑 上下文 `demandPermission` 从那里读取. 路由选择退出 `auth: false` (资产, `/health`)或接受使用 `auth: { mode: 'try' }` 或者说 `auth: { mode: 'optional' }`签字退出 `try`编号 :`optional` 请求,在一个中心 或一个说话,没有证书,所以 `caller` 这些请求不能提供.

入口点 :

| 导入 | 出口 |
| --- | --- |
| `@defra/lis-hubs-infra-access/authentication` | `createHubAuth`, (中文(简体) ), `HUB_AUTH_STRATEGY`, (中文(简体) ), `createSpokeAuth`, (中文(简体) ), `SPOKE_AUTH_STRATEGY`, (中文(简体) ), `createOidcClient`, (中文(简体) ), `getHubJwt`, (中文(简体) ), `issueHubJwt`, (中文(简体) ), `verifyHubJwt` |
| `@defra/lis-hubs-infra-access/authorization` | `PERMISSIONS`, (中文(简体) ), `hasPermission`, (中文(简体) ), `demandPermission`, (中文(简体) ), `resolveAuthorization`, (中文(简体) ), `GLOBAL_CPH_SCOPE`, (中文(简体) ), `AUTHORIZATION_VERSION` |
| `@defra/lis-hubs-infra-access` | 以上均为 `authentication` 财务报告和审定财务报表 `authorization` 命名空间 |

偏好子路径的导入:它们给出了简单命名的输入和简单的模拟 (单位:千美元)`vi.mock('@defra/lis-hubs-infra-access/authorization')`) (中文(简体) ).

```js
import { createSpokeAuth } from '@defra/lis-hubs-infra-access/authentication'
import {
  hasPermission,
  PERMISSIONS
} from '@defra/lis-hubs-infra-access/authorization'
```

#### 说话: `createSpokeAuth`

```js
await server.register(
  createSpokeAuth({
    spokeId: 'cattle-home',
    hubOrigins,
    port,
    basePath,
    secret,
    audience,
    moduleAccess,
    authorize: async (user, request) => true // optional
  })
)
```

登记 `lis-spoke` 方案作为默认策略。 请求:

1.  必须在 `Authorization: Bearer <token>`,则 `401 { message: 'Service authentication required' }` 在每个路线模式, `public` 包括发言;
2.  必须在 `x-lis-jwt-assertion` 标题 (单位:千美元)`JWT_ASSERTION_HEADER` 从 `@defra/lis-hubs-infra-core`除非说话的人 `public`. 没有一个人, 需要的路由重定向到 `<hubOrigin>/auth/login?returnUrl=…`,则a `try` 路线继续未经认证;
3.  然后获得 `credentials: { user, caller }`时 `caller` 是中枢的 服务名称.

然后核对已认证的请求 `moduleAccess` (非公开) 和可选办法 `authorize` 上游; 失败者或给出403. 工厂扔了一个未知的 `spokeId` 无效 `moduleAccess`。 。 。 .

中心代理设置 `x-lis-jwt-assertion` 代理请求的标题; 发言 jWT中心从未被视为饼干,而作为饼干发送的JWT则被忽略. 信头只是因为服务符号检查先运行,所以 `createSpokeAuth` 不需要饼干选择.

服务代号为AWS STS网络身份代号,由中枢所附加 代理在 `@defra/lis-hubs-infra-core`它必须:

-   成为 RS256 JWT 的密钥签名 `CDP_JWT_JWKS_URI`发布 `CDP_JWT_ISSUER`,带有 `exp` 索赔
-   有观众 `lis-apps-<spokeId>`
-   将呼叫者命名为 `lis-hubs-front-office` 或者说 `lis-hubs-back-office` 输入 `https://sts.amazonaws.com/` 索赔 `principal_tags.ServiceName`

`CDP_JWT_ISSUER` 财务报告和审定财务报表 `CDP_JWT_JWKS_URI` 必须在 `createSpokeAuth` 实值 称为;CDP平台提供. JWKS是用内置的来获取的 `fetch`,通过 CDP 代理通过全球调度器 `setupProxy` (单位:千美元)`@defra/lis-infra-ui-services`)安装.

#### 汉克: `createHubAuth`

```js
await server.register(
  createHubAuth({
    hubId: 'front-office',
    getHubJwtConfig,
    resolveAuthSession,
    buildAuthorizationUrl,
    completeAuthorizationCodeGrant,
    buildLogoutUrl,
    getLogoutOrigins, // from createOidcClient, like buildLogoutUrl
    loginRoutes,
    notAuthorisedPath: '/auth/access-denied', // optional, defaults to '/auth/not-authorised'
    authorize: async (user, request) => true // optional
  })
)
```

注册登录和 `/sso` 路线, `POST /signout`, (中文(简体) ), `GET /signout` 财务报告和审定财务报表 `GET /auth/logout` (所有项目) `auth: false`)和未经授权的路线(`auth: try`)加上 `lis-hub-session` 方案作为默认策略,由yar中枢会话支持。 签约 用户在要求的路由中被重定向到第一个登录路由,使用 `?returnUrl=<path+search>`页:1 `try` 路线一直没有经过认证. 全权证书为: `{ user, authorizedSpecies, caller }`时 `caller` 这是 中枢自己的服务名称( u)`lis-hubs-<hubId>`,匹配 `caller` 说话 看到了吗. `hubId` 必须是登记中心。 可选 `authorize` 仅对经认证的请求进行上游运行; `false` 拒绝请求 (见下文).

JWT在签注时所铸造的枢机保存在枢机的yar会话中,而不是在一个 浏览器 cookie,所以浏览器只持有会话 cookie. `getHubJwt(request)` 返回(或) `null`),而中枢的代理在代理语音上注入 请求 `x-lis-jwt-assertion` 页眉 (e)`JWT_ASSERTION_HEADER` 从 `@defra/lis-hubs-infra-core`) (中文(简体) ). 签署重排会话, 从而放弃 JWT .

标出(和未授权的页面)头是链接到 `GET /signout`, (中文(简体) ), 从未签名的: 带有 CSRF 符号的会话( 只有已签名的会话) (一) 它使 `auth/sign-out` 视图来自 `@defra/lis-infra-ui-services`, (中文(简体) ), 请用户用 `Sign out` 按钮,或 `Cancel`; 任何其他人被重定向到 `/`旧的 `GET /auth/logout` 重定向 改为 `/signout`。 。 。 .

`POST /signout` 构建身份提供者的结束会话 URL,重新设置 会话( 即使构建 URL 失败, 当错误传播时) 和 转向那里。 中心必须注册 `csrfPlugin` 从 `@defra/lis-infra-ui-services/csrf` 与 `{ tokenSource: 'session' }`,哪个 要求该员额必须是同一来源的,并携带会议符号 `_csrf` 字段。 插件被宣布为依赖性, 所以没有 注册失败启动 。 无法选中任一选项( 过期会话) 或请求被伪造) `/`,通过插件的路径 `failAction`,而不是回答403.

浏览器在表单贴出后按住每个重定向到贴出页面的 CSP `form-action`,这是 `'self'` 在每一个中枢页面。 所以确认页 仅允许签注的出处: `getLogoutOrigins(request)` 给出会场结束点的出处、发行者(身份提供者) 自定义域重定向到它的发行主机以完成)和日志后 重定向 URI 的( 从配置的中枢源头, 它可能不是 从同一处 发现元数据和提供者 `buildLogoutUrl`在中心布兰基之后 插件 (e)`blankie`)设置了标题,一个 `onPreResponse` 钩子附着到 页:1 `form-action` 指令,留下其余政策 如来相. Blankie自己的路线选择不能做到这一点:它们取代整个 政策并固定在路线登记上。 如果发现失败 仍在确认页面,使用 `form-action` 左为 `'self'`,则 错误已登录; 退出后仍然重新设置会话 .

一个成功的登录 `/sso` 清除会话的CSRF符号,所以一个新的是 页:1.

中心级拒绝将认证和授权分开:用户 留在中心站,但无权使用. `resolveAuthSession` 通过返回拒绝登录( 如用户不在允许列表中) `{ denied: true }`,以及 `authorize` 返回时拒绝登录用户 `false`。 。 。 . `authorize` 运行每个认证的请求, 并在登录中运行 财务报告和审定财务报表 `/sso` 在JWT被铸造之前的路线。 无论哪种方式,JWT都没有存储在 会话( 任何现有的会话都被清除), 因此无法到达任何会话, 而用户是 重定向到 `notAuthorisedPath`拒绝 登录被存储为标记的会话 `refused`,每个后来认证 请求,包括登录路径,发送到 `notAuthorisedPath` 无 重新运行中枢的检查,直到用户通过正常程序签名 `POST /signout` 流动。 身份提供者没有参与拒绝,所以没有 日志出后重定向 URI 需要它 . `notAuthorisedPath` 一定是个中枢 路径开始于 `/`和旧的 `accessDeniedPath` 选项被拒绝.

默认 `notAuthorisedPath` 实值 `/auth/not-authorised`,在此注册 插件为 `auth: try`: 它使 `error/not-authorised` 视图(来自 `@defra/lis-infra-ui-services`与403和 `pageTitle`外加一个 `signOutHref` 联 合 国 `/signout` 登记访问者或 `signInHref` 会 议 日 程 和 议 程 任何人的第一个登录路径。 一个设置自己的中心 `notAuthorisedPath` 登记该路径本身,并应这样做。 发言级别 403和 记录级404不受影响.

#### 测试路线

路由测试不需要 cookie 或服务符; 注入证书 :

```js
await server.inject({
  url: '/',
  auth: {
    strategy: SPOKE_AUTH_STRATEGY,
    credentials: { user, caller }
  }
})
```

包裹检查中心的事实与 `@defra/lis-hubs-infra-registry`它不实行枢纽政策.

当一个枢机在用户上签字时,它会将提供者角色翻译为LIS角色. 此软件包转动 这些角色进入权限.

### 准入决定如何运作

-   角色定义 `src/authorization/roles/roles.json` 和源绘图 `src/authorization/roles/role-mappings.json`
-   权限来自翻译的LIS角色,不可信于身份 供应商
-   集成器和集成器对应用JWT具有LIS作用和一个授权模型版本, 但不携带扩展权限或持有量
-   应用程序将本地权限从之前的版本角色定义中补水 评价 `hasPermission` 或者说 `demandPermission`
-   允许补水时,CPH范围的角色分配范围保持不变
-   `lis-perm-front-office` 财务报告和审定财务报表 `lis-perm-back-office` 进入相应枢纽的大门
-   物种权限,例如 `lis-perm-cattle-read` 适用于该物种
-   应用程序权限, 例如 `lis-perm-cattle-register-admin` 适用于特定物种应用程序
-   `status` 财务报告和审定财务报表 `home` 在物种上发现的最佳许可
-   后台许可管理模块可建模为 `type` 并解锁 `lis-perm-user-read`, (中文(简体) ), `lis-perm-user-write`,或 `lis-perm-user-admin`

### 环境变量

`createSpokeAuth` 读这些。 CDP平台设置. 在Lis-dev中,由作曲文件设置.

| 变量 | 用于 |
| --- | --- |
| `CDP_JWT_ISSUER` | 预期的代号签发人 |
| `CDP_JWT_JWKS_URI` | 在哪里获取验证服务标志签名的密钥 |

## 先决条件

-   节点.js 24(见 `.nvmrc`,使用时 `nvm use`(中文(简体) )
-   对照一个消费的应用程序检查更改: [净值](https://github.com/DEFRA/lis-dev) 一次性设置完成

## 设置

### 发展

```bash
nvm use
npm install
```

### 测试

无法安装工具 `npm install`测试 [维特](https://vitest.dev/)。 。 。 .

## 正在发展中

这是一个库,所以它没有自己的服务器. 尝试改变一个消费应用 没有 发布, 将本地副本链接到 lis- dev 堆栈 :

```bash
cd lis-dev
.bin/sideload link hubs/infra-access # every installed copy now points at this repo
.bin/sideload up cattle-home        # optional: run a consumer locally with hot reload
.bin/sideload unlink hubs/infra-access # when done
```

## 正在测试

```bash
npm test                 # unit tests
npm run test:coverage    # with coverage
npm run lint             # ESLint
npm run format:check     # Prettier
```

在释放出一个变化之前,还要对连接包进行每个消耗回波的测试.

## 管道

GitHub 动作中运行的构建、版本和出版(`.github/workflows`)使用蛋糕脚本(`*.cake`:

-   **将请求拉到 `main`**: 校验(格式、林特、测试),声纳分析,版本检查
-   **推到一个 `feature/` 或者说 `hotfix/` 分支**: 预发版本和标签
-   **合并到 `main`**: 释放标签,然后发布到 [无](https://www.npmjs.com/package/@defra/lis-hubs-infra-access)

版本来自git标签 (SemVer). 合并后, 等待出版工作完成后, 才将套件撞入消耗回购中 .

## 分支政策

Repo采用干线开发. 分行从 `main` 并命名分支:

-   `feature/LREG-<ticket>-<short-kebab-description>`
-   `hotfix/LREG-<ticket>-<short-kebab-description>`

`LREG` 必须是大写,因为 GitHub 规则拒绝其他分支名称。 重置为 `main` 而不是合并 `main` 进去.

## 协助这一项目

-   跟着 [Defra软件开发标准](https://github.com/DEFRA/software-development-standards)。 。 。 .
-   `npm install` 设置一个承诺前钩子(Husky),运行安全审计,格式检查和lint.
-   打开拉动请求 `main` 使用 PR 模板。 CI必须通过而声纳质量门在合并前必须是绿色.
-   地物分枝会撞倒小版本而热补丁分枝. 虽然包裹在0.x上,但作为小版本对公共API船只的突破性改变,所以在PR中叫出它以便消费者可以更新.

## 许可证

本资料系根据下列公开政府规定公布:

[http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3 互联网档案馆的存檔,存档日期2013-12-21](http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3)

在使用此信息时, 您的产品和应用程序中引用以下的归属声明 MUST .

> 载有根据开放政府许可证颁发的公共部门信息v3

### 关于许可证

开放政府许可证(OGL)由陛下文具办公室(HMSO)的主计长制定,使公共部门的信息提供者能够根据共同开放许可证许可其信息的使用和再使用.

它旨在鼓励自由和灵活地使用和再使用信息,仅附带一些条件.

## 常见问题

### @defra/lis-hubs-infra-access 是什么？

牲畜平台共享枢纽接入和能力分辨率\.

### 如何安装 @defra/lis-hubs-infra-access？

在项目目录运行 npm install @defra/lis-hubs-infra-access，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@hapi/boom（10\.0\.1）、@defra/lis-hubs-infra-core（\>=0\.31\.0 \<1\.0\.0）、@defra/lis-hubs-infra-registry（\>=0\.5\.0 \<1\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @defra/lis-hubs-infra-access 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/defra\_\_lis-hubs-infra-access 是否存在。

### @defra/lis-hubs-infra-access 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @defra/lis-hubs-infra-access 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=24。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @defra/lis-hubs-infra-access 可以商用吗？

@defra/lis-hubs-infra-access 使用 OGL-UK-3\.0 许可。声明的许可为 OGL-UK-3\.0，请阅读许可原文确认使用条件。以上为概括，不构成法律意见，请以许可原文为准。

### @defra/lis-hubs-infra-access 的下载量有多少？

根据 npm 官方下载统计，@defra/lis-hubs-infra-access 在 2026/10/12 – 2026/11/10 这 30 天内被下载 9,923 次，日均约 331 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @defra/lis-hubs-infra-access 还在维护吗？

最新版本 0\.45\.8 发布于 2026/11/10（1 天前）；至今共发布 115 个版本，其中过去 12 个月发布了 115 个；首次发布于 2026/08/10。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

