# Обнаружение ресурсов для пользователя

Узнайте, как найти репозитории и организации, к которым ваше приложение может безопасно и надежно получить доступ для запросов к REST API, прошедших проверку подлинности.

При выполнении аутентифицированных запросов к GitHub API приложениям часто требуется получить репозитории и организации текущего пользователя. В этом руководстве мы объясним, как уверенно находить эти ресурсы.

Для взаимодействия с GitHub API мы будем использовать [Octokit.rb](https://github.com/octokit/octokit.rb). Полный исходный код этого проекта можно найти в репозитории [platform-samples](https://github.com/github/platform-samples/tree/master/api/ruby/discovering-resources-for-a-user).

## Начало работы

Если вы еще не сделали этого, ознакомьтесь [с руководством по проверке подлинности](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/authenticating-to-the-rest-api-with-an-oauth-app) перед выполнением приведенных ниже примеров. В приведенных ниже примерах предполагается, что вы [зарегистрировали и OAuth app](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/authenticating-to-the-rest-api-with-an-oauth-app#registering-your-app) что [приложение имеет маркер OAuth для пользователя](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/authenticating-to-the-rest-api-with-an-oauth-app#making-authenticated-requests).

## Обнаружение репозиториев, к которым приложение может получать доступ для пользователя

Помимо наличия личных репозиториев, пользователь может участвовать в совместной работе над репозиториями, принадлежащими другим пользователям и организациям. В совокупности это репозитории, в которых у пользователя есть привилегированный доступ: это частный репозиторий, в котором пользователь имеет доступ на чтение или запись, или или внутренний репозиторий, где у пользователя есть доступ на запись.

[Области OAuth](/ru/enterprise-server@3.22/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](https://github.com/octokit/octokit.rb) Затем мы настроим Octokit.rb для автоматической обработки разбиения на страницы. Дополнительные сведения о разбиении на страницы см. в разделе [Использование разбиения на страницы в REST API](/ru/enterprise-server@3.22/rest/using-the-rest-api/using-pagination-in-the-rest-api).

```ruby
require 'octokit'

Octokit.auto_paginate = true
```

Далее мы передадим [токен OAuth приложения для данного пользователя](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/authenticating-to-the-rest-api-with-an-oauth-app#making-authenticated-requests):

```ruby
# !!! 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"]
```

После этого мы готовы получить [репозитории, к которым приложение может получать доступ для пользователя](/ru/enterprise-server@3.22/rest/repos/repos#list-repositories-for-the-authenticated-user):

```ruby
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](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps) с достаточными разрешениями. Например, область `read:org` позволяет [получать список команд](/ru/enterprise-server@3.22/rest/teams/teams#list-teams), а область `user` — [публиковать сведения о членстве пользователя в организациях](/ru/enterprise-server@3.22/rest/orgs/members#set-public-organization-membership-for-the-authenticated-user). После того как пользователь предоставит приложению одну или несколько этих областей, вы можете получить сведения о его организациях.

Как и при поиске репозиториев, описанных выше, мы начнём с того, что попросим библиотеку Ruby [GitHub Octokit.rb](https://github.com/octokit/octokit.rb) и настроим её так, чтобы она занималась пагинацией за нас. Дополнительные сведения о разбиении на страницы см. в разделе [Использование разбиения на страницы в REST API](/ru/enterprise-server@3.22/rest/using-the-rest-api/using-pagination-in-the-rest-api).

```ruby
require 'octokit'

Octokit.auto_paginate = true
```

Далее мы передадим [токен OAuth приложения для данного пользователя,](/ru/enterprise-server@3.22/apps/oauth-apps/building-oauth-apps/authenticating-to-the-rest-api-with-an-oauth-app#making-authenticated-requests) чтобы инициализировать клиент API:

```ruby
# !!! 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"]
```

Затем мы можем [получить список организаций, к которым приложение может получать доступ для пользователя](/ru/enterprise-server@3.22/rest/orgs/orgs#list-organizations-for-the-authenticated-user):

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

### Возврат сведений обо всех организациях, в которые входит пользователь

Если вы прочитали документацию от корки до корки, возможно, вы обратили внимание на [метод API для перечисления общедоступных организаций, в которые входит пользователь](/ru/enterprise-server@3.22/rest/orgs/orgs#list-organizations-for-a-user). В большинстве приложений следует избегать использования этого метода API. Он возвращает только общедоступные организации пользователя, но не частные.

Приложению же, как правило, требуются сведения обо всех организациях пользователя, к которым приложению разрешен доступ. Описанный выше рабочий процесс дает именно такой результат.