news 2026/9/14 2:34:34

Argo CD 项目角色令牌管理:`argocd proj role list-tokens` 命令全面解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Argo CD 项目角色令牌管理:`argocd proj role list-tokens` 命令全面解析

Argo CD 项目角色令牌管理:argocd proj role list-tokens命令全面解析

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

导读

argocd proj role list-tokens是 Argo CD CLI 中用于列出指定项目(Project)下某个角色(Role)所签发 JWT 令牌的核心命令。在 Argo CD 的 RBAC 体系中,项目角色令牌(Project JWT Token)是用于自动化场景(如 CI/CD 流水线、GitOps 工具链)对接 Argo CD API 的轻量级凭证,而 list-tokens 正是审计、轮换、清理这些令牌的入口。阅读本文后,你将掌握该命令的完整语法、输出字段含义、--unixtimedelete-token的管道协作技巧,以及其底层源码实现原理,能够安全高效地管理项目角色令牌生命周期。

命令概览与适用场景

命令语法

argocd proj role list-tokens PROJECT ROLE-NAME [flags]

该命令由 cmd/argocd/commands/project_role.go 中的NewProjectRoleListTokensCommand函数定义,属于argocd proj role子命令族,用于展示指定项目下指定角色已签发的所有 JWT 令牌及其签发时间与过期时间

该命令还注册了两个便捷别名(Aliases):

别名说明
list-token单数形式,等价于list-tokens
token-list动词前置形式,等价于list-tokens

argocd proj role token-list test-project test-role与标准写法完全等价。

典型适用场景

  • 令牌审计:定期检查项目中各角色签发了哪些令牌、是否存在永不过期的令牌;
  • 令牌轮换/清理:先列出令牌及其签发时间,再使用delete-token删除指定令牌;
  • 脚本化集成:通过--unixtime输出时间戳,将结果直接管道给delete-token实现批量清理。

使用前提

  1. 目标项目(PROJECT)必须已存在(如argocd proj create test-project);
  2. 目标角色(ROLE-NAME)必须已在项目中创建(如argocd proj role create test-project test-role);
  3. 执行命令的账号需要具备相应 RBAC 权限(projects资源的读取权限)。

运行示例与输出解读

基本用法

$ argocd proj role list-tokens test-project test-role ID ISSUED AT EXPIRES AT f316c466-40bd-4cfd-8a8c-1392e92255d4 2023-10-08T15:21:40+01:00 Never fa9d3517-c52d-434c-9bff-215b38508842 2023-10-08T11:08:18+01:00 Never

输出字段详解

输出使用制表符对齐的表格格式(Go 标准库text/tabwriter),包含三列:

列名含义数据来源
ID令牌的唯一标识(JWT 的jticlaim)JWTToken.ID
ISSUED AT令牌签发时间JWTToken.IssuedAt(JWT 的iatclaim)
EXPIRES AT令牌过期时间JWTToken.ExpiresAt(JWT 的expclaim)

其中时间列的格式化逻辑由 cmd/argocd/commands/project_role.go 中的tokenTimeToString函数实现:

func tokenTimeToString(t int64) string { tokenTimeToString := "Never" if t > 0 { tokenTimeToString = time.Unix(t, 0).Format(time.RFC3339) } return tokenTimeToString }

即:

  • 当时间戳值大于 0时,格式化为 RFC3339 标准时间(如2023-10-08T15:21:40+01:00,包含时区偏移);
  • 当时间戳值为 0 或不存在时,显示为Never(表示该令牌永不过期)。

空结果提示

如果目标角色下没有任何令牌,命令会输出提示而非空表格:

No tokens for test-project.test-role

该逻辑位于源码第 420-423 行:当len(role.JWTTokens) == 0时直接打印No tokens for <project>.<role>并返回。

核心选项:--unixtime与令牌清理管道

选项说明

-u, --unixtime Print timestamps as Unix time instead of converting. Useful for piping into delete-token.

默认情况下,ISSUED ATEXPIRES AT两列会通过tokenTimeToString转换为 RFC3339 人类可读时间。而加上--unixtime(或简写-u)后,命令直接输出原始的 Unix 时间戳(自 1970-01-01 起的秒数),不做任何格式化转换。

从源码看(第 429-436 行),当useUnixTime为 true 时,token.IDtoken.IssuedAttoken.ExpiresAt三个字段原样输出;否则对后两个字段调用tokenTimeToString转换。

为什么需要 Unix 时间戳?

关键在于delete-token命令使用 Unix 时间戳作为令牌的定位参数。查看 cmd/argocd/commands/project_role.go 中NewProjectRoleDeleteTokenCommand的定义:

delete-token PROJECT ROLE-NAME ISSUED-AT

其实现中通过strconv.ParseInt(tokenId, 10, 64)将第三个参数解析为 int64,作为iat(签发时间)传递给projIf.DeleteTokenProjectTokenDeleteRequest。也就是说,删除令牌需要的是签发时间的 Unix 时间戳,而不是人类可读时间。

因此--unixtime的典型用法是配合delete-token实现脚本化清理,例如先查看某角色的令牌:

$ argocd proj role list-tokens test-project test-role --unixtime ID ISSUED AT EXPIRES AT f316c466-40bd-4cfd-8a8c-1392e92255d4 1696774900 0 fa9d3517-c52d-434c-9bff-215b38508842 1696759698 0

此时ISSUED AT列的1696774900可直接作为delete-tokenISSUED-AT参数使用。文档中的示例命令(第 477 行)也印证了这一协作方式:

$ argocd proj role delete-token test-project test-role 1696769937

注意:使用--unixtime时,EXPIRES AT列的0表示该令牌永不过期(对应默认输出的Never),而非时间起点。

其他命令级选项(Options)

--unixtime外,该命令还继承自父命令(argocd proj role/argocd根命令)的一系列连接与认证选项,常见的重要选项如下:

选项默认值说明
--server stringArgo CD server 地址
--argocd-context string要使用的 Argo CD server context 名称
--auth-token string认证令牌;设置此项或ARGOCD_AUTH_TOKEN环境变量
--config string/home/user/.config/argocd/configArgo CD 配置文件路径
--corefalse若为 true,CLI 直接与 Kubernetes 通信而非 Argo CD API server
--grpc-webfalse启用 gRPC-web 协议,适用于 Argo CD server 位于不支持 HTTP2 的代理之后
--grpc-web-root-path string启用 gRPC-web 时设置 web 根路径
-H, --header strings为所有请求添加额外 header(可重复指定,支持逗号分隔多个)
--insecurefalse跳过服务器证书与域名校验
--kube-context string指定 kube-context
--plaintextfalse禁用 TLS
--port-forwardfalse通过端口转发连接随机 argocd-server 端口
--port-forward-namespace string端口转发使用的命名空间
--loglevel stringinfo日志级别:debuginfowarnerror
--logformat stringjson日志格式:jsontext
--server-name stringargocd-serverArgo CD API server 名称(Helm 安装时名称 label 可能不同,可用ARGOCD_SERVER_NAME环境变量覆盖)
--controller-name stringargocd-application-controllerApplication controller 名称
--repo-server-name stringargocd-repo-serverRepo server 名称
--redis-name stringargocd-redisRedis 部署名称
--redis-haproxy-name stringargocd-redis-ha-haproxyRedis HA Proxy 名称
--redis-compress stringgzip若 controller 启用了 redis 压缩,可取值gzipnone
--http-retry-max int建立 HTTP 连接的最大重试次数
--prompts-enabledfalse(由本地配置决定)强制启用/禁用交互式提示

源码级实现原理

命令执行流程

NewProjectRoleListTokensCommandRun回调(cmd/argocd/commands/project_role.go)完整执行链路如下:

  1. 参数校验len(args) != 2时调用c.HelpFunc()打印帮助信息并以状态码 1 退出;两个位置参数依次为projNameargs[0])与roleNameargs[1]);
  2. 建立客户端:通过headless.NewClientOrDie(clientOpts, c)创建 gRPC 客户端,并调用NewProjectClientOrDieWithContext(ctx)获取 ProjectService 客户端,连接使用defer utilio.Close(conn)确保释放;
  3. 获取项目:调用projIf.Get(ctx, &projectpkg.ProjectQuery{Name: projName})拉取项目对象;
  4. 定位角色:调用proj.GetRoleByName(roleName)从项目的Spec.Roles中按名称查找角色。该方法定义于 pkg/apis/application/v1alpha1/app_project_types.go:遍历proj.Spec.Roles,若找到同名角色则返回该角色及其索引;否则返回错误role '<name>' does not exist in project '<name>'
  5. 空值判断:若len(role.JWTTokens) == 0,打印No tokens for <project>.<role>并返回;
  6. 格式化输出:使用tabwriter.NewWriter(os.Stdout, 0, 0, 4, ' ', 0)创建对齐宽度为 4 的制表写入器,先输出表头ID\tISSUED AT\tEXPIRES AT,再逐行输出token.IDtoken.IssuedAttoken.ExpiresAt(是否经tokenTimeToString转换由--unixtime决定),最后writer.Flush()落盘。

数据结构:JWTToken

命令输出的数据来源是 pkg/apis/application/v1alpha1/types.go 中定义的JWTToken结构体:

// JWTToken holds the issuedAt and expiresAt values of a token type JWTToken struct { IssuedAt int64 `json:"iat" protobuf:"int64,1,opt,name=iat"` ExpiresAt int64 `json:"exp,omitempty" protobuf:"int64,2,opt,name=exp"` ID string `json:"id,omitempty" protobuf:"bytes,3,opt,name=id"` }

三个字段与输出三列一一对应:

  • IssuedAtiat):签发时间,Unix 秒级时间戳;
  • ExpiresAtexp):过期时间,Unix 秒级时间戳,omitempty意味着未设置过期时间的令牌该字段为 0;
  • IDid):令牌唯一标识,通常为创建令牌时生成的 UUID(如示例中的f316c466-40bd-4cfd-8a8c-1392e92255d4)。

该结构体嵌套于ProjectRoleJWTTokens []JWTToken字段中(同文件第 3535 行),即每个项目角色的令牌列表直接存储在项目的Spec.Roles里。

与令牌生命周期的关系

理解 list-tokens 的输出,需要了解令牌的创建与删除机制:

  • 创建argocd proj role create-token PROJECT ROLE-NAME通过ProjectTokenCreateRequest调用 ProjectService 的CreateToken接口。创建时可通过--expires-in(如12h7d,默认无过期)和--id(默认随机 UUID)定制令牌。创建成功后 CLI 会解析返回的 JWT,从 claims 中提取iatexpjti等字段回显——这与 list-tokens 展示的列完全对应;
  • 删除argocd proj role delete-token PROJECT ROLE-NAME ISSUED-AT使用签发时间定位令牌,调用DeleteToken接口,并支持交互式确认([y/n]提示)。这也是--unixtime选项被设计为“方便管道进入 delete-token”的原因。

相关命令速查

该命令归属于argocd proj role命令族,完整参考见 docs/user-guide/commands/argocd_proj_role.md。与令牌管理直接相关的配套命令:

命令作用
argocd proj role create-token PROJECT ROLE-NAME为角色创建 JWT 令牌(支持--expires-in--id--token-only
argocd proj role list-tokens PROJECT ROLE-NAME列出角色的全部令牌(本文主角)
argocd proj role delete-token PROJECT ROLE-NAME ISSUED-AT按签发时间删除指定令牌(带交互确认)
argocd proj role get PROJECT ROLE-NAME查看角色详情,包括策略与 JWT 令牌列表(含相对时间提示)
argocd proj role list PROJECT列出项目下所有角色

使用建议与注意事项

  1. 定期审计Never令牌EXPIRES AT列为Never表示令牌永不过期,这类长期凭证安全风险较高,建议结合--unixtime输出与delete-token定期轮换;
  2. 脚本化清理的推荐姿势:先list-tokens --unixtime获取签发时间戳,再对目标令牌执行delete-tokendelete-token自带交互确认,脚本中可通过配置禁用提示或预先确认;
  3. 权限最小化:该命令需要projects资源的读取权限,自动化账号应遵循最小权限原则,仅授予所需项目和角色的访问范围;
  4. 时间显示受时区影响:RFC3339 格式输出包含时区偏移,跨团队协作时建议统一时区规范,或直接使用--unixtime消除歧义。

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 2:34:33

把小爱音箱接入 ChatGPT:MiGPT 语音助手 10 分钟部署教程

把小爱音箱接入 ChatGPT&#xff1a;MiGPT 语音助手 10 分钟部署教程 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt MiGPT 是一个把小米小爱音箱…

作者头像 李华
网站建设 2026/9/14 2:33:43

Obsidian多端同步难题破解:五大方案实测与选型指南

我在Obsidian上折腾同步已经有8年了&#xff0c;从最早的移动硬盘手动拷贝&#xff0c;到后来的各种插件、网盘、Git仓库&#xff0c;几乎把市面上能用的方案都试了一遍。写这篇东西的起因很简单&#xff1a;前几天帮我朋友从Notion迁到Obsidian&#xff0c;第一句话就问“多端…

作者头像 李华
网站建设 2026/9/14 2:30:13

IPC设备P2P技术与NAT穿透原理详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 2:29:29

superpowers技能包实战:为Codex CLI与Trae注入工程师级AI工作流

直接说结论&#xff1a;如果你在用 Codex CLI、Trae 这类 AI 编程工具&#xff0c;却总觉得 AI 像个“只会答不会做”的顾问&#xff0c;指一步才动一步&#xff0c;那 superpowers 就是冲着这个痛点来的。它不是某个具体插件&#xff0c;而是一套以 Markdown 文档为核心的技能…

作者头像 李华
网站建设 2026/9/14 2:28:39

LFM雷达脉冲压缩原理与MATLAB实现

简介&#xff1a;本资源是一套面向本科及硕士阶段雷达通信教学与科研的线性调频&#xff08;LFM&#xff09;脉冲压缩雷达仿真实践材料&#xff0c;基于Matlab 2019a平台实现&#xff0c;聚焦雷达信号处理核心环节——LFM信号生成、匹配滤波与脉冲压缩效果验证。资源共24个文件…

作者头像 李华