@ data-fair/ lib- express
由数据公平堆栈的网络服务共享的快取 5 个中间软件和帮助器:会话读取,错误处理,反向代理意识请求信息,SPA服务,websocket服务器,身份webhooks.
安装
npm i @data-fair/lib-express @data-fair/lib-node express
同伴依赖性 : @data-fair/lib-node@^3.0.0, (中文(简体) ), express@5,以及 ws@8 (可选,仅限 ws-server.js) (中文(简体) ).
模块
| 导入路径 | 说明 |
|---|---|
@data-fair/lib-express | 再出口小的普通棋子: session.js, (中文(简体) ), errorHandler找到乌提尔斯, httpError, (中文(简体) ), req-origin.js, (中文(简体) ), site.js, (中文(简体) ), serve-spa.js。 。 。 . |
@data-fair/lib-express/session.js | session 验证简单的指令片段饼干, session.middleware() (也打开请求日志上下文,参见 @data-fair/lib-node/log.js, (中文(简体) ), reqSession() 编号 : reqSessionAuthenticated() 编号 : reqAdminMode() 进入者. |
@data-fair/lib-express/error-handler.js | Express 错误处理器: 将错误映射到状态代码, 日志 5xx 作为错误, 401/403 作为警告, 当隐藏 5xx 细节时 NODE_ENV=production。 。 。 . |
@data-fair/lib-express/req-origin.js | 反向代理意识请求信息 : reqOrigin(), (中文(简体) ), reqHost(), (中文(简体) ), reqIp(), (中文(简体) ), reqIsInternal(), (中文(简体) ), assertReqInternalSecret(), (中文(简体) ), secretKeyMatches(). |
@data-fair/lib-express/site.js | createSiteMiddleware(servicePathPart):取出请求的站点路径前缀, reqSitePath(), (中文(简体) ), reqSiteUrl()。 。 。 . |
@data-fair/lib-express/serve-spa.js | createSpaMiddleware():服务于已建成的有UI配置注入,缓存头和CSP的SP. |
@data-fair/lib-express/find-utils.js | mongoSort(), (中文(简体) ), mongoPagination(), (中文(简体) ), mongoProjection() 从查询参数. |
@data-fair/lib-express/req-perf.js | 按路线排列的 df_req_step_seconds 直方图. |
@data-fair/lib-express/ws-server.js | 有频道订阅的 Websocket 服务器, 由 @data-fair/lib-node/ws-emitter.js。 。 。 . |
@data-fair/lib-express/identities/index.js | createIdentitiesRouter(): 接收简单指令中的身份网点. |
@data-fair/lib-express/async-handler.js | 被折旧:快车5号在本土处理Aync路线. |
会议
会议宣读 id_token 饼干由简单的目录设定,用它的JWKS验证. 以简单目录的 URL 初始化, 然后应用中间软件 :
import express from 'express'
import { session, reqSessionAuthenticated, errorHandler } from '@data-fair/lib-express'
session.init(config.privateDirectoryUrl)
const app = express()
app.use('/api', session.middleware()) // or { required: true }, { adminOnly: true }
app.get('/api/items', async (req, res) => {
const { account, accountRole } = reqSessionAuthenticated(req) // 401 if not authenticated
// ...
})
app.use(errorHandler)
权限、 账户角色、 管理模式和 Vue 侧被覆盖 data-fair-session 技能。 。 。 .
范围和无记名证
Authorization: Bearer <token>在饼干之前读取,然后从不读取。 一个标志 JWT 标题typ: at+jwt任何失败都是401 任何其他 无记名者(空出, API 密钥, 会话符号, 另一系统符号) 不自称为 : 请求是匿名的.- 带有一个符号
scope索赔额sessionState.scopes(非字符串索赔为401起)。 一个服务 执行范围呼叫session.init(directoryUrl, lang, onlyDecode, { scopeAware: true })· ; 否则,每次限制范围的会议都会得到403分.scopeAware自由节日也很荣幸SessionHandler(单位:千美元)readStateFromCookie编号 :readStateFromBearer所以消费者直接使用它 默认关闭. - 进入信使最多携带一个组织成员(无 = 个人账户);信使 数个被拒绝 以401.
requireScope('datasets:read')守住一条路 它通过下列方式解读会议内容:session.reqWithScope(req, accepted)(根据请求),所以不需要session.middleware()。 。 。 .assertReqScope(req, ...)是路线的同步变体 中间软件后面.hasScope编号 :assertScope做同样的代码。 无范围的会议是不受限制的. 诸如:datasets已经覆盖datasets:read,因此无需列出. "写意为已读"通过列出被接受的范围来表示,例如.requireScope(['datasets:read', 'datasets:write'])(其中任何一个都足够). 创建这些列表defineScopes联 合 国@data-fair/lib-common-types/scopes.js而不是通过 手:它增加了保护伞和全球层级范围(all:read, (中文(简体) ),all:write, (中文(简体) ),all:admin) (中文(简体) ).- 带有单独密钥集的简单指示符号 瞄准符和访问符
(单位:千美元)
/.well-known/scoped-jwks.json键入scoped-...) (中文(简体) ). 年纪大的人只知道/.well-known/jwks.json并拒绝这些标志, 所以一个范围化的标志 从来没有发挥充分的作用 用于未升级的服务。 拒绝将访问令牌拆分成 cookie, 范围化 符号不能带有超admin的债权,必须过期,只能接受RS256. - 在范围感知服务中,每个读出会话的路由必须首先检查范围:
requireScope(...)编号 :assertReqScope(req, ...),或allowAnyScope编号 :markScopeChecked(req)如果任何范围是好的(会议机制、公共资源)。 否则会话访问者 (单位:千美元)session.req(), (中文(简体) ),reqSession()对范围限定的会话进行回答,也只回答: 原始内容user.scope索赔存在。 不受限制的会议不涉及.- 标出每条路线的瞄准镜,路线需要的射程最窄.
- 永远不适用
allowAnyScope整个应用程序,会议机制本身之外:将开放 每条前往每个目标的道路. - 整个请求的标记会持续: 检查范围与呼叫的路径
next()输入 另外一个操作员将标记传给它.
- 范围化操作可以从浏览器中在其他域上使用:挂载
session.bearerCors()在此之前 了解范围服务的路线。 一通电话Authorization: Bearer由任意 来源( 来源)Access-Control-Allow-Origin: *和飞行前的答案 直接说 无记名符号不是环境,所以来源没有增加任何内容:其范围是什么 限制。 没有无记名信使的电话,没有CORS头条。 中间器件什么也不做,除非 会议是scopeAware,因此执行范围 和打开范围操作到浏览器 一起来. - 网页
ws-server拒绝扩大范围的会议,除非服务通过start(server, db, canSubscribe, { channelScopes })数字 :channelScopes(channel)返回范围 或undefined拒绝在那里进行范围会议(403).canSubscribe之后仍然适用。 范围检查每个订阅消息, 无任何 标记在升级请求上. session.reqForLogs(req)仅读取记录的会话; 绝不使用它来授权. 它从来不扔和忽略范围检查要求; 401/403拒绝是沉默的,其他 错误作为内部错误报告.session.readState, (中文(简体) ),readStateFromCookie财务报告和审定财务报表readStateFromBearer原始读取器: 无路径 瞄准镜,没有请求缓存。 它们不是用于授权的.
网页和身份
- Websocket 服务器 :
data-fair-ws技能。 。 。 . - 身份 webhooks( 重命名, GDPR 删除) :
data-fair-identities技能。 。 。 . reqIsInternal()永远不要给予特权:data-fair-security技能。 。 。 .