При выполнении запросов с проверкой подлинности к API GitHub приложениям часто требуется получить репозитории и организации текущего пользователя. В этом руководстве мы объясним, как уверенно находить эти ресурсы.
Для взаимодействия с API GitHub мы используем Octokit.rb. Полный исходный код этого проекта можно найти в репозитории platform-samples.
Начало работы
Если вы еще не сделали этого, ознакомьтесь с руководством по проверке подлинности перед выполнением приведенных ниже примеров. В приведенных ниже примерах предполагается, что вы зарегистрировали OAuth app и что приложение имеет маркер OAuth для пользователя.
Обнаружение репозиториев, к которым приложение может получать доступ для пользователя
Помимо наличия личных репозиториев, пользователь может участвовать в совместной работе над репозиториями, принадлежащими другим пользователям и организациям. В совокупности это репозитории, в которых пользователь имеет привилегированный доступ: это частный репозиторий, где пользователь имеет доступ на чтение или запись, или общедоступный или внутренний репозиторий, где пользователь имеет доступ на запись.
Области OAuth и политики в отношении приложений организации определяют то, к каким из этих репозиториев приложение может получать доступ для пользователя. Для нахождения этих репозиториев используйте описанный ниже рабочий процесс.
Как всегда, сначала нам понадобится библиотека Ruby Octokit.rb для GitHub. Затем мы настроим 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. Он возвращает только общедоступные организации пользователя, но не частные.
Приложению же, как правило, требуются сведения обо всех организациях пользователя, к которым приложению разрешен доступ. Описанный выше рабочий процесс дает именно такой результат.