极客学院团队出品 · 更新于 2018-11-28 11:00:42

探索用户资源

当发出经过认证的请求给 GitHub API 时,应用程序通常会需要获取当前用户的存储库和组织。这个指南会向您解释如何可靠地发现这类资源。

要和 GitHub API 互动,我们将使用 Octokit.rb。您可以在platform-samples存储库中找到这个示例项目的完整源代码。

准备开始

您应该先阅读认证基础指南(如果您还没有的话),再来尝试本指南所提供的示例。下面的示例默认您已经注册了一个 OAuth 应用程序并且该程序有一个为用户提供的 OAuth 令牌。

探索应用程序可让用户访问的存储库

除了拥有自己的个人存储库之外,一个用户还可能是其他用户或组织的存储库的一个合作者。总而言之,刚才提到的都是用户拥有访问特权的存储库,要不就是用户拥有读写权限的私人存储库,要不就是用户拥有写权限的公共存储库。

OAuth 域组织应用策略会决定哪些存储库可以通过您的应用让用户访问。使用下面的工作流来发现这些存储库。

和往常一样,我们会 require GitHub 的 Octokit.rb Ruby 库。然后将其配置为自动为我们处理分页

        require 'octokit'

        Octokit.auto_paginate = true

接下来,我们选择加入列出存储库的 API 的未来改进存储库。并设置媒体类别让我们得以访问那个功能。

    language-ruby
    Octokit.default_media_type = "application/vnd.github.moondragon+json"

现在,将我们应用程序的指定用户的 OAuth 令牌传过去:

    # 在真正的应用内永远不要用硬编码把值写死 !
    # 而是设置环境变量并测试,和下例所示
    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 域则可以让你公布用户的组织会员身份。 当一个用户授予一个或多个这样的域给你的应用程序时,你就可以获取该用户的组织信息了。

就和我们发现存储库一样,我们还是从 require GitHub’s Octokit.rb Ruby库开始,并将其设置为为我们自动操作分页:

    require 'octokit'

    Octokit.auto_paginate = true

接下来,我们会加入列出组织信息的 API 的未来改进存储库。并设置媒体类别让我们得以访问那个功能。

    Octokit.default_media_type = "application/vnd.github.moondragon+json"

现在,将我们应用程序的指定用户的 OAuth 令牌传过去,来初始化我们的 API 客户端:

    # 在真正的应用内永远不要用硬编码把值写死 !
    # 而是设置环境变量并测试,和下例所示
    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 方法。大多数应用程序应该避开这个 API 方法。因为这个方法只返回用户的公共组织会员身份,不包括私人组织会员身份。

作为一个应用程序,你通常会希望用户加入的所有组织(包括公共的和私人的)都能授权给你的应用程序访问。而本文所描述的工作流正是让你实现初衷的。

上一篇: 身份认证基础 下一篇: 管理部署密钥