如何获取允许用户访问的存储库的完整列表?

Posted

技术标签:

【中文标题】如何获取允许用户访问的存储库的完整列表?【英文标题】:How to get a full list of repositories that a user is allowed to access? 【发布时间】:2014-06-22 20:01:39 【问题描述】:

我找到了类似的 bitbucket api:

https://bitbucket.org/api/2.0/repositories/teamname

但是这个链接返回 301 状态(永久移动到!api/2.0/repositories/teamname)。

好的,但是这个返回状态 200,存储库为零。

我提供了两个参数userpassword,但似乎没有任何改变。

那么,任何人都可以回答如何获取允许特定用户使用的私有存储库的完整列表吗?

【问题讨论】:

我的第一个端点works just fine。请记住,您需要进行身份验证才能查看私有存储库,并且您必须是该团队的成员并且至少具有对存储库的读取权限。 感觉bitbuket API太烂了,没人知道怎么用。 【参考方案1】:

以上答案都不适合我,所以这就是我所做的。我们将使用 Bitbucket REST API。

认证

您不能使用您的正常凭据。我创建了一个 API 密码。我不知道如何通过您的浏览器访问此页面,但请访问:https://bitbucket.org/account/settings/app-passwords/

创建一个应用密码,然后剪切并保存 Atlassian 为您生成的密码。

卷曲

curl --user your_username:your_app_password https://api.bitbucket.org/2.0/repositories/your_workspace?pagelen=100

我将它传送到 jq 并将其保存到一个文件中。

your_workspace 您可以通过查看任何存储库的 URL 获得。

分页

最大 pagelen 似乎是 100。如果您有超过 100 个 repos,那么您可能必须这样做:

curl --user your_username:your_app_password https://api.bitbucket.org/2.0/repositories/your_workspace?pagelen=100&page=2

JSON

JSON 还不错。您想要“值”数组。从那里,查看 links.clone,它可能有两个类似这样的条目:

    "clone": [
      
        "href": "https://user@bitbucket.org/WORKSPACE/REPO.git",
        "name": "https"
      ,
      
        "href": "git@bitbucket.org:WORKSPACE/REPO.git",
        "name": "ssh"
      
    ],

这是我的结果中的剪切和粘贴,个人信息已更改。另外两个字段也很有用:

  "full_name": "WORKSPACE/repo",
  "name": "Repo",

【讨论】:

【参考方案2】:

扩展blizzard's answer,这是我刚刚写的一个node.js小脚本:

import axios from 'axios';
import fs from 'fs';


async function main() 
    const bitbucket = axios.create(
        baseURL: 'https://api.bitbucket.org/2.0',
        auth: 
            username: process.env.BITBUCKET_USERNAME!,
            password: process.env.BITBUCKET_PASSWORD!,
        
    );

    const repos = [];
    let next = 'repositories?role=member';

    for(;;) 
        console.log(`Fetching $next`)
        const res = await bitbucket.get(next);
        if(res.status < 200 || res.status >= 300) 
            console.error(res);
            return 1;
        
        repos.push(...res.data.values);
        if(!res.data.next) break;
        next = res.data.next;
    
    console.log(`Done; writing file`);
    await fs.promises.writeFile(`$__dirname/../data/repos.json`,JSON.stringify(repos,null,2),encoding:'utf8');



main().catch(err => 
    console.error(err);
);

【讨论】:

【参考方案3】:

不幸的是,根据我在文档中看到的内容,无法列出用户有权访问的所有私有存储库。

GET https://api.bitbucket.org/2.0/repositories

“返回所有公共存储库的分页列表。”根据the doco.

GET https://api.bitbucket.org/2.0/repositories/owner

“返回指定帐户或 UUID 拥有的所有存储库的分页列表。”根据the doco.

因此,获取所有私有存储库不一定由用户拥有要么是不可能的,要么我没有找到正确的端点,或者文档不准确。

【讨论】:

【参考方案4】:

Atlassian 文档 - Repositories Endpoint 提供了有关如何访问存储库的详细文档。

bitbucket 中提到的用于获取帐户的存储库列表的 URL 是:

GET https://api.bitbucket.org/2.0/repositories/owner

如果您使用上述 URL,它始终会检索您作为所有者的存储库。为了检索用户所属的存储库的完整列表,您应该调用:

GET https://api.bitbucket.org/2.0/repositories?role=member

您可以根据需要为角色应用以下一组过滤器。

要限制返回的存储库集,请应用 role=[owner|admin|contributor|member] 参数,其中角色是:

owner:返回当前用户拥有的所有仓库。 admin:返回用户显式访问的存储库 管理员权限。 贡献者:返回用户具有明确写入权限的存储库。 member:返回用户已明确读取的存储库 访问。

Edit-1:您可以使用Bitbucket REST browser 来测试请求/响应。(已停产)

【讨论】:

OP(我死后)想要这个信息与特定用户而不是当前用户相关。此功能似乎在 v1 API as the privileges endpoint 中可用,但在 v2 doesn't appear to have same endpoint 中可用。 @user771555 v2 API 不能完全替代 v1。如果 v2 API 没有端点 - 并且功能尚未移动到完全不同的端点 - 您可以继续使用 v1 API 端点。例如,在撰写本文时,“特权”端点仍然只存在于 v1 API 中 api.bitbucket.org/1.0/privileges 并且没有 v2 实现,但 v1 端点功能没有问题。 (另外,你死了吗?re:postthumously) LIk to API 2.0 reference for repositories developer.atlassian.com/bitbucket/api/2/reference/resource/… 他们的文档中没有提到基本 URL 是 https://api.bitbucket.org,这非常愚蠢。 这里有分页,有没有办法在一个GET请求中获取所有页面?【参考方案5】:

您不应使用来自 https://bitbucket.org/api 域的 API。

您应该始终使用https://api.bitbucket.org。

现在,您在执行重定向后可能会得到空结果的一个原因可能是因为某些 http 客户端仅在服务器通过返回带有 WWW-Authenticate 响应标头的 401 响应明确要求它们时才发送基本身份验证凭据。

存储库端点不需要身份验证。它只会返回匿名用户可见的存储库(在您的情况下可能是一个空集),因此坚持WWW-Authenticate 挑战的客户端(有很多,包括Microsoft Powershell)将无法按预期工作(请注意,curl 总是急切地发送基本身份验证凭据,这使它成为一个很好的测试工具。

【讨论】:

以上是关于如何获取允许用户访问的存储库的完整列表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 3 访问 JSON 中的值

如何授予用户级别访问私有 GitLab 存储库的权限?

如何使用 Docker Registry HTTP API V2 获取 docker 注册表中所有存储库的列表?

从 Widget 端获取 BuildFire 插件用户列表

如何在 WPF 应用程序中实现基于角色的菜单访问列表

如何允许 cognito 身份验证的用户获得对 s3 存储桶的公共访问权限