При выполнении аутентифицированных запросов к API GitHub приложения часто должны получить репозитории и организации текущего пользователя. В этом руководстве мы объясним, как уверенно находить эти ресурсы.
Для взаимодействия с API GitHub мы будем использовать Octokit.rb. Полный исходный код этого проекта можно найти в репозитории platform-samples.
Начало работы
Если вы еще не сделали этого, ознакомьтесь с руководством по проверке подлинности перед выполнением приведенных ниже примеров. В приведенных ниже примерах предполагается, что вы зарегистрировали OAuth app и что приложение имеет маркер OAuth для пользователя.
Обнаружение репозиториев, к которым приложение может получать доступ для пользователя
Помимо наличия личных репозиториев, пользователь может участвовать в совместной работе над репозиториями, принадлежащими другим пользователям и организациям. В совокупности это репозитории, в которых пользователь имеет привилегированный доступ: это частный репозиторий, где пользователь имеет доступ на чтение или запись, или общедоступный или внутренний репозиторий, где пользователь имеет доступ на запись.
[Области OAuth](/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps) и [политики в отношении приложений организации](https://developer.github.com/changes/2015-01-19-an-integrators-guide-to-organization-application-policies/) определяют то, к каким из этих репозиториев приложение может получать доступ для пользователя. Для нахождения этих репозиториев используйте описанный ниже рабочий процесс.
Как всегда, сначала нам понадобится библиотека Ruby GitHub Octokit.rb Затем мы настроим 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 — публиковать сведения о членстве пользователя в организациях. После того как пользователь предоставит приложению одну или несколько этих областей, вы можете получить сведения о его организациях.
Как и при поиске репозиториев, описанных выше, мы начнём с того, что попросим библиотеку Ruby GitHub Octokit.rb и настроим её так, чтобы она занималась пагинацией за нас. Дополнительные сведения о разбиении на страницы см. в разделе Использование разбиения на страницы в 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. Он возвращает только общедоступные организации пользователя, но не частные.
Приложению же, как правило, требуются сведения обо всех организациях пользователя, к которым приложению разрешен доступ. Описанный выше рабочий процесс дает именно такой результат.