GitHub API: 获取组织中所有成员的电子邮件地址

17
GitHub API 提供了一种获取组织成员的方式。我是我的组织的管理员/所有者,我想获取所有用户的电子邮件地址。我尝试使用 members API,但它不返回电子邮件地址。
使用我的管理员 auth-token 和 curl:
GET /orgs/my-org/members

我得到的回复看起来像这样(对于其中一个用户):
"login": "auny",
    "id": some-number,
    "avatar_url": "https://secure.gravatar.com/avatar/6579d09c459f1adad8a60463f47eadd3?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png",
    "gravatar_id": "6579d09c459f1adad8a60463f47eadd3",
    "url": "https://api.github.com/users/auny",
    "html_url": "https://github.com/auny",
    "followers_url": "https://api.github.com/users/auny/followers",
    "following_url": "https://api.github.com/users/auny/following{/other_user}",
    "gists_url": "https://api.github.com/users/auny/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/auny/starred{/owner} 
     {/repo}",
    "subscriptions_url": "https://api.github.com/users/auny/subscriptions",
    "organizations_url": "https://api.github.com/users/auny/orgs",
    "repos_url": "https://api.github.com/users/auny/repos",
    "events_url": "https://api.github.com/users/auny/events{/privacy}",
    "received_events_url": 
    "https://api.github.com/users/auny/received_events",
    "type": "User"

奇怪的是,这里包含了关于用户的大量信息,但却没有用户的重要信息之一,即电子邮件地址。作为管理员,我应该能够获取所有用户的电子邮件地址。
另一个user API只返回我的自己的电子邮件地址,也就是在请求中使用的帐户的电子邮件地址。API用法:
GET /user/emails

这个怎么实现呢?有没有其他方法可以绕过它?

6个回答

11
使用GraphQL API v4,您无需为每个用户调用请求。以下内容将获取组织成员的电子邮件(如果在公共配置文件中提供):
{
  organization(login: "my-org") {
    membersWithRole(first: 100) {
      totalCount
      edges {
        node {
          login
          name
          email
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}
在浏览器中尝试 [编辑 08/2020]使用membersWithRole替代弃用的members字段

3
组织成员现在已经过时了,请使用memberStatuses。 - Kevin Alwell
您必须提供“first”或“last”值,以正确分页“forks”连接。 - Kermit
2
对于2023年的读者来说,“电子邮件”字段只会提供公共邮箱,而这个邮箱大部分时间都是空的。 - h1fra

4

你可以使用Git仓库代替!里面有很多有趣的信息。

尝试运行:

git shortlog -s -n -e

您将看到具有电子邮件地址的提交者列表。

3
这还不足以将电子邮件与GitHub用户名相关联。对于尚未提交到特定存储库的组织成员也不足够。 - wchargin

2
获取组织成员列表后,使用此 API 端点获取每个成员的信息:
/users/:user

这将返回您在请求URL中指定的用户的电子邮件地址。

5
该端点仅为某些用户返回email字段,而且该字段的值设置为null。然而,对于大多数用户来说,甚至没有email字段存在。这可能与用户配置其账户的方式有关。 - auny
1
关于告诉我的组织中的用户设置他们的电子邮件的建议是不可行的,因为我正在制作一个要分发的应用程序,我不能要求使用我的应用程序的组织的用户这样做。 - auny
1
Ivan,如果你是Github开发者,那么我想将此作为下一版本的功能请求进行提交。获取组织中所有用户的电子邮件地址对于该组织的管理员来说是一个重要的功能。 - auny
等等,这个答案只针对一个成员。原帖要求所有成员的答案。 - Kevin Suttle
2
我只想一次解决一个问题。但是,如果它不能为我的组织中的某个人返回电子邮件,那么这是荒谬的。Github已经不允许公司强制执行双重身份验证,这已经够糟糕了,但是试图审计和催促用户也是不可能的。这就像Github不希望企业保护其用户的Github帐户一样。 - seanieb
显示剩余5条评论

2
作为对此的补充,就像我刚才需要的那样,如果你需要超过100个结果(例如使用 gh 命令行选项 --paginate),可以将查询修改为:
query($endCursor: String) {
  organization(login: "LOGIN") {
    samlIdentityProvider {
      ssoUrl
      externalIdentities(first: 100, after: $endCursor) {
        pageInfo {
          hasNextPage
          endCursor
        }
        edges {
          node {
            guid
            samlIdentity {
              nameId
            }
            user {
              login
            }
          }
        }
      }
    }
  }
}

1

如果您正在这样做以获取身份提供者(IdP)使用的电子邮件,例如用于SAML,请参见{{link1:osowskit的答案}}。

下面是组织示例;但请参见上面的链接以获取更多信息和企业级身份验证示例:

query {
  organization(login: "LOGIN") {
    samlIdentityProvider {
      ssoUrl
      externalIdentities(first: 100) {
        edges {
          node {
            guid
            samlIdentity {
              nameId
            }
            user {
              login
            }
          }
        }
      }
    }
  }
}

0

有一些地方存储着电子邮件字段,根据您的访问级别,您可能能够列出它们。

  1. 公共电子邮件
  2. SAML身份(企业)
  3. 已验证域电子邮件(企业)
  4. 许可证分配(企业)

1. 公共电子邮件

如果用户已为其帐户配置了公共电子邮件并使其可发现,您可以使用以下查询在此处查询该公共电子邮件地址

gh api graphql --paginate -f query='{
  organization(login: "my-org") {
    membersWithRole(first: 100, after: $endCursor) {
      totalCount
      edges {
        node {
          login
          name
          email
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}'

2. SAML身份

如果您的组织启用了SAML SSO或OIDC-Connect,您可以通过以下查询来查询登录电子邮件地址:

gh api graphql --paginate -f query='query {
  organization(login: "YOUR_ORG") {
    samlIdentityProvider {
      ssoUrl
      externalIdentities(first: 100, after: $endCursor) {
        edges {
          node {
            guid
            samlIdentity {
              nameId
              emails {
                primary
                type
                value
              }
            }
            user {
              login
            }
          }
        }
      }
    }
  }
}

3. 已验证的域名电子邮件

如果您是GitHub组织的管理员,您可以通过以下查询访问与您已验证的域名匹配的电子邮件地址

gh api graphql --paginate -f query='query {
  organization(login: "YOUR_ORG") {
    membersWithRole (first: 100, after: $endCursor){
      edges {
          node {
            login
            organizationVerifiedDomainEmails(login: "YOUR_ORG")
          }
        }
    }
  }
}'

4. 许可证分配

您还可以请求您企业中所有被分配许可证的人员的详细信息

GET https://api.github.com/enterprises/{enterprise}/consumed-licenses

它还返回经过验证的域名电子邮件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接