如何通过Shell完成GitLab认证获取临时访问令牌
GitLab 轻量临时Token获取实现方案
针对不想手动创建Personal Access Token/Project Access Token、不想部署常驻Web服务承接OAuth回调的脚本场景,有两个可直接落地的实现方案,按推荐优先级排序:
方案1:OAuth设备授权流(最推荐,零Web服务依赖)
GitLab原生支持OAuth 2.0设备授权流,专门为CLI、嵌入式终端这类无法接收HTTP重定向的场景设计,完全不需要启动Web服务,实现逻辑如下:
- 提前在GitLab实例注册一个公共类型的OAuth应用,授权范围按需勾选
api/read_api即可,不需要配置回调地址,拿到Client ID后可以直接硬编码在脚本中,不需要存储Client Secret - 脚本运行时先向GitLab设备授权接口发起请求,拿到
device_code、用户授权码、验证页面地址 - 脚本直接在终端打印验证地址和用户授权码,提示用户手动打开链接、输入屏幕上显示的授权码、点击确认授权即可
- 脚本按固定间隔轮询GitLab的Token接口,用户完成授权后会直接返回临时
access_token,脚本拿到Token即可直接调用GitLab API,Token默认有过期时间,用完不需要手动回收
极简实现示例:
# 替换为你的GitLab实例地址、提前注册的OAuth应用Client ID GITLAB_HOST="https://gitlab.com" CLIENT_ID="替换为你的OAuth应用Client ID" # 申请设备授权码 resp=$(curl -s -X POST "${GITLAB_HOST}/oauth/authorize_device" \ -d "client_id=${CLIENT_ID}&scope=api") device_code=$(echo "$resp" | awk -F'"' '/"device_code"/{print $4}') user_code=$(echo "$resp" | awk -F'"' '/"user_code"/{print $4}') verify_url=$(echo "$resp" | awk -F'"' '/"verification_uri"/{print $4}') poll_interval=$(echo "$resp" | awk -F':' '/"interval"/{print $2}' | tr -dc '0-9') echo "请打开链接:$verify_url" echo "输入授权码:$user_code 完成授权" # 轮询获取临时Token while true; do sleep "$poll_interval" token_resp=$(curl -s -X POST "${GITLAB_HOST}/oauth/token" \ -d "client_id=${CLIENT_ID}&grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${device_code}") if echo "$token_resp" | grep -q '"access_token"'; then access_token=$(echo "$token_resp" | awk -F'"' '/"access_token"/{print $4}') echo "临时Token获取成功:$access_token" break fi done
这个方案的用户操作路径只有3步,比手动创建PAT少70%以上的点击操作,兼容性最好。
方案2:本地临时一次性回调服务(适配旧版GitLab实例)
如果你的GitLab实例版本过低、不支持设备授权流,可以在脚本里内置一个生命周期极短的本地HTTP服务,不需要部署常驻服务:
- 脚本启动时自动扫描本地空闲端口,构造回调地址为
http://127.0.0.1:空闲端口 - 自动唤起系统默认浏览器打开GitLab OAuth授权页
- 临时在本地回环地址的空闲端口启动HTTP监听,只等待授权回调请求
- 用户在浏览器点击授权后,GitLab会重定向到本地回调地址,脚本直接从请求参数中提取授权码,换取临时access_token后立刻关闭本地监听服务,整个服务运行时长通常不超过1分钟
注意:本地监听必须绑定127.0.0.1回环地址,不要绑定0.0.0.0等公网可访问地址,避免Token被窃听。
避坑提醒
- 不要尝试模拟账号密码登录爬取Cookie:GitLab默认开启CSRF校验,多数实例会配置二次验证、反爬策略,不同版本页面结构差异大,脚本维护成本极高,稳定性极差
- 不要在脚本中硬编码长期Access Token,既不符合安全规范,也会因为Token过期、权限变更导致脚本频繁失效
内容的提问来源于stack exchange,提问作者Robert Cutajar
相关产品推荐
相关产品推荐

