跳至主要内容

为用户发现资源

了解如何在对 REST API 进行已认证请求时,以可靠的方式查找应用程序可以为用户访问的仓库和组织。

在对 GitHub API 进行已认证请求时,应用程序通常需要获取当前用户的仓库和组织。本文档将说明如何可靠地发现这些资源。

要与 GitHub API 交互,我们将使用 Octokit.rb。您可以在 platform-samples 仓库中找到此项目的完整源代码。

入门指南

如果您尚未阅读,请先阅读 身份验证基础 指南,然后再浏览下面的示例。下面的示例假设您已 注册了 OAuth 应用,并且您的 应用拥有用户的 OAuth 令牌

发现应用程序可以为用户访问的仓库

除了拥有自己的个人仓库外,用户可能还是其他用户或组织拥有的仓库的协作者。这些仓库统称为用户拥有特权访问权限的仓库:即用户对私有仓库拥有读取或写入权限,或对公共仓库拥有写入权限。

OAuth 范围组织应用策略 决定了您的应用可以为用户访问哪些仓库。使用下面的工作流来发现这些仓库。

像往常一样,首先我们要 引入 GitHub 的 Octokit.rb Ruby 库。随后配置 Octokit.rb 让它自动处理分页。有关分页的更多信息,请参阅 在 REST API 中使用分页

require 'octokit'

Octokit.auto_paginate = true

接下来,我们将传入应用程序的 针对特定用户的 OAuth 令牌

# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below.
client = Octokit::Client.new :access_token => ENV["OAUTH_ACCESS_TOKEN"]

然后,我们即可获取 应用程序可以为该用户访问的仓库列表

client.repositories.each do |repository|
  full_name = repository[:full_name]
  has_push_access = repository[:permissions][:push]

  access_type = if has_push_access
                  "write"
                else
                  "read-only"
                end

  puts "User has #{access_type} access to #{full_name}."
end

发现应用程序可以为用户访问的组织

应用程序可以为用户执行各种组织相关任务。要执行这些任务,应用需要拥有足够权限的 OAuth 授权。例如,read:org 范围允许您 列出团队,而 user 范围则让您 公开用户的组织成员身份。一旦用户为您的应用授予了其中一种或多种范围,您即可获取该用户的组织信息。

正如我们在上面发现仓库时所做的那样,首先引入 GitHub 的 Octokit.rb Ruby 库并配置它自动处理分页。有关分页的更多信息,请参阅 在 REST API 中使用分页

require 'octokit'

Octokit.auto_paginate = true

接下来,我们将传入应用程序的 针对特定用户的 OAuth 令牌 来初始化 API 客户端

# !!! DO NOT EVER USE HARD-CODED VALUES IN A REAL APP !!!
# Instead, set and test environment variables, like below.
client = Octokit::Client.new :access_token => ENV["OAUTH_ACCESS_TOKEN"]

然后,我们可以 列出应用程序可以为该用户访问的组织列表

client.organizations.each do |organization|
  puts "User belongs to the #{organization[:login]} organization."
end

返回用户的所有组织成员资格

如果您完整阅读了文档,可能已经注意到有一个 列出用户公开组织成员资格的 API 方法。大多数应用应避免使用此 API 方法,因为它仅返回用户的公开组织成员资格,而不包括其私有组织成员资格。

作为应用程序,您通常希望获取所有已授权访问的用户组织。上述工作流正好能够提供这些信息。

© . This site is unofficial and not affiliated with GitHub, Inc.