DataHub 访问令牌(Access Token)管理实战:基于 GraphQL API 的创建、查询与吊销全指南

发布时间:2026/9/16 13:51:09

DataHub 访问令牌(Access Token)管理实战:基于 GraphQL API 的创建、查询与吊销全指南 DataHub 访问令牌Access Token管理实战基于 GraphQL API 的创建、查询与吊销全指南【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub导读DataHub 以 GraphQL API 形式提供了一整套访问令牌Access Token管理能力涵盖令牌的生成createAccessToken、分页查询listAccessTokens与吊销revokeAccessToken三类核心操作。本文以仓库 docs/api/graphql/token-management.md 为主体骨架结合 auth.graphql 中的真实 Schema 与datahub-graphql-core中的 Resolver 实现逐层讲解令牌的权限模型、入参约束、配置项与底层调用链。读完本文你将掌握如何通过 GraphQL 与 CURL 两种方式为自身或其他用户签发、检索、撤销访问令牌并理解 DataHub 如何用 Policy策略与平台级配置守护这些高危操作。一、访问令牌与 DataHub 的权限保护模型DataHub 提供的graphql端点用于管理 Access Token。调用者既可以管理自己的令牌也可以在拥有足够权限时管理他人的令牌——具体能做什么完全取决于调用者所持有的特权privilege。一个关键前提是这套 API 依赖 DataHub Policies 来防止越权使用。默认情况下除非用户至少拥有Generate Personal Access Tokens生成个人访问令牌特权否则完全无法与这套 API 交互。也就是说能不能生成令牌、能不能看别人的令牌、能不能撤销别人的令牌 都是通过策略系统动态判定的而不是硬编码的。从源码结构看datahub-graphql-core模块在 resolvers/auth 目录下为每个端点提供了独立的 Resolver并在GmsGraphQLEngine中完成注册。整个令牌体系还依赖StatefulTokenService有状态令牌服务生成的令牌会被哈希后以accessToken实体形式写入元数据存储从而支持后续的查询、撤销与过期管理——这正是listAccessTokens、revokeAccessToken能够按实体检索的依据。二、生成访问令牌createAccessToken2.1 端点与 Schema 定义生成令牌的端点是createAccessToken(input: CreateAccessTokenInput!): AccessToken。它在 auth.graphql 中定义为 Mutation接收的输入结构CreateAccessTokenInput包含以下字段字段类型是否必填说明typeAccessTokenType!是令牌类型枚举值为PERSONAL个人访问令牌或SERVICE_ACCOUNT服务账号令牌actorUrnString!是与该令牌关联的 Actor URN例如urn:li:corpuser:datahubdurationAccessTokenDuration二选一预定义时长枚举见下表与durationIso恰好只能提供一个durationIsoString二选一ISO-8601 时长字符串例如P30D、PT1H、P1Y与duration恰好只能提供一个nameString!是令牌名称用于事后识别descriptionString否令牌描述可选其中AccessTokenDuration枚举在 auth.graphql 中定义共 8 个取值。结合 AccessTokenUtil.java 中的时长映射实现其对应的实际有效期如下枚举值含义映射时长毫秒ONE_HOUR1 小时3,600,000ONE_DAY1 天86,400,000ONE_WEEK1 周604,800,0007 天ONE_MONTH1 个月2,592,000,00030 天THREE_MONTHS3 个月7,776,000,00090 天SIX_MONTHS6 个月15,552,000,000180 天ONE_YEAR1 年31,536,000,000365 天NO_EXPIRY永不过期无受开关控制见下文注意ONE_MONTH固定按 30 天、ONE_YEAR固定按 365 天近似换算这是源码 AccessTokenUtil.java 的既定行为配置ACCESS_TOKEN_ALLOWED_DURATIONS时也应使用相同口径。2.2 时长约束duration 与 durationIso 的互斥与白名单文档明确指出duration枚举与durationIsoISO-8601 字符串二选一且恰好必须提供一个。这一约束在 AccessTokenDurationPolicy.java 中被硬编码两者都传或都不传会抛出IllegalArgumentExceptionExactly one of duration or durationIso must be provided when creating an access token。传入durationIso时会先由IsoDurationParser解析为毫秒再检查是否命中ACCESS_TOKEN_ALLOWED_DURATIONS白名单。传入duration枚举时同样会被映射为毫秒后检查白名单不命中会提示选择ACCESS_TOKEN_ALLOWED_DURATIONS中允许的取值。两个环境变量承担了双重职责ACCESS_TOKEN_ALLOW_NO_EXPIRY默认false。只有设为true时才允许创建NO_EXPIRY永不过期令牌即使关闭已存在的永不过期令牌仍可继续使用只是无法再新建。ACCESS_TOKEN_ALLOWED_DURATIONS默认值为PT1H,P1D,P7D,P30D,P90D,P180D,P365D逗号分隔的 ISO-8601 时长列表。创建令牌时的有效期必须命中该列表UI 中的可选时长也由它驱动。两者的默认值可以在 application.yaml 中核实accessTokens.allowNoExpiry: ${ACCESS_TOKEN_ALLOW_NO_EXPIRY:false}、accessTokens.allowedDurations: ${ACCESS_TOKEN_ALLOWED_DURATIONS:PT1H,P1D,P7D,P30D,P90D,P180D,P365D}。2.3 示例为 datahub 用户签发个人令牌为datahubcorp user 生成一个 1 小时有效期的个人访问令牌As GraphQLmutation { createAccessToken( input: { type: PERSONAL actorUrn: urn:li:corpuser:datahub duration: ONE_HOUR name: my personal token } ) { accessToken metadata { id name description } } }As CURLcurl --location --request POST http://localhost:8080/api/graphql \ --header X-DataHub-Actor: urn:li:corpuser:datahub \ --header Content-Type: application/json \ --data-raw { query:mutation { createAccessToken(input: { type: PERSONAL, actorUrn: \urn:li:corpuser:datahub\, duration: ONE_HOUR, name: \my personal token\ } ) { accessToken metadata { id name description} } }, variables:{}}返回的AccessToken对象包含两部分accessToken令牌字符串本身调用方必须立即保存之后无法再次读取明文metadata用于事后识别该令牌的元数据。从 CreateAccessTokenResolver.java 的实现可以看到元数据中的urn实际由令牌的哈希_statefulTokenService.hash(accessToken)构成即urn:li:accessToken:tokenHash类型为EntityType.ACCESS_TOKEN。如需使用 ISO-8601 时长把duration: ONE_HOUR替换为durationIso: PT1H即可需要更长有效期时可改用P30D30 天等命中白名单的取值。2.4 底层授权逻辑源码佐证生成令牌并非谁都能给任何人发。在 CreateAccessTokenResolver.java 中授权按令牌类型分流PERSONAL 类型调用者满足以下任一条件即可签发——拥有Manage All Access Tokens平台特权AuthorizationUtils.canManageTokens或者actorUrn等于调用者自身且调用者拥有Generate Personal Access Tokens特权。SERVICE_ACCOUNT 类型仅当调用者拥有Manage All Service Accounts特权AuthorizationUtils.canManageServiceAccounts时允许且会先校验actorUrn确实是一个已注册的服务账号CreateAccessTokenResolver.java。未经授权时抛出AuthorizationException错误信息为 Unauthorized to perform this action. Please contact your DataHub administrator.。三、列出访问令牌listAccessTokens3.1 端点与 Schema 定义列出令牌的端点是listAccessTokens(input: ListAccessTokenInput!): ListAccessTokenResult!。其输入与返回结构定义在 auth.graphqlListAccessTokenInputstart起始偏移默认 0、count返回条数默认 20、filtersFacetFilterInput列表用于筛选。ListAccessTokenResultstart、count、total结果总数与tokensAccessTokenMetadata数组。AccessTokenMetadata是实现了Entity接口的实体类型auth.graphql除urn、id外还提供name、description、actorUrn与令牌关联的 Actor、ownerUrn创建该令牌的 Actor、owner对应的 CorpUser 实体、createdAt、expiresAt等字段这些字段均映射到dataHubAccessTokenInfoaspect。3.2 列出自己拥有的令牌列出令牌最典型的场景是查看我自己名下的令牌。文档给出的做法是在filters中用{field: ownerUrn, values: your user urn}指定归属者。As GraphQL{ listAccessTokens( input: { start: 0 count: 100 filters: [{ field: ownerUrn, values: urn:li:corpuser:datahub }] } ) { start count total tokens { urn id actorUrn } } }As CURLcurl --location --request POST http://localhost:8080/api/graphql \ --header X-DataHub-Actor: urn:li:corpuser:datahub \ --header Content-Type: application/json \ --data-raw { query:{ listAccessTokens(input: {start: 0, count: 100, filters: [{field: \ownerUrn\, values: \urn:li:corpuser:datahub\}]}) { start count total tokens {urn id actorUrn} } }, variables:{}}从源码 ListAccessTokensResolver.java 看授权判定为拥有Manage All Access Tokens平台特权或者调用者拥有Generate Personal Access Tokens特权且请求中的filters恰好包含ownerUrn 调用者自身 URN的条件isListingSelfTokens方法。换句话说普通用户只能列出自己创建的令牌而且必须显式用ownerUrn过滤出自己的 URN——不能省略过滤器去看全平台。3.3 管理员列出他人令牌平台管理员可以列出其他用户拥有的令牌前提是拥有Manage All Access Tokens平台特权。此时可以传入空的filters数组查询全量令牌As GraphQL{ listAccessTokens(input: { start: 0, count: 100, filters: [] }) { start count total tokens { urn id actorUrn } } }As CURLcurl --location --request POST http://localhost:8080/api/graphql \ --header X-DataHub-Actor: urn:li:corpuser:datahub \ --header Content-Type: application/json \ --data-raw { query:{ listAccessTokens(input: {start: 0, count: 100, filters: []}) { start count total tokens {urn id actorUrn} } }, variables:{}}3.4 过滤条件与排序行为除了ownerUrn还支持其他过滤字段。凡是DataHubAccessTokenInfoaspect 中的属性都可作为筛选条件该 aspect 的定义可参阅仓库中实体文档。常见的可过滤字段包括actorUrn与令牌关联的 actor、expiresAt过期时间等。底层实现ListAccessTokensResolver.java有两个值得注意的行为查询以expiresAt字段按降序排序SortOrder.DESCENDING即越晚过期的令牌排在越前面便于审计即将过期的令牌检索走的是 fulltext 搜索withSearchFlags(flags - flags.setFulltext(true))因此结果集是搜索式的total反映的是匹配总数start/count控制分页游标。四、吊销访问令牌revokeAccessToken4.1 端点与调用示例吊销令牌使用revokeAccessToken(tokenId: String!): Boolean!Mutation定义见 auth.graphql。需要传入tokenId——即令牌元数据中的id例如从listAccessTokens的结果中获取。As GraphQLmutation { revokeAccessToken(tokenId: HnMJylxuowJ1FKN74BbGogLvXCS4wfsd3MZdI358A) }As CURLcurl --location --request POST http://localhost:8080/api/graphql \ --header X-DataHub-Actor: urn:li:corpuser:datahub \ --header Content-Type: application/json \ --data-raw {query:mutation {revokeAccessToken(tokenId: \HnMJylxuowJ1FKN74BbGogLvXCS4wfsd3MZdI358A\)},variables:{}}}该端点返回一个布尔值表示操作是否成功失败时会返回错误信息说明原因例如令牌不存在、无权操作等。4.2 底层授权逻辑源码佐证吊销是破坏性操作权限判定同样严格。在 RevokeAccessTokenResolver.java 中允许吊销的调用者需满足二选一拥有Manage All Access Tokens平台特权AuthorizationUtils.canManageTokens是目标令牌的创建者本人通过getV2拉取accessToken实体与accessTokenInfoaspect比对其中ownerUrn是否等于调用者自身 URN。判定通过后调用_statefulTokenService.revokeAccessToken(...)完成撤销成功返回true。4.3 撤销后的行为撤销后的令牌立即失效后续携带该令牌调用 DataHub 任何 API 都将被拒绝认证。由于令牌以哈希形式存储明文令牌一旦丢失无法找回因此建议在签发后立即将令牌字符串安全保存审计与追溯请依赖listAccessTokens返回的元数据urn、id、ownerUrn、createdAt、expiresAt等。五、配套 GraphQL 端点与配置速查5.1 其他相关端点在 auth.graphql 中还定义了几个与令牌管理配套的端点可按需组合使用getAccessToken(input: GetAccessTokenInput!): AccessToken已废弃的生成端点官方注释建议改用createAccessTokenauth.graphql。getAccessTokenMetadata(token: String!): AccessTokenMetadata!输入明文令牌返回其元数据。官方注释说明它适用于手里有原始令牌但不知道 actor的调试场景auth.graphql。debugAccess(userUrn: String!): DebugAccessResult!实验性 API用于排查某用户在平台上的角色、策略与特权集合可配合令牌权限问题诊断auth.graphql。服务账号相关createServiceAccount、deleteServiceAccount、listServiceAccounts、getServiceAccount以及updateServiceAccountDefaultView要求MANAGE_SERVICE_ACCOUNTS平台特权。SERVICE_ACCOUNT类型的令牌正是围绕服务账号体系设计的。5.2 环境变量配置速查环境变量默认值作用ACCESS_TOKEN_ALLOW_NO_EXPIRYfalse是否允许创建NO_EXPIRY永不过期令牌关闭时新建会被拒绝已存在的继续有效ACCESS_TOKEN_ALLOWED_DURATIONSPT1H,P1D,P7D,P30D,P90D,P180D,P365D创建令牌时允许的 ISO-8601 时长白名单逗号分隔同时驱动 UI 可选时长配置入口位于 application.yaml 的authentication.accessTokens段可通过环境变量覆盖。注意白名单不能为空且P1M按 30 天、P1Y按 365 天近似。5.3 与策略体系的联动整套令牌 API 的权限边界最终由 DataHub Policies 决定。与本文直接相关的平台特权包括Generate Personal Access Tokens允许用户为自己生成与列出个人令牌默认拦截一切令牌相关操作的最低门槛。Manage All Access Tokens允许管理全平台令牌包括为他人签发、列出他人令牌、撤销任意令牌。Manage All Service Accounts允许管理服务账号及其令牌。因此在实际部署中应通过策略管理界面为普通用户、管理员、自动化脚本分别授予最小化特权并将ACCESS_TOKEN_ALLOW_NO_EXPIRY保持为false除非确有必要以降低长期有效凭据泄露的风险。六、最佳实践小结令牌即凭据createAccessToken返回的明文令牌只出现一次务必在返回后立即安全存储日常审计一律基于listAccessTokens的元数据。期限最小化优先使用短期令牌ONE_HOUR、ONE_DAY或PT1H、P1D长期自动化场景再考虑P90D、P180D等除非业务必须否则不开NO_EXPIRY。权限收敛普通用户只授予Generate Personal Access Tokens只有运维/管理角色才授予Manage All Access Tokens与Manage All Service Accounts。及时吊销凭据疑似泄露或员工离职时管理员应立即通过revokeAccessToken撤销对应tokenId或在策略层收紧权限。善用配套端点使用getAccessTokenMetadata反查明文令牌归属使用debugAccess排查某用户为何无法生成/管理令牌。延伸阅读令牌 GraphQL Schema 全量定义auth.graphql令牌创建 Resolver含授权分流与时长解析CreateAccessTokenResolver.java令牌时长策略互斥校验、白名单、永不过期开关AccessTokenDurationPolicy.java 与 AccessTokenUtil.java令牌列表 Resolver分页、排序、自查询判定ListAccessTokensResolver.java令牌吊销 Resolver归属校验RevokeAccessTokenResolver.java令牌时长环境变量默认值application.yamlGraphQL API 其他操作手册可参阅 docs/api/graphql 目录下的相关文档【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/16 13:46:07

AI表格助手:自然语言处理与数据分析的革新

1. 项目概述:当表格处理遇上AI助手最近上线了一款名为"表答"的小程序,主打用AI技术解决日常表格处理和数据分析的痛点。作为一个常年和Excel、Google Sheets打交道的从业者,我第一时间做了深度测试。这个小程序的核心理念很明确——…

2026/9/16 13:46:07

政策文件制定流程与数字化工具应用解析

1. 政策文件制定的基本流程解析政策文件的形成是一个严谨而复杂的过程,通常需要经历多个环节的反复推敲和论证。以年度重要政策文件为例,其制定周期往往长达数月,涉及数十个部门的协同工作。整个流程可以划分为前期准备、调研起草、征求意见、…

2026/9/16 14:46:20

Flink实时推荐系统实战:从行为流接入到相似度计算与链路调优

简介:基于Flink实现的商品实时推荐系统源码包,面向大数据流计算与推荐系统开发者,完整演示了从日志采集、热度统计到个性化推荐的生产级实现。系统依托Flink实时计算商品热度并写入Redis缓存,同时将用户画像与行为记录存入HBase&a…

2026/9/16 14:46:20

H5魂斗罗突围小游戏源码解析:Canvas渲染、对象池与碰撞检测

简介:这是一份基于HTMLCSSJS开发的“魂斗罗之突围”H5小游戏完整源码包,适合前端初学者、游戏开发爱好者及个人网站站长参考。资源通过纯前端技术实现了角色移动、射击、敌人生成等经典玩法,无需后端即可部署使用,也可直接嵌入个人…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码