十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cargo Login 命令完全指南:注册表令牌的保存、读取与凭据提供器机制

Cargo Login 命令完全指南:注册表令牌的保存、读取与凭据提供器机制 Cargo Login 命令完全指南注册表令牌的保存、读取与凭据提供器机制【免费下载链接】cargoThe Rust package manager项目地址: https://gitcode.com/gh_mirrors/car/cargo导读cargo login是 CargoThe Rust package manager中用于登录注册表registry并将访问令牌保存到本地的核心命令。它本身并不直接调用任何网络 API而是通过凭据提供器credential provider机制完成令牌的获取、校验与持久化从而让后续需要认证的命令如cargo publish自动携带令牌。本文以 cargo-login.md 手册为主体结合本仓库中该命令的命令行入口、核心执行逻辑、凭据存储实现与测试用例完整讲解cargo login的语法、选项、凭据提供器选择顺序、凭据文件格式及安全注意事项使读者既能开箱即用地完成登录操作也能深入理解其底层原理。命令概览语法与用途SYNOPSIScargo login [options] [-- args]其中cargo login本体用于登录默认注册表即 crates.io 或由registry.default指定的注册表--registry name用于指定目标注册表--之后的所有参数会原样传递给凭据提供器credential provider供自定义凭据提供器使用。它的作用是什么根据手册doc/book/src/commands/cargo-login.md的说明cargo login会运行一个凭据提供器来保存令牌使得需要认证的命令——例如 cargo-publish(1)——能够被自动认证无需每次手动输入令牌。值得强调的是从源码注释可以确认这一点This doesnt really call any web API at this moment. Instead, its just an operation forcargo login.src/ops/registry/cargo_login.rs也就是说cargo login并不是一次登录网络请求而是一次本地凭据保存操作它把令牌交给凭据提供器处理后写入本地存储供后续命令读取。令牌从哪来默认从标准输入stdin读取。手册明确说明The token will be read from stdin.crates.io 的 API 令牌可以在https://crates.io/me页面获取。令牌属于敏感信息should not be shared with anyone else请务必妥善保管。完整选项详解Login Options登录选项选项说明--registry registry指定要登录的注册表名称。注册表名称在 Cargo 配置文件 中定义即[registries]表下的键。若未指定则使用默认注册表其由配置键registry.default决定默认值为crates-io。从命令行入口源码src/bin/cargo/commands/login.rs可以看到--registry解析出的值还会经过args.registry_or_index(gctx)处理并断言不能是 index URL 形式let reg args.registry_or_index(gctx)?; assert!( !matches!(reg, Some(RegistryOrIndex::Index(..))), must not be index URL );这说明cargo login只接受注册表名称不接受直接传入 index URL。Display Options显示选项选项说明-v/--verbose使用详细输出可重复指定两次得到非常详细的输出包含依赖警告和构建脚本输出等额外信息。也可通过配置值term.verbose设置。-q/--quiet不打印 cargo 日志消息。也可通过配置值term.quiet设置。--color when控制彩色输出时机可选值为auto默认自动检测终端是否支持颜色、always始终显示颜色、never从不显示颜色。也可通过配置值term.color设置。Common Options通用选项选项说明toolchain如果 Cargo 是通过 rustup 安装的且第一个参数以开头则会被解释为 rustup 工具链名称如stable、nightly。工具链覆盖机制详见 rustup 文档。--config KEYVALUE 或 PATH覆盖一个 Cargo 配置值。参数可以是KEYVALUE形式的 TOML 语法也可以是某个额外配置文件的路径该标志可多次指定。详见 命令行覆盖配置。-C PATH在执行任何操作前切换当前工作目录。会影响 cargo 默认查找项目清单Cargo.toml的位置以及发现.cargo/config.toml的目录搜索范围。该选项必须出现在命令名之前例如cargo -C path/to/my-project build。此选项仅限 nightly 通道需要-Z unstable-options标志启用。-h/--help打印帮助信息。-Z flagCargo 的不稳定仅 nightly标志运行cargo -Z help查看详情。凭据提供器cargo login的核心机制cargo login之所以能支持多种凭据来源内置明文令牌、外部凭据进程、1Password 等全部得益于 Cargo 的**凭据提供器credential provider**架构。凭据提供器的选择顺序手册给出了明确的优先级规则doc/book/src/commands/cargo-login.md如果目标注册表配置了专属的credential-provider则使用该提供器否则从配置值registry.global-credential-providers中按从列表末尾开始的顺序依次尝试即列表越靠前的优先级越高因为遍历是rev()的。该逻辑在 src/util/auth/mod.rs 中实现若注册表存在credential_provider配置则直接使用否则读取registry.global-credential-providers为空时回退到内置默认[cargo:token]并通过rev()反向遍历、按优先级逐个尝试。此外代码还处理了几种边界情况注册表配置了token但未在global-credential-providers中列出cargo:token时会发出警告说明该 token 将被忽略注册表配置了非cargo:token的提供器且同时存在 token 时警告 token 会被忽略。内置提供器与外部提供器本仓库src/util/credential/目录下包含token.rs内置的cargo:token提供器处理明文令牌的Get/Login/Logout三种动作process.rs外部凭据进程提供器通过 JSON 协议与外部进程通信启动进程时传入--cargo-plugin参数先读取CredentialHello握手消息再发送CredentialRequest最后读取CredentialResponseadaptor.rs 与 mod.rs提供器适配与模块组织。对于默认的cargo:token提供器Login动作src/util/credential/token.rs会通过cargo_credential::read_token从输入读取令牌自动移除令牌文本中的cargo login字样——这是为了允许用户直接从注册表网站如 crates.io/me复制整行包含cargo login的指令直接粘贴调用crates_io::check_token对令牌做基础校验调用context::save_credentials将令牌写入凭据文件打印Login状态消息如token forcrates-iosaved。凭据文件token 保存在哪里手册指出对于默认的cargo:token凭据提供器令牌保存在$CARGO_HOME/credentials.tomlCARGO_HOME默认为主目录下的.cargo目录即~/.cargo/credentials.toml。实际的保存逻辑在 src/context/mod.rs 的save_credentials函数中要点如下若$CARGO_HOME下已存在旧文件credentials无扩展名则继续写入该文件以保持向后兼容否则写入credentials.tomlsrc/context/mod.rs登录 crates.io 时令牌写入顶层[registry]表[registry] token your-token登录其他注册表时令牌写入[registries.name]表[registries.my-registry] token your-token写入时使用排他独占打开文件并在 Unix 上将该文件权限设置为0o600仅所有者可读写见 src/context/mod.rs 与 src/context/mod.rs如果旧配置中存在顶层token字段会将其迁移到[registry]表下src/context/mod.rs。安全提示credentials.toml是明文文件务必保护其读写权限也不要将该文件提交到任何代码仓库或分享给他人。令牌的读取流程命令行、stdin 与交互提示cargo login接收令牌的完整流程位于 src/ops/registry/cargo_login.rslet mut token_from_stdin None; let token token_from_cmdline.or_else(|| { if !std::io::stdin().is_terminal() { let token cargo_credential::read_line().unwrap_or_default(); if !token.is_empty() { token_from_stdin Some(token); } } token_from_stdin.as_deref().map(Secret::from) });即优先级为命令行令牌 stdin 令牌且只有当 stdin 不是终端即输入来自管道或重定向时才尝试从 stdin 读取。随后构造LoginOptions包含可选的login_url调用auth::login触发Action::Login。关于login_url源码会尝试通过registry(...)构建登录页地址默认{registry_host}/me当注册表返回AuthorizationError且携带login_url时则使用该地址src/ops/registry/cargo_login.rs。另外虽然命令行入口支持隐藏的token位置参数src/bin/cargo/commands/login.rs但源码会在检测到该用法时输出弃用警告cargo login token is deprecated in favor of reading token from stdinsrc/bin/cargo/commands/login.rs——因此推荐的做法是把令牌通过 stdin 传入而非直接写在命令行参数中。环境变量与退出状态ENVIRONMENTcargo login的行为同样受 Cargo 读取的各种环境变量影响例如CARGO_HOME决定凭据文件的位置。完整的环境变量清单参见 环境变量参考。EXIT STATUS状态码含义0Cargo 成功完成。101Cargo 执行失败。实战示例1. 为默认注册表保存令牌cargo login随后将令牌粘贴到终端从 stdin 输入并回车。令牌将被保存到~/.cargo/credentials.toml的[registry]表。也可以使用管道方式避免手工粘贴echo your-token | cargo login2. 为指定注册表保存令牌cargo login --registry my-registry该命令会读取registry.default之外的、由配置文件中[registries]定义的my-registry并把令牌写入[registries.my-registry] token your-token在自定义注册表如私有镜像仓库发布包时配合cargo publish --registry my-registry使用即可自动认证。3. 向凭据提供器传递附加参数cargo login -- --extra-flag value--之后的内容会原样传给凭据提供器如自定义的外部凭据进程由提供器自行解释。4. 使用自定义凭据提供器通过配置registry.global-credential-providers可启用其他提供器例如[registry] global-credential-providers [cargo:token, cargo:1password]cargo login会从列表末尾开始依次尝试。仓库的凭据目录 credential/ 中提供了cargo-credential-1password、cargo-credential-libsecret、cargo-credential-macos-keychain、cargo-credential-wincred等现成的凭据提供器实现可作为编写自定义提供器的参考。源码与测试验证为了让读者进一步验证上述行为下面给出仓库中可直接查阅的相关实现与测试命令入口src/bin/cargo/commands/login.rs —— 解析--registry、隐藏 token 参数、--附加参数并输出弃用警告核心逻辑src/ops/registry/cargo_login.rs —— 令牌读取命令行/stdin与auth::login调用提供器选择src/util/auth/mod.rs —— 注册表专属 provider 与global-credential-providers的优先级逻辑内置 token 提供器src/util/credential/token.rs ——Get/Login/Logout动作与cargo login字样自动剔除外部进程提供器src/util/credential/process.rs —— 基于 JSON 的进程间凭据协议凭据文件读写src/context/mod.rs ——credentials.toml的写入、迁移与0o600权限设置相关测试tests/testsuite/login.rs 中的login_with_no_cargo_dir、login_with_differently_sized_token、login_with_token_on_stdin、default_registry_configured等用例验证了无 Cargo 目录时登录、不同长度令牌、从 stdin 读取令牌以及registry.default生效等场景tests/testsuite/credential_process.rs 中的login与login_token_from_stdin用例验证了自定义凭据提供器下的登录以及 stdin 令牌含换行去除的传递过程。安全注意事项与小结令牌等同于你在注册表上的发布权限凭证切勿与任何人共享也不要写入会被版本控制系统追踪的文件默认cargo:token提供器将令牌以明文保存在$CARGO_HOME/credentials.toml权限为0600如需更高安全等级可改用cargo:1password、libsecret 等加密凭据提供器推荐通过 stdin 或管道输入令牌避免在 shell 历史中残留cargo login token形式的敏感命令该用法已被标记为 deprecated若令牌泄露请立即到注册表网站crates.io 对应https://crates.io/me吊销并重新生成令牌。掌握cargo login的凭据提供器机制与凭据文件结构即可安全、高效地管理 crates.io 与私有注册表的发布认证。配合 cargo-logout(1) 移除本地令牌、cargo-publish(1) 发布包即可构成完整的注册表发布工作流。【免费下载链接】cargoThe Rust package manager项目地址: https://gitcode.com/gh_mirrors/car/cargo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表