如何借助带OAuth功能的GitHub App访问用户私有仓库?
以下是你可能遗漏的几个关键环节:
检查GitHub App的权限配置
得给你的GitHub App配置好仓库内容的读取权限(Repository permissions > Contents),并且把权限的访问范围设为Private。如果权限只设成Public,自然只能拿到公开仓库的权限。另外还要确认在「User authorization flow permissions」里勾选了仓库相关权限,这样用户授权时才会看到对应的权限申请,只有用户同意了,App才能拿到私有仓库的访问权。确认OAuth授权的Scope参数
用授权码兑换用户访问令牌的时候,必须指定正确的scope参数。要访问私有仓库,核心是要带上repo这个scope(如果需要全仓库权限),或者更细分的权限scope,但repo是获取私有仓库访问权的关键。如果请求令牌时没加这个scope,那拿到的令牌就没有访问私有仓库的权限。
举个请求示例:POST https://github.com/login/oauth/access_token client_id=你的App客户端ID client_secret=你的App客户端密钥 code=你拿到的授权码 redirect_uri=你的回调地址 scope=repo区分Installation令牌和用户访问令牌的使用场景
- Installation令牌是用来代表GitHub App在某个安装实例(比如用户账号或组织)下操作的,需要用installation_id兑换。但要注意:如果用户只是授权了你的App,却没把App安装到自己的账号下(或者安装时没选择包含私有仓库),那这个令牌也访问不了私有仓库。
- 用户访问令牌是通过OAuth授权码兑换的,它的权限由你指定的scope和用户的授权决定,必须确保scope包含
repo,且用户授权时同意了访问私有仓库的请求。
检查App的安装范围
如果你的App是安装在组织下,要确认安装时选的是「所有仓库」还是「指定仓库」,要是选了指定仓库,那不在范围内的私有仓库就访问不了。如果是用户个人账号,要确认安装时是否允许App访问个人私有仓库。验证令牌的实际权限
你可以调用GitHub的GET /user接口,带上你拿到的令牌,看返回结果里的scope字段有没有包含repo。如果没有,说明兑换令牌时的scope参数有问题,得重新发起授权请求,确保带上正确的scope。
内容的提问来源于stack exchange,提问作者Daniel Stephens

