Skip to main content

Авторизация приложений OAuth

Вы можете разрешить другим пользователям авторизовать данные OAuth app.

Note

Попробуйте создать GitHub App вместо OAuth app.

Данные OAuth apps и GitHub Apps используют OAuth 2.0.

GitHub Apps может действовать от имени пользователя, аналогично OAuth appили как себя, что полезно для автоматизации, которые не требуют ввода пользователем. Кроме того, GitHub Apps используют подробные разрешения, дают пользователю больше контроля над тем, к каким репозиториям приложение может получить доступ и использовать короткие маркеры. Дополнительные сведения см. в разделе "[AUTOTITLE" и "Различия между приложениями GitHub и приложениями OAuth](/apps/creating-github-apps/setting-up-a-github-app/about-creating-github-apps)".

Реализация OAuth в GitHub поддерживает стандартный тип предоставления кода авторизации и предоставление авторизации устройствам OAuth 2.0 для приложений, у которых нет доступа к веб-браузеру.

Если вы хотите пропустить стандартную авторизацию приложения, например при его тестировании, можно воспользоваться процессом не для веб-приложения.

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

Процесс для веб-приложения

Note

Если вы создаете приложение GitHub, вы по-прежнему можете использовать поток веб-приложения OAuth, но программа установки имеет ряд важных различий. Дополнительные сведения см. в разделе "Проверка подлинности с помощью приложения GitHub от имени пользователя".

Процесс для веб-приложения, позволяющий авторизовать пользователей для использования приложения, состоит из следующих шагов:

  1. Пользователи перенаправляются для запроса удостоверения GitHub.
  2. Пользователи перенаправляются из GitHub обратно на сайт.
  3. Приложение обращается к API с маркером доступа пользователя.

1. Запрос удостоверения GitHub пользователя

GET https://github.com/login/oauth/authorize

Эта конечная точка принимает следующие входные параметры.

Параметр запросаТипОбязательное?Description
client_idstringОбязательное полеИдентификатор клиента, полученный от GitHub при регистрации.
redirect_uristringНастоятельно рекомендуетсяURL-адрес в приложении, на который пользователи будут направляться после авторизации. См. дополнительные сведения ниже о URL-адресах перенаправления.
loginstringНеобязательноПредлагает определенную учетную запись для входа и авторизации приложения.
scopestringЗависимый от контекстаРазделенный пробелами список областей. Если значение не указано, по умолчанию scope представляет собой пустой список пользователей, которые не авторизовали ни одну область для приложения. Пользователям, авторизовавшим области для приложения, не будет отображаться страница авторизации OAuth со списком областей. Вместо этого данный шаг процесса будет автоматически завершен с набором областей, которые пользователь авторизовал для приложения. Например, если пользователь уже дважды выполнил веб-процесс и авторизовал один токен с областью user, а другой — с областью repo, третий веб-процесс без указания scope получит токен с областью user и repo.
statestringНастоятельно рекомендуетсяСлучайная строка, которую сложно угадать. Используется для защиты от атак в форме подделки межсайтовых запросов.
allow_signupstringНеобязательноПредоставляется ли пользователям, не прошедшим проверку подлинности, возможность регистрации на GitHub во время процесса OAuth. Значение по умолчанию — true. Используйте значение false, когда политика запрещает регистрацию.
promptstringНеобязательноЗаставляет средство выбора учетной записи отображаться, если задано select_accountзначение . Средство выбора учетных записей также появится, если у приложения есть URI перенаправления, отличный от HTTP, или если у пользователя есть несколько учетных записей, вошедшего в систему.

Параметры PKCE (подтверждение ключа для обмена кодом) code_challenge и code_challenge_method в настоящее время не поддерживаются. В настоящее время запросы на предварительный полет CORS (OPTIONS) не поддерживаются.

2. Перенаправление пользователей из GitHub обратно на ваш сайт

Если пользователь принимает запрос, GitHub перенаправляет его обратно на ваш сайт с временным кодом в параметре code, а также с состоянием, указанным на предыдущем шаге в параметре state. Срок действия временного кода истекает через 10 минут. Если состояния не совпадают, значит запрос создала третья сторона и следует прервать процесс.

Код в параметре code обменивается на маркер доступа:

POST https://github.com/login/oauth/access_token

Эта конечная точка принимает следующие входные параметры.

Наименование параметраТипОбязательное?Description
client_idstringОбязательное полеИдентификатор клиента, полученный из GitHub для OAuth app.
client_secretstringОбязательное полеСекрет клиента, полученный из GitHub для OAuth app.
codestringОбязательное полеКод, полученный в качестве ответа на шаге 1.
redirect_uristringНастоятельно рекомендуетсяURL-адрес в приложении, на который пользователи будут направляться после авторизации. Мы можем использовать это для сопоставления с универсальным кодом ресурса (URI), первоначально предоставленного при code выпуске, чтобы предотвратить атаки против вашей службы.

По умолчанию ответ имеет следующую форму:

access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer

Вы также можете получить ответ в разных форматах, указав формат в заголовке Accept. Например, Accept: application/json или Accept: application/xml:

Accept: application/json
{
  "access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
  "scope":"repo,gist",
  "token_type":"bearer"
}
Accept: application/xml
<OAuth>
  <token_type>bearer</token_type>
  <scope>repo,gist</scope>
  <access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
</OAuth>

3. Использование маркера доступа для доступа к API

Маркер доступа позволяет выполнять запросы к API от имени пользователя.

Authorization: Bearer OAUTH-TOKEN
GET https://api.github.com/user

Например, в curl можно задать заголовок авторизации следующим образом:

curl -H "Authorization: Bearer OAUTH-TOKEN" https://api.github.com/user

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

Процесс для устройства

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

Прежде чем использовать процесс для устройства с целью авторизации и идентификации пользователей, необходимо сначала включить его в параметрах приложения. Дополнительные сведения о включении потока устройств в приложении см. в разделе "[AUTOTITLE" для GitHub Apps иИзменение регистрации приложения GitHub](/apps/oauth-apps/maintaining-oauth-apps/modifying-an-oauth-app) для OAuth apps.

Общая схема процесса для устройства

  1. Приложение запрашивает коды проверки устройства и пользователя и получает URL-адрес авторизации, по которому пользователь должен будет ввести код проверки пользователя.
  2. Приложение предлагает пользователю ввести код проверки пользователя на странице https://github.com/login/device.
  3. Приложение опрашивает состояние проверки подлинности пользователя. После того как пользователь авторизует устройство, приложение сможет выполнять вызовы API с новым маркером доступа.

Шаг 1. Приложение запрашивает коды проверки устройства и пользователя на GitHub

POST https://github.com/login/device/code

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

Конечная точка принимает следующие входные параметры.

Наименование параметраТипОписание
client_idstringНеобходимые. Идентификатор клиента, полученный из GitHub для приложения.
scopestringСписок областей, к которым приложение запрашивает доступ. Дополнительные сведения см. в разделе Области для приложений OAuth.

По умолчанию ответ имеет следующую форму:

device_code=3584d83530557fdd1f46af8289938c8ef79f9dc5&expires_in=900&interval=5&user_code=WDJB-MJHT&verification_uri=https%3A%2F%2Fproxy.goincop1.workers.dev%3A443%2Fhttps%2Fgithub.com%2Flogin%2Fdevice
Наименование параметраТипОписание
device_codestringКод проверки устройства состоит из 40 символов и служит для проверки устройства.
user_codestringКод проверки пользователя отображается на устройстве, чтобы пользователь мог ввести его в браузере. Он состоит из восьми символов с дефисом в середине.
verification_uristringURL-адрес проверки, по которому пользователи должны ввести user_code: https://github.com/login/device.
expires_inintegerКоличество секунд до окончания срока действия device_code и user_code. Значение по умолчанию равно 900 секундам или 15 минутам.
intervalintegerМинимальное количество секунд, которое должно пройти, прежде чем можно будет выполнить новый запрос маркера доступа (POST https://github.com/login/oauth/access_token) для завершения авторизации устройства. Например, если интервал равен пяти, вы не сможете выполнить новый запрос, пока не пройдут пять секунд. Если вы выполните более одного запроса в течение пяти секунд, то достигнете предела частоты запросов и получите ошибку slow_down.

Вы также можете получить ответ в разных форматах, указав формат в заголовке Accept. Например, Accept: application/json или Accept: application/xml:

Accept: application/json
{
  "device_code": "3584d83530557fdd1f46af8289938c8ef79f9dc5",
  "user_code": "WDJB-MJHT",
  "verification_uri": "https://github.com/login/device",
  "expires_in": 900,
  "interval": 5
}
Accept: application/xml
<OAuth>
  <device_code>3584d83530557fdd1f46af8289938c8ef79f9dc5</device_code>
  <user_code>WDJB-MJHT</user_code>
  <verification_uri>https://github.com/login/device</verification_uri>
  <expires_in>900</expires_in>
  <interval>5</interval>
</OAuth>

Шаг 2. Запрос на ввод кода проверки пользователя в браузере

Устройство отобразит код проверки пользователя и предложит пользователю ввести его на странице https://github.com/login/device.

Шаг 3. Опрос GitHub приложением с целью проверки авторизации устройства пользователем

POST https://github.com/login/oauth/access_token

Приложение будет выполнять запросы на авторизацию устройства POST https://github.com/login/oauth/access_token, пока не истечет срок действия кода проверки устройства или пользователя либо пока пользователь не авторизует приложение успешно с помощью допустимого кода проверки пользователя. Чтобы избежать ошибок ограничения частоты запросов, приложение должно использовать минимальный интервал (interval) опроса, полученный на шаге 1. Дополнительные сведения см. в разделе Ограничения частоты запросов для процесса для устройства.

Пользователь должен ввести действительный код в течение 15 минут (900 секунд). По истечении 15 минут вам потребуется запросить новый код авторизации устройства с помощью POST https://github.com/login/device/code.

После авторизации пользователем приложение получит маркер доступа, с помощью которого можно выполнять запросы к API от имени пользователя.

Конечная точка принимает следующие входные параметры.

Наименование параметраТипОписание
client_idstringНеобходимые. Идентификатор клиента, полученный из GitHub для OAuth app.
device_codestringНеобходимые. Полученные device_code от POST https://github.com/login/device/code запроса.
grant_typestringНеобходимые. Тип предоставления разрешения должен быть urn:ietf:params:oauth:grant-type:device_code.

По умолчанию ответ имеет следующую форму:

access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer&scope=repo%2Cgist

Вы также можете получить ответ в разных форматах, указав формат в заголовке Accept. Например, Accept: application/json или Accept: application/xml:

Accept: application/json
{
 "access_token": "gho_16C7e42F292c6912E7710c838347Ae178B4a",
  "token_type": "bearer",
  "scope": "repo,gist"
}
Accept: application/xml
<OAuth>
  <access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
  <token_type>bearer</token_type>
  <scope>gist,repo</scope>
</OAuth>

Ограничения частоты вызовов для процесса для устройства

Пользователь может отправлять код проверки в браузере не чаще чем 50 раз в час для каждого приложения.

При выполнении еще одного запроса маркера доступа (POST https://github.com/login/oauth/access_token) до истечения минимального интервала времени между запросами (или interval) будет достигнут предел частоты запросов и получен ответ с ошибкой slow_down. Ответ об ошибке slow_down добавляет пять секунд к последнему интервалу interval. Дополнительные сведения см. в кодах ошибок для потока устройства.

Коды ошибок процесса для устройства

Код ошибкиDescription
authorization_pendingЭта ошибка возникает, если запрос авторизации ожидает завершения и пользователь еще не ввел код проверки пользователя. Приложение должно продолжать выполнять запрос POST https://github.com/login/oauth/access_token без превышения интервала interval, то есть перед следующим запросом должно пройти минимальное количество секунд.
slow_downПри получении ошибки slow_down к минимальному интервалу времени interval между запросами POST https://github.com/login/oauth/access_token добавляются пять дополнительных секунд. Например, если начальный требуемый интервал между запросами составлял пять секунд и вы получили ответ с ошибкой slow_down, необходимо подождать не менее 10 секунд, прежде чем выполнять новый запрос маркера доступа OAuth. В ответе с ошибкой указывается новый интервал interval, который необходимо выждать.
expired_tokenЕсли истек срок действия кода устройства, возникнет ошибка token_expired. Необходимо запросить новый код устройства.
unsupported_grant_typeТип предоставления разрешения должен быть urn:ietf:params:oauth:grant-type:device_code и включен в качестве входного параметра при запросе маркера OAuth POST https://github.com/login/oauth/access_token.
incorrect_client_credentialsДля процесса для устройства необходимо передать идентификатор клиента приложения, который можно найти на странице параметров приложения. client_secret не требуется для процесса для устройства.
incorrect_device_codeУказанный код проверки устройства недействителен.
access_deniedКогда пользователь нажимает кнопку "Отменить" во время процесса авторизации, вы получите access_denied ошибку, и пользователь не сможет снова использовать код проверки.
device_flow_disabledПроцесс для устройства не включен в параметрах приложения. Дополнительные сведения см. в разделе "Поток устройства".

Дополнительные сведения см. в разделе Предоставление разрешения на авторизацию устройства OAuth 2.0.

Процесс не для веб-приложения

Проверка подлинности не для веб-приложения доступна в некоторых ситуациях, таких как тестирование. Если вам нужно, можно использовать обычную проверку подлинности для создания personal access token с помощью страницы параметров personal access tokens. Этот метод позволяет пользователю отозвать доступ в любое время.

URL-адреса перенаправления

Параметр redirect_uri является необязательным. В противном случае GitHub перенаправит пользователей на URL-адрес обратного вызова, настроенный в параметрах OAuth app. Если это указано, узел URL-адреса перенаправления (за исключением вложенных доменов) и порт должны точно соответствовать URL-адресу обратного вызова. Путь URL-адреса перенаправления должен вести в подкаталог URL-адреса обратного вызова.

CALLBACK: http://example.com/path

GOOD: http://example.com/path
GOOD: http://example.com/path/subdir/other
GOOD: http://oauth.example.com/path
GOOD: http://oauth.example.com/path/subdir/other
BAD:  http://example.com/bar
BAD:  http://example.com/
BAD:  http://example.com:8080/path
BAD:  http://oauth.example.com:8080/path
BAD:  http://example.org

URL-адреса перенаправления обратного цикла

Необязательный redirect_uri параметр также можно использовать для URL-адресов обратного цикла, что полезно для собственных приложений, работающих на настольном компьютере. Если приложение задает URL-адрес обратного цикла и порт, после авторизации пользователей приложения будет перенаправлено на указанный URL-адрес и порт. Не redirect_uri нужно соответствовать порту, указанному в URL-адресе обратного вызова для приложения.

Для URL-адреса обратного http://127.0.0.1/path вызова это можно использовать redirect_uri , если приложение прослушивает порт 1234:

http://127.0.0.1:1234/path

Обратите внимание, что OAuth RFC рекомендует не использовать localhost, а вместо этого использовать литерал 127.0.0.1 обратного цикла или IPv6 ::1.

Создание нескольких маркеров для OAuth apps

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

Это полезно, если данные OAuth app поддерживают один рабочий процесс, использующий GitHub для входа, и требует только базовых сведений о пользователе. Другой рабочий процесс может требовать доступа к частным репозиториям пользователя. Используя несколько маркеров, данные OAuth app могут выполнять веб-поток для каждого варианта использования, запрашивая только необходимые области. Если пользователь использует приложение только для входа, они никогда не требуются для предоставления доступа к частным репозиториям OAuth app.

Существует ограничение в десять маркеров, выданных для каждого пользователя или приложения/область комбинации, и ограничение скорости в десять маркеров, созданных в час. Если приложение создает более десяти маркеров для одного пользователя и одного и того же область, старые маркеры с одним и тем же пользователем или приложением/область комбинацией отзываются. Однако при нажатии почасового ограничения скорости не отозван старый токен. Вместо этого он активирует запрос повторной авторизации в браузере, запрашивая у пользователя двойное проверка разрешения, которые они предоставляют приложению. Этот запрос предназначен для того, чтобы дать перерыв любому потенциальному бесконечному циклу приложения зависает, так как не существует никаких причин для приложения запрашивать десять токенов от пользователя в течение часа.

Warning

Отмена всех разрешений от OAuth app удаляет все ключи SSH, созданные от имени пользователя, включая ключ развертывания.

Перенаправление пользователей для проверки доступа

Вы можете связаться с информацией о авторизации для OAuth app, чтобы пользователи могли просматривать и отменять авторизацию приложения.

Чтобы создать эту ссылку, вам потребуется данные OAuth app client_id , полученные от GitHub при регистрации приложения.

https://github.com/settings/connections/applications/:client_id

Tip

Дополнительные сведения о ресурсах, к которым могут получить доступ OAuth app для пользователя, см. в разделе "Обнаружение ресурсов для пользователя".

Устранение неполадок

Дополнительные материалы