GitHub个人访问令牌(PAT)创建与安全使用全指南
1. 为什么你需要一个个人访问令牌
如果你在命令行里用git push往 GitHub 推送代码时,突然弹出一个窗口让你输入用户名和密码,而你明明记得密码是对的,却死活登录不上去,那你大概率是遇到了 GitHub 在 2021 年 8 月 13 日之后实施的一项重大安全策略变更。简单来说,GitHub 不再支持使用账户密码(Password)通过 HTTPS 协议进行 Git 操作认证了。取而代之的,就是今天我们要详细拆解的主角——个人访问令牌。
这个令牌,英文叫 Personal Access Token,你可以把它理解为你账户的一个“专用钥匙”或者“临时工牌”。和你的主密码不同,这把钥匙的权限是你可以精细控制的。你可以只给它读取仓库代码的权限,也可以给它写入、删除仓库的权限,甚至可以给它管理组织、访问包仓库等高级权限。最关键的是,这把钥匙是“一次性”的(当然可以设置有效期),万一泄露了,你可以随时单独吊销这把钥匙,而无需修改你的主账户密码,其他用令牌访问的服务也不会受影响。
所以,无论你是需要在 CI/CD 流水线(如 GitHub Actions, Jenkins)中自动拉取推送代码,还是用脚本调用 GitHub API 管理你的项目,抑或是仅仅想在本地命令行里顺畅地使用 Git,创建并配置一个个人访问令牌都是你现在必须掌握的技能。这不仅是绕过密码认证限制的解决方案,更是一种更安全、更现代的凭证管理实践。
2. 令牌创建前的核心决策:权限与有效期
直接跳到创建步骤很简单,但如果不理解背后的选项,你可能会创建出一个权限过大或过小的令牌,埋下安全风险或导致后续操作失败。因此,在点击“Generate token”按钮之前,我们必须先搞清楚两个核心概念:作用域和有效期。
2.1 作用域:给你的令牌划定工作边界
作用域决定了这个令牌能干什么。GitHub 提供了非常细粒度的权限控制,主要分为以下几大类:
repo(仓库):这是最常用、最核心的权限。它下面又细分为:
repo:完全控制私有和公共仓库的代码、议题、拉取请求等。权限极大,请谨慎授予。public_repo:仅能访问公共仓库。repo:status:仅能访问仓库的提交状态(常用于CI系统报告构建状态)。repo_deployment:访问部署状态。repo:invite:接受仓库邀请。security_events:读写安全事件,用于代码扫描。
workflow(工作流):如果你使用 GitHub Actions,需要这个权限来启用、禁用工作流文件。
write:packages / read:packages(包管理):用于向 GitHub Packages 推送或拉取容器镜像、npm包等。
delete_repo(删除仓库):顾名思义,允许删除仓库。高危权限,非必要不勾选。
admin:org(管理组织):管理组织成员、团队等。通常用于自动化管理脚本。
user(用户):访问用户个人资料信息,如邮箱。
admin:public_key(管理公钥):管理账户的 SSH 密钥。
admin:gpg_key(管理GPG密钥):管理账户的 GPG 密钥。
实操心得:最小权限原则我的经验是,永远遵循“最小权限原则”。如果你只是需要在本地命令行推送代码到自己的私有仓库,那么只勾选repo就足够了。如果你为 CI/CD 流水线创建令牌,并且这个流水线只需要拉取代码和推送构建状态,那么repo(拉取代码) +repo:status(推送状态)可能是更安全的选择。绝对不要因为省事,就一股脑地勾选所有权限,这相当于给了小偷一把万能钥匙。
2.2 有效期:为令牌设置一个“保质期”
GitHub 允许你为令牌设置一个有效期,这是一个非常重要的安全特性。选项通常包括:
- 7天
- 30天
- 90天
- 自定义天数(最长不超过1年)
- 永不过期(不推荐)
为什么强烈不建议选择“永不过期”?令牌一旦泄露,就拥有了长期有效的访问权限。设置有效期相当于增加了一层时间防火墙。即使令牌不慎泄露,攻击者也只能在有效期内作恶。到期后令牌自动失效,你需要创建新的,这本身也是一次安全审计的机会。对于生产环境的自动化流程,我通常设置为90天,并建立一个日历提醒,在到期前一周进行轮换。对于临时性的脚本或测试,7天或30天就足够了。
3. 手把手创建你的第一个令牌
理解了核心概念后,我们进入实操环节。请跟随以下步骤,在 GitHub 上创建你的第一个个人访问令牌。
3.1 进入令牌创建页面
- 登录你的 GitHub 账户。
- 点击页面右上角的你的头像,在下拉菜单中选择“Settings”(设置)。
- 在左侧边栏的最底部,找到并点击“Developer settings”(开发者设置)。
- 在左侧边栏中,点击“Personal access tokens”(个人访问令牌)。
- 点击“Tokens (classic)”或直接点击“Generate new token”按钮下的“Generate new token (classic)”。目前 GitHub 推荐新的细粒度令牌,但经典令牌更通用,我们先从经典的开始。
3.2 填写令牌信息与配置权限
现在你会看到一个表单页面。
- Note(备注):这里非常重要!不要随便填个“test”。请用一个清晰的名字描述这个令牌的用途,例如:“My-MacBook-Pro-Git-CLI”、“Company-CI-Jenkins-Production”、“Script-Auto-Create-Repo”。未来当你拥有多个令牌时,清晰的备注能帮你快速识别和管理。
- Expiration(有效期):根据我们之前的讨论,选择一个合适的有效期。例如,用于个人电脑的可以选择“90天”。
- Select scopes(选择作用域):滚动权限列表,根据你的需求勾选。对于最常见的“本地Git推送拉取”场景,勾选“repo”这一个就够了。它会自动选中所有仓库相关的子权限。
- (可选)Repository access(仓库访问):如果你只想让令牌访问特定仓库,可以在这里选择。默认是“All repositories”。
3.3 生成并安全保存令牌
滚动到页面底部,点击绿色的“Generate token”按钮。
!关键时刻!页面刷新后,你会看到一个以ghp_开头的长字符串(新格式令牌以github_pat_开头)。这个令牌只会在此刻显示一次!如果你刷新或离开这个页面,就再也看不到它了。
你必须立即将其复制并保存到安全的地方。我推荐的做法是:
- 密码管理器:存入 1Password、Bitwarden、LastPass 等密码管理工具,这是最安全的方式。
- 本地加密文件:如果你不使用密码管理器,可以将其保存在本地一个加密的文本文件或使用
gpg加密。 - 绝对禁止:不要将其写入普通的文本文件,不要提交到 Git 仓库,不要通过明文邮件或聊天工具发送。
复制保存后,这个令牌就可以使用了。你可以在 “Personal access tokens” 列表页面看到它(但只能看到部分打码的字符),并可以随时在这里将其吊销。
4. 在 Git 命令行中使用令牌
创建好令牌后,我们需要用它来替代密码。Git 通过 HTTPS 协议克隆或推送时,用户名是你的 GitHub 用户名,密码就是这个令牌。
4.1 首次克隆仓库
当你克隆一个私有仓库时,在 URL 中直接嵌入令牌是最直接的方法(仅用于一次性操作或脚本)。
git clone https://ghp_你的令牌内容@github.com/你的用户名/仓库名.git例如:
git clone https://ghp_abc123def456@github.com/zhangsan/my-private-repo.git4.2 为现有仓库配置远程认证
对于已经克隆到本地的仓库,或者你不想在URL中暴露令牌,更推荐使用 Git 的凭证存储助手。
方法一:使用缓存(临时)
git config --global credential.helper cache # 可以设置缓存时间,默认900秒(15分钟),例如设置为1小时: git config --global credential.helper 'cache --timeout=3600'设置后,当你下一次执行git pull或git push时,会提示你输入用户名和密码(此处密码填令牌)。输入一次后,在缓存时间内就不再需要输入了。适合临时使用。
方法二:使用系统存储(长期)这是更常用的方式,令牌会安全地存储在系统的密钥链中。
- macOS:
git config --global credential.helper osxkeychain - Linux:
git config --global credential.helper libsecret # 或 gnome-keyring, cache, store - Windows:
git config --global credential.helper wincred
配置好后,执行一次需要认证的操作(如git push),在弹出的窗口或命令行中,用户名填你的 GitHub 用户名,密码填刚才生成的个人访问令牌。之后系统就会记住这个凭证。
方法三:在远程 URL 中永久配置(不推荐但需了解)你也可以直接修改远程仓库的 URL,将令牌写进去。但这样做令牌会以明文形式出现在.git/config文件中。
git remote set-url origin https://ghp_你的令牌内容@github.com/你的用户名/仓库名.git踩坑实录:认证失败的常见原因
- 用户名错误:密码/令牌栏填对了,但用户名栏填的是邮箱地址或其他内容。请确保用户名是你的 GitHub 登录用户名(通常不含邮箱域名)。
- 令牌权限不足:如果你只勾选了
public_repo,却试图推送私有仓库,就会失败。检查令牌的作用域。 - 令牌已过期:创建时设置了有效期,到期后令牌自动失效。去 GitHub 设置页面检查令牌状态,并创建新的。
- 凭证助手冲突:如果你之前用其他方式存储了错误的密码,系统可能会一直尝试旧的错误凭证。可以尝试清除缓存:
然后在执行操作时重新输入。# 对于 cache git credential-cache exit # 或直接删除全局配置,重新设置 git config --global --unset credential.helper
5. 在自动化脚本与 CI/CD 中安全使用令牌
在自动化环境中,我们无法进行交互式输入,因此需要将令牌以环境变量或配置文件的形式提供给脚本或 CI/CD 平台。核心原则是:绝对不要将令牌硬编码在脚本或代码仓库中。
5.1 环境变量法(推荐)
在运行脚本的机器上,将令牌设置为环境变量。
# Linux/macOS export GITHUB_TOKEN="ghp_你的令牌内容" # 然后你的脚本或命令可以通过 $GITHUB_TOKEN 引用它 # 例如,使用 curl 调用 API curl -H "Authorization: token $GITHUB_TOKEN" https://api.github.com/user# Windows (PowerShell) $env:GITHUB_TOKEN="ghp_你的令牌内容" # 在同一个 PowerShell 会话中生效5.2 在 CI/CD 平台中配置(以 GitHub Actions 为例)
GitHub Actions 提供了最安全的方式来使用令牌。
使用内置的
GITHUB_TOKEN:在每个 GitHub Actions 工作流运行时,都会自动生成一个临时的GITHUB_TOKEN密钥,并拥有当前仓库的默认权限。你无需自己创建,可以直接在 YAML 文件中使用${{ secrets.GITHUB_TOKEN }}。这是最安全、最推荐的方式,因为它自动拥有最小权限且生命周期短暂。jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: token: ${{ secrets.GITHUB_TOKEN }}使用自定义仓库密钥:如果你需要跨仓库访问,或者需要
GITHUB_TOKEN不具备的权限(如访问其他仓库、管理组织),则需要将自己创建的个人访问令牌添加到仓库的密钥中。- 进入你的 GitHub 仓库。
- 点击“Settings”->“Secrets and variables”->“Actions”。
- 点击“New repository secret”。
- Name 填写为
MY_PAT(或其他你喜欢的名字)。 - Value 粘贴你的个人访问令牌。
- 在工作流文件中,通过
${{ secrets.MY_PAT }}来引用它。
env: MY_TOKEN: ${{ secrets.MY_PAT }} steps: - run: | echo "Using token for API call" curl -H "Authorization: token $MY_TOKEN" https://api.github.com/user/repos
注意事项:CI/CD 中的令牌安全
- 永远不要
echo或print令牌:即使在 CI/CD 的日志中,也要避免直接输出令牌内容。大多数平台会自动屏蔽以secret.方式引用的变量输出,但自己仍需小心。 - 使用最小权限令牌:为 CI/CD 创建的令牌,权限应精确到所需的最小范围。如果只是拉取代码,可能连
repo的写权限都不需要,可以考虑更细的权限或使用actions/checkout等官方 Action。 - 定期轮换:为 CI/CD 设置的令牌也应设置有效期,并建立流程定期更新仓库密钥中的值。
6. 令牌的进阶管理与安全实践
创建和使用令牌只是第一步,良好的管理习惯才能确保长期的安全。
6.1 令牌的日常管理
回到 GitHub 的“Settings” -> “Developer settings” -> “Personal access tokens”页面,这里是你管理所有令牌的控制台。
- 查看与识别:你可以看到所有活跃的令牌列表,包括备注名、权限范围、上次使用时间和过期时间。清晰的备注名至关重要。
- 吊销令牌:如果某个令牌泄露或不再需要,立即点击对应的“Revoke”按钮。这是令牌相比密码的最大优势——定点清除,不影响其他服务。
- 权限复审:定期(例如每季度)回顾令牌列表,检查每个令牌是否还有存在的必要,其权限是否仍然合适。
6.2 启用双因素认证提升账户安全
个人访问令牌是认证的一种方式,而保护生成令牌的源头——你的 GitHub 账户——同样重要。强烈建议为你的 GitHub 账户启用双因素认证。
启用 2FA 后,即使你的密码泄露,攻击者没有你的第二因素(如手机验证码、安全密钥)也无法登录,从而无法创建新的令牌或管理现有令牌。这为你的账户增加了一道坚固的防线。你可以在“Settings” -> “Password and authentication”中设置 2FA。
6.3 令牌泄露的应急处理
如果你怀疑或确认某个令牌已经泄露(例如发现未知的仓库操作、API调用),请立即执行以下步骤:
- 立即吊销泄露的令牌:在令牌管理页面找到它并点击“Revoke”。这会立即使该令牌失效,所有使用该令牌的客户端和服务将立即失去访问权限。
- 审查日志:在“Settings” -> “Security” -> “Security log”中,查看账户的完整活动日志。筛选相关时间段的操作,确认是否有未授权的活动。
- 轮换相关凭证:如果该令牌用于 CI/CD 或其他重要服务,在吊销旧令牌后,需要立即创建新令牌,并更新所有使用该令牌的服务配置。
- 评估影响:根据令牌的权限范围,检查是否有仓库被恶意修改、是否有敏感信息被窃取、是否有未知的部署或包发布。必要时回滚代码或数据。
7. 经典令牌与细粒度令牌的选择
在创建令牌时,你可能注意到了 GitHub 在推广新的“细粒度个人访问令牌”。这里简单对比一下,帮助你做选择:
| 特性 | 经典个人访问令牌 | 细粒度个人访问令牌 |
|---|---|---|
| 权限模型 | 粗粒度,基于预定义的作用域(如repo,admin:org)。一个作用域内权限全有或全无。 | 极细粒度,可以精确到单个仓库的读/写权限,甚至仓库内特定区域(如议题、拉取请求)。 |
| 资源访问 | 通常可以访问用户有权访问的所有资源(如所有仓库)。 | 创建时必须指定可以访问的特定仓库或所有仓库,权限在资源上也是细分的。 |
| 有效期 | 最长1年,或永不过期。 | 最长1年,不能设置为永不过期。 |
| 适用场景 | 通用场景,需要访问多个仓库或宽泛权限的自动化脚本、命令行工具。 | 对安全性要求极高的场景,需要将权限限制在特定仓库和特定操作,例如只为某个第三方应用授权访问单个仓库的议题。 |
| 当前状态 | 仍可使用,但 GitHub 可能会在未来停止支持。 | GitHub 推荐使用,代表更现代的、更安全的权限管理方向。 |
个人建议:
- 对于个人在命令行中使用,或者需要宽泛权限的自动化脚本(例如管理自己所有仓库的脚本),经典令牌目前更简单直接。
- 对于授予第三方应用集成,或者CI/CD 中需要访问特定仓库的场景,强烈建议使用细粒度令牌。它能实现最小权限原则的极致,大幅降低安全风险。
- 长远来看,逐渐迁移到细粒度令牌是更佳实践。创建细粒度令牌的流程类似,只是在权限选择界面变成了可逐项展开的、按仓库和权限类型勾选的树状结构,更加直观。
创建和管理个人访问令牌,从最初的“绕过密码认证的权宜之计”,已经演变为现代开发工作流中不可或缺的安全凭证管理环节。理解其原理,谨慎分配权限,妥善保管并定期审计,这些习惯能让你的自动化流程既高效又稳固。下次当你的git push遇到认证问题时,你应该能从容地打开 GitHub 设置页面,生成一把合适的“钥匙”,并知道如何安全地使用它了。
