Merge Request API授权失败求助:账号密码与令牌均遭登录重定向
问题描述
尝试按官方文档获取仓库Merge Request时,遇到两类鉴权问题:
- 使用账号密码发起GET请求,凭证未被识别,直接返回登录页面;
- 创建个人访问令牌后执行curl命令,仍被重定向到登录页。
需求目标:通过API自动生成报告,统计每周开放/关闭的MR数量、创建者及评论者等详情。
测试用curl命令:
curl --header "PRIVATE-TOKEN: mQ7cszUHymhyEze9Y8BC" --header "Sudo: dka07" "https://myrepo/-/merge_requests"
收到的响应:
<html><body>You are being <a href="https://mygitlab/users/sign_in">redirected</a>.</body></html>
排查与解决步骤
修正API端点路径
GitLab的Merge Request API端点格式应为https://<gitlab实例地址>/api/v4/projects/<项目标识>/merge_requests,而非/-/merge_requests(这是Web界面路径,不是API接口)。其中<项目标识>可以是项目的数字ID,也可以是编码后的项目路径(如namespace%2Fproject-name)。验证令牌权限
创建个人访问令牌时,必须勾选至少read_api权限(如需修改操作则选api权限),确保令牌拥有访问Merge Request数据的权限,可在GitLab个人设置的「访问令牌」页面核对权限配置。检查Sudo头的使用条件
Sudo请求头仅允许管理员用户的令牌使用,用于模拟其他用户操作。若你不是管理员或无需模拟操作,需移除该头,直接使用自身令牌发起请求。确认实例地址有效性
确保请求的域名https://myrepo是正确的GitLab实例地址,避免拼写错误或使用了Web界面的子路径而非API根路径。测试基础鉴权有效性
先简化命令验证鉴权是否正常,比如请求当前用户信息:curl --header "PRIVATE-TOKEN: mQ7cszUHymhyEze9Y8BC" "https://<gitlab实例地址>/api/v4/user"若返回用户信息,说明鉴权正常,再调整到Merge Request的API端点;若仍被重定向,可能是实例存在额外身份验证拦截(如SSO、反向代理规则),需联系管理员确认API访问权限配置。
账号密码鉴权的替代方式
GitLab API不推荐直接用账号密码请求,若必须使用,需采用HTTP基本认证:curl --user "用户名:密码" "https://<gitlab实例地址>/api/v4/projects/<项目标识>/merge_requests"注意部分GitLab实例可能禁用密码直接访问API,优先使用个人访问令牌方式。
内容的提问来源于stack exchange,提问作者Raady

