下层访问
畜牧信息服务(LIS)的一部分,它允许牲畜饲养者、所有者、代理商和牲畜饲养者使用 代表们记录和管理他们的动物.
@defra/lis-hubs-infra-access 是一个共享 npm 软件包, 提供 hopi 认证方案,
为地雷影响调查中心和演讲者举办的会议和访问决定。 它以 OpenID 连接处理登录
(OIDC),中枢会话,中枢与服务符号传递给发言人,并翻译
身份提供者在LIS角色和权限中的作用.
它故意不持有供应商特定配置或索赔映射。 每个中心都保留着 自己:前台使用Defra CI角色,后台使用Microsoft Entra ID角色. 这个 不决定中心站所服务的模块(见 登记)或向 发言(见 双核) (中文(简体) ).
用于:
- 中枢 : lis-hubs-前台办公室, (中文(简体) ), 后办公室
- 发言: 丽丝-苹果-牛-家, (中文(简体) ), lis -apps - crattle - register (英语), (中文(简体) ), 百花齐放, (中文(简体) ), 鼠类动物死亡, (中文(简体) ), 丽丝-苹果-羊家
- 软件包 : 服务
安装
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')) (中文(简体) ).
import { createSpokeAuth } from '@defra/lis-hubs-infra-access/authentication'
import {
hasPermission,
PERMISSIONS
} from '@defra/lis-hubs-infra-access/authorization'
说话: createSpokeAuth
await server.register(
createSpokeAuth({
spokeId: 'cattle-home',
hubOrigins,
port,
basePath,
secret,
audience,
moduleAccess,
authorize: async (user, request) => true // optional
})
)
登记 lis-spoke 方案作为默认策略。 请求:
- 必须在
Authorization: Bearer <token>,则401 { message: 'Service authentication required' }在每个路线模式,public包括发言; - 必须在
x-lis-jwt-assertion标题 (单位:千美元)JWT_ASSERTION_HEADER从@defra/lis-hubs-infra-core除非说话的人public. 没有一个人, 需要的路由重定向到<hubOrigin>/auth/login?returnUrl=…,则atry路线继续未经认证; - 然后获得
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
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 或服务符; 注入证书 :
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(中文(简体) ) - 对照一个消费的应用程序检查更改: 净值 一次性设置完成
设置
发展
nvm use
npm install
测试
无法安装工具 npm install测试 维特。 。 。 .
正在发展中
这是一个库,所以它没有自己的服务器. 尝试改变一个消费应用 没有 发布, 将本地副本链接到 lis- dev 堆栈 :
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
正在测试
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: 释放标签,然后发布到 无
版本来自git标签 (SemVer). 合并后, 等待出版工作完成后, 才将套件撞入消耗回购中 .
分支政策
Repo采用干线开发. 分行从 main 并命名分支:
feature/LREG-<ticket>-<short-kebab-description>hotfix/LREG-<ticket>-<short-kebab-description>
LREG 必须是大写,因为 GitHub 规则拒绝其他分支名称。 重置为 main
而不是合并 main 进去.
协助这一项目
- 跟着 Defra软件开发标准。 。 。 .
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
在使用此信息时, 您的产品和应用程序中引用以下的归属声明 MUST .
载有根据开放政府许可证颁发的公共部门信息v3
关于许可证
开放政府许可证(OGL)由陛下文具办公室(HMSO)的主计长制定,使公共部门的信息提供者能够根据共同开放许可证许可其信息的使用和再使用.
它旨在鼓励自由和灵活地使用和再使用信息,仅附带一些条件.