{"id":20172267,"url":"https://github.com/apostoldevel/module-authserver","last_synced_at":"2025-08-08T04:14:06.393Z","repository":{"id":110915428,"uuid":"291069585","full_name":"apostoldevel/module-AuthServer","owner":"apostoldevel","description":"Module: OAuth 2 Authorization Server","archived":false,"fork":false,"pushed_at":"2024-02-16T19:24:11.000Z","size":99,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-04T00:17:26.573Z","etag":null,"topics":["authorization-server","oauth2-server"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/apostoldevel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-28T14:38:49.000Z","updated_at":"2023-12-23T07:39:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"ecb4ab31-85a6-46f3-890c-1fc99198839a","html_url":"https://github.com/apostoldevel/module-AuthServer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/apostoldevel/module-AuthServer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apostoldevel%2Fmodule-AuthServer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apostoldevel%2Fmodule-AuthServer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apostoldevel%2Fmodule-AuthServer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apostoldevel%2Fmodule-AuthServer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/apostoldevel","download_url":"https://codeload.github.com/apostoldevel/module-AuthServer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apostoldevel%2Fmodule-AuthServer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269361858,"owners_count":24404435,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-08T02:00:09.200Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authorization-server","oauth2-server"],"created_at":"2024-11-14T01:29:27.161Z","updated_at":"2025-08-08T04:14:06.321Z","avatar_url":"https://github.com/apostoldevel.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"Сервер авторизации\n-\n**Модуль** для [Апостол CRM](https://github.com/apostoldevel/apostol-crm).\n\nОписание\n-\n* Сервер авторизации разработан по стандартам:\n  - [RFC 6749](https://tools.ietf.org/html/rfc6749): The OAuth 2.0 Authorization Framework;\n  - OpenID Connect;\n  - [RFC 7519](https://tools.ietf.org/html/rfc7519): JSON Web Token (JWT).\n\n* Позволяет упростить доступ пользователей к приложениям, разрешив для этого использование существующей учетной записи социальной сети или, например, учетной записи пользователя в Google или в ЕСИА (Госуслуги).\n\nУстановка\n-\nСледуйте указаниям по сборке и установке [Апостол CRM](https://github.com/apostoldevel/apostol-crm#%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-%D0%B8-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)\n\nДокументация\n-\n\n## Аутентификация и авторизация\n\n### Использование протокола OAuth 2.0 для авторизации пользователя\n\nПротокол определяет четыре роли:\n\n * Владелец ресурса (`resource owner`) – Пользователь системы (физическое лицо);\n * Клиент (`client`) – Приложение, которое запрашивает доступ к защищаемому ресурсу от имени его владельца;\n * Сервер авторизации (`authorization server`) – сервер, который выпускает для клиента маркеры идентификации с разрешениями от владельца ресурса, а также маркеры доступа, позволяющие получать доступ к данным;\n * Поставщик ресурса (`resource server`) – сервер, обеспечивающий доступ к защищаемому ресурсу на основе проверки маркеров идентификации и маркеров доступа (например, к идентификационным данным пользователя).\n\nВ рамках данной системы `authorization server` и `resource server` - это один и тот же сервер.\n\nДля взаимодействия `Клиента` с `Сервером` необходимо получить идентификатор (`client_id`) и секрет (`client_secret`).\n\nВзаимодействие происходит через `RESTful` API описанное в спецификации [RFC 6749](https://tools.ietf.org/html/rfc6749).\n\n#### Использование OpenID Connect для аутентификации пользователя\n\nВ общем виде схема аутентификация с использованием OpenID Connect выглядит следующим образом:\n\n * **Клиент** (`client`) готовит запрос на аутентификацию пользователя с необходимыми параметрами;\n * **Клиент** (`client`) отправляет `GET` запрос на аутентификацию в адрес сервера авторизации;\n * **Сервер авторизации** (`authorization server`) аутентифицирует пользователя (пользователь вводит логин и пароль);\n * **Сервер авторизации** (`authorization server`) получает согласие пользователя на проведение аутентификации в данной системе;\n * **Сервер авторизации** (`authorization server`) перенаправляет пользователя обратно **Клиенту** и передает код авторизации;\n * **Клиент** (`client`) отправляет `POST` запрос с использованием кода авторизации на получения маркера идентификации;\n * **Клиент** (`client`) получает ответ, содержащий необходимый маркер идентификации (меняет код авторизации на маркер доступа);\n * **Клиент** (`client`) проводит проверку маркера идентификации и извлекает из маркера идентификатор пользователя.\n\nДалее детально будут рассмотрены формируемые **Клиентом** запросы и ответы от **Сервера авторизации**.\n\n## Конечные точки сервера авторизации (API)\n\nДля авторизации:\n```http request\nGET /oauth2/authorize\n```\nДля получения маркера доступа:\n```http request\nPOST /oauth2/token\n```\n### Разрешение на авторизацию\n\nПротокол **OAuth 2** определяет четыре разных типа **разрешения на авторизацию**, каждый из которых полезен в определённых ситуациях:\n\n 1. **Код авторизации** (`Authorization Code`): используется с серверными приложениями (server-side applications).\n 1. **Неявный** (`Implicit`): используется мобильными или веб-приложениями (JavaScript), приложениями работающими на устройстве пользователя.\n 1. **Учётные данные владельца ресурса** (`Resource Owner Password Credentials`): используются доверенными приложениями, например приложениями, которые являются частью самого сервера.\n 1. **Учётные данные клиента** (`Client Credentials`): используются при доступе клиента (приложения) к API без авторизации пользователя.\n\n## Типы разрешения на авторизацию\n\n### Код авторизации\n\n* Код авторизации является одним из наиболее распространённых типов разрешения на авторизацию, поскольку он хорошо подходит для серверных приложений, где исходный код приложения и секрет клиента не доступны посторонним. Процесс в данном случае строится на перенаправлении (redirection), что означает, что приложение должно быть в состоянии взаимодействовать с пользовательским агентом (user-agent), например, веб-браузером, и получать коды авторизации API, перенаправляемые через пользовательский агент.\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента (приложения).\nredirect_uri | `redirect_uri` | **Обязательный**. URI, на который сервер авторизации перенаправит агента пользователя (браузер) и код авторизации.\nresponse_type | code | **Обязательный**. Указывает на то, что приложение запрашивает доступ с помощью кода авторизации.\nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\naccess_type | `access_type` | **Рекомендуемый**. Указывает, может ли ваше приложение обновлять маркеры доступа, когда пользователь отсутствует в браузере. Допустимые значения параметров: online (по умолчанию) и offline. \nstate | `state` | **Рекомендуемый**. Набор случайных символов которые будут возвращены сервером клиенту (используется для защиты от повторных запросов).\n\n**Пример зпроса:**\n```http request\nGET /oauth2/authorize?client_id=YOUR-CLIENT-ID\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcode\u0026scope=api\u0026response_type=code\u0026access_type=online\u0026state=c2FmZXR HTTP/1.1\nHost: localhost:8080\n```\n\n```\nhttp://localhost:8080/oauth2/authorize?\n  client_id=YOUR-CLIENT-ID\u0026\n  redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcode\u0026\n  response_type=code\u0026\n  access_type=online\u0026\n  scope=api\u0026\n  state=c2FmZXR\n```\n\nЕсли в ходе аутентификации не возникло ошибок, то сервер авторизации перенаправит пользователя по ссылке, указанной в `redirect_uri`, а также вернёт два обязательных параметра:\n * code – Код авторизации;\n * state – Значение параметра `state`, которое было получено в запросе на аутентификацию;\n\n**Клиент** должен провести сравнение отправленного и полученного параметра `state`.\n\n**Ответ с кодом авторизации:**\n```\nhttp://localhost:8080/oauth2/code?code=b%2F8NpjbB4eLaukGr68tE7maTCeBISO%2FC7hWxKGuKb8I4Ysc7uw8a2MRUMWnO3Nzt\n``` \n* Обратите внимание, на то что код (`b/8NpjbB4eLaukGr68tE7maTCeBISO/C7hWxKGuKb8I4Ysc7uw8a2MRUMWnO3Nzt`) закодирован алгоритмом [URL encode](https://www.urlencoder.org/) и его нужно будет декодировать алгоритмом [URL Decode](https://www.urldecoder.org/). \n\nЕсли в ходе аутентификации возникла ошибка, то сервер авторизации перенаправит пользователя по ссылке, указанной в `redirect_uri` с информацией об ошибке:\n```\nhttp://localhost:8080/oauth2/code?code=403\u0026error=access_denied\u0026error_description=Access%20denied.\n``` \n \nДля обмена кода авторизации на маркер доступа **Клиент** должен сформировать запрос методом `POST`.\n\n**Параметры запроса**: \n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | authorization_code | **Обязательный**. Как определено в [спецификации](https://tools.ietf.org/html/rfc6749#section-4.1.3) OAuth 2.0, это поле должно содержать значение authorization_code.\ncode | `code` | **Обязательный**. Код авторизации, возвращенный из первоначального запроса.\nredirect_uri | `redirect_uri` | **Обязательный**. URI переадресации (должен совпадать с `redirect_uri` из первоначального запроса). \n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\nВ ответ на запрос сервер авторизации, вернет объект JSON, который содержит маркер краткосрочного доступа и маркер обновления.\n\n**Ответ содержит следующие поля:**\n\nПоле | Тип | Описание\n------------ | ------------ | ------------\naccess_token | STRING | Маркер краткосрочного доступа (сроком действия 1 час).\nexpires_in | INTEGER | Оставшееся время жизни маркера доступа в секундах.\ntoken_type | STRING | Тип возвращаемого маркера. Значение всегда будет Bearer.\nsession | STRING | Идентификатор сессии пользователя.\nrefresh_token | STRING | * Маркер который вы можете использовать для получения нового маркер доступа.\nid_token | STRING | * Маркер пользователя.\n\n* Обратите внимание, что маркер обновления возвращается только в том случае, если ваше приложение в первоначальном запросе к серверу авторизации, установило в `access_type` значение: offline.\n* Обратите внимание, что маркер пользователя возвращается только в том случае, если ваше приложение в первоначальном запросе к серверу авторизации, установило в `scope` одно из значений: openid, profile или email.\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=authorization_code\u0026\ncode=b%2F8NpjbB4eLaukGr68tE7maTCeBISO%2FC7hWxKGuKb8I4Ysc7uw8a2MRUMWnO3Nzt\u0026\nredirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcode\n```\n###### * Хоть это и не определено спецификацией, но сервер авторизации примет запрос и в формате JSON (Content-Type: `application/json`) \n\n**Пример ответа**:\n\n```json\n{\n  \"access_token\" : \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiIDogImFjY291bnRzLnNoaXAtc2FmZXR5LnJ1IiwgImF1ZCIgOiAid2ViLXNoaXAtc2FmZXR5LnJ1IiwgInN1YiIgOiAiZGZlMDViNzhhNzZiNmFkOGUwZmNiZWYyNzA2NzE3OTNiODZhYTg0OCIsICJpYXQiIDogMTU5MzUzMjExMCwgImV4cCIgOiAxNTkzNTM1NzEwfQ.NorYsi-Ht826HUFCEArVZ60_dEUmYiJYXubnTyweIMg\",\n  \"token_type\" : \"Bearer\",\n  \"expires_in\" : 3600,\n  \"session\" : \"dfe05b78a76b6ad8e0fcbef270671793b86aa848\"\n}\n```\n\n### Неявный\n\n* Неявный тип разрешения на авторизацию используется мобильными и веб-приложениями (приложениями, которые работают в веб-браузере - JavaScript), где конфиденциальность секрета клиента не может быть гарантирована. Неявный тип разрешения также основан на перенаправлении пользовательского агента, при этом маркер доступа передаётся пользовательскому агенту для дальнейшей передачи приложению. Это, в свою очередь, делает маркер доступным пользователю и другим приложениям на устройстве пользователя. Также при этом типе разрешения на авторизацию не осуществляется аутентификация подлинности приложения, а сам процесс полагается на URI перенаправления (зарегистрированном ранее в сервере авторизации).\n\n* Неявный тип разрешения на авторизацию не поддерживает маркеры обновления (`refresh_token`) и маркера пользователя (`id_token`).\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента (приложения).\nredirect_uri | `redirect_uri` | **Обязательный**. URI, на который сервер авторизации перенаправит агента пользователя (браузер) и маркер доступа.\nresponse_type | token | **Обязательный**. Приложения JavaScript должны установить значение параметра в token. Это значение указывает серверу авторизации возвращать маркер доступа в виде пары name = value в идентификаторе фрагмента URI (#), на который перенаправляется пользователь после завершения процесса авторизации.\nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\nstate | `state` | **Рекомендуемый**. Набор случайных символов которые будут возвращены сервером клиенту (используется для защиты от повторных запросов).\n\n**Пример зпроса:**\n```http request\nGET /oauth2/authorize?client_id=YOUR-CLIENT-ID\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcallback\u0026scope=api\u0026response_type=token\u0026state=c2FmZXR HTTP/1.1\nHost: localhost:8080\n```\n\n```\nhttp://localhost:8080/oauth2/authorize?\n  client_id=YOUR-CLIENT-ID\u0026\n  redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2%2Fcallback\u0026\n  response_type=token\u0026\n  scope=api\u0026\n  state=c2FmZXR\n```\n\nМаркер доступа или сообщение об ошибке возвращаются во фрагменте хэша URI перенаправления, как показано ниже:\n\n**Ответ с маркером доступа:**\n```\nhttp://localhost:8080/callback#token_type=Bearer\u0026expires_in=3600\u0026session=dfe05b78a76b6ad8e0fcbef270671793b86aa848\u0026access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiIDogImFjY291bnRzLnNoaXAtc2FmZXR5LnJ1IiwgImF1ZCIgOiAid2ViLXNoaXAtc2FmZXR5LnJ1IiwgInN1YiIgOiAiZGZlMDViNzhhNzZiNmFkOGUwZmNiZWYyNzA2NzE3OTNiODZhYTg0OCIsICJpYXQiIDogMTU5MzUzMjExMCwgImV4cCIgOiAxNTkzNTM1NzEwfQ.NorYsi-Ht826HUFCEArVZ60_dEUmYiJYXubnTyweIMg\n```\n* В дополнение к параметру `access_token` строка фрагмента также содержит параметр `token_type`, который всегда имеет значение Bearer, и параметр `expires_in`, который указывает время жизни маркера в секундах. Если параметр `state` был указан в запросе маркера доступа, его значение также включается в ответ.\n\n* URI перенаправления, в данном случае это `http://localhost:8080/callback/index.html` должен указывать на веб-страницу, которая содержит скрипт для извлечения маркера доступа из URI перенаправления. \n\n**Ответ с ошибкой:**\n```\nhttp://localhost:8080/callback#code=403\u0026error=access_denied\u0026error_description=Access%20denied.\n```\n\n###### Сервер авторизации поддерживает гибридный режим типов разрешения. Если в параметре `response_type` указать, через пробел, оба значения `code token`, то сервер авторизации вернет в одном запросе и код авторизации и маркер доступа.\n\n### Учётные данные владельца ресурса\n\n* При этом типе разрешения на авторизацию пользователь предоставляет приложению напрямую свои учётные данные (имя пользователя и пароль). Приложение, в свою очередь, использует полученные учётные данные пользователя для получения маркера доступа от сервера авторизации. Этот тип разрешения на авторизацию должен использоваться только в том случае, когда другие варианты не доступны. Кроме того, этот тип разрешения стоит использовать только в случае, когда приложение пользуется доверием пользователя (например, является частью самой системы).\n\nПосле того, как пользователь передаст свои учётные данные приложению, приложение запросит маркер доступа у авторизационного сервера методом `POST`.\n \n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | password | **Обязательный**. Как определено в [спецификации](https://tools.ietf.org/html/rfc6749#section-4.3.1) OAuth 2.0, это поле должно содержать значение password.\nusername | `username` | **Вариативный**. Логин пользователя. Игнорируется если указано значение в поле secret. \npassword | `password` | **Вариативный**. Пароль пользователя. Игнорируется если указано значение в поле secret.\nsecret | `secret` | **Вариативный**. Секретный код. Если значение указано то поля username и password заполнять не нужно.\nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\nВ ответ на запрос сервер авторизации, вернет объект JSON, который содержит маркер краткосрочного доступа и маркер обновления.\n\n**Ответ содержит следующие поля:**\n\nПоле | Тип | Описание\n------------ | ------------ | ------------\naccess_token | STRING | Маркер краткосрочного доступа (сроком действия 1 час).\nexpires_in | INTEGER | Оставшееся время жизни маркера доступа в секундах.\ntoken_type | STRING | Тип возвращаемого маркера. Значение всегда будет Bearer.\nsession | STRING | Идентификатор сессии пользователя.\nrefresh_token | STRING | Маркер который вы можете использовать для получения нового маркер доступа.\nid_token | STRING | * Маркер пользователя.\n\n* Обратите внимание, что маркер пользователя возвращается только в том случае, если ваше приложение в запросе к серверу авторизации, установило в `scope` одно из значений: openid, profile или email.\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=password\u0026\nusername=admin\u0026\npassword=admin\n```\n###### * Хоть это и не определено спецификацией, но сервер авторизации примет запрос и в формате JSON (Content-Type: `application/json`) \n\nЕсли учётные данные и клиента и пользователя корректны, сервер авторизации вернёт маркер доступа для приложения.\n\n### Учётные данные клиента\n\n* Тип разрешения на авторизацию с использованием учётных данных клиента позволяет приложению осуществлять доступ к своему собственному аккаунту сервиса. Это может быть полезно, например, когда приложение хочет обновить собственную регистрационную информацию на сервисе или URI перенаправления, или же осуществить доступ к другой информации, хранимой в аккаунте приложения на сервисе, через API.\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | client_credentials | **Обязательный**. Как определено в [спецификации](https://tools.ietf.org/html/rfc6749#section-4.4.2) OAuth 2.0, это поле должно содержать значение client_credentials.\nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\nВ ответ на запрос сервер авторизации, вернет объект JSON, который содержит маркер краткосрочного доступа и маркер обновления.\n\n**Ответ содержит следующие поля:**\n\nПоле | Тип | Описание\n------------ | ------------ | ------------\naccess_token | STRING | Маркер доступа (сроком действия 1 день).\nexpires_in | INTEGER | Оставшееся время жизни маркера доступа в секундах.\ntoken_type | STRING | Тип возвращаемого маркера. Значение всегда будет Bearer.\nsession | STRING | Идентификатор сессии пользователя.\nrefresh_token | STRING | Маркер который вы можете использовать для получения нового маркер доступа.\nid_token | STRING | * Маркер пользователя.\n\n* Обратите внимание, что маркер пользователя возвращается только в том случае, если ваше приложение в запросе к серверу авторизации, установило в `scope` одно из значений: openid, profile или email.\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=client_credentials\n```\n\n### Обновление маркера доступа\n\n* После истечения срока действия маркера доступа все запросы к API с его использованием будут возвращать ошибку с кодом `403` (\u0026quot;Token expired\u0026quot;). Если при создании маркера доступа был создан и маркер для обновления маркера доступа (`refresh_token`), последний может быть использован для получения нового маркера доступа от сервера авторизации.\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | refresh_token | **Обязательный**. Как определено в [спецификации](https://tools.ietf.org/html/rfc6749#section-6) OAuth 2.0, это поле должно содержать значение refresh_token.\nrefresh_token | `refresh_token` | **Обязательный**. Маркер обновления, выданный ранее.\nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=refresh_token\u0026\nrefresh_token=e%2FdtGmXCIzHvPMURn%2FTH9udTPxtKpR5FFifx2uvH1WqT4myXLtgyjkLgYDy7g3Ik5MrFRR82\n```\n\n###### * Хоть это и не определено спецификацией, но сервер авторизации примет запрос и в формате JSON (Content-Type: `application/json`) \n\nЕсли учётные данные клиента корректны, то сервер авторизации вернёт новый маркер краткосрочного доступа и новый маркер обновления.\n\n### Грант на продление\n\n* Грант на продление позволяет получить новый маркер доступа до истечения срока его действия.\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | urn:ietf:params:oauth:grant-type:token-exchange | **Обязательный**. Как определено в [спецификации](https://tools.ietf.org/html/rfc8693#appendix-A.2), это поле должно содержать значение urn:ietf:params:oauth:grant-type:token-exchange.\nsubject_token | `subject_token` | **Обязательный**. Маркер, выданный ранее.\nsubject_token_type | `subject_token_type` | **Рекомендуемый**. Тип передаваемого маркера. Доступные значения: urn:ietf:params:oauth:token-type:jwt (по умолчанию), urn:ietf:params:oauth:token-type:access_token, urn:ietf:params:oauth:token-type:refresh_token, urn:ietf:params:oauth:token-type:id_token.  \nscope | `scope` | **Рекомендуемый**. Список областей, разделенных пробелами, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя.\n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange\u0026\nsubject_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[сокращенно для краткости].NorYsi-Ht826HUFCEArVZ60_dEUmYiJYXubnTyweIMg\u0026\nsubject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt\n```\n\n###### * Хоть это и не определено спецификацией, но сервер авторизации примет запрос и в формате JSON (Content-Type: `application/json`) \n\nЕсли учётные данные клиента корректны и у переданного маркера доступа не истек срок, то сервер авторизации вернёт новый маркер краткосрочного доступа и новый маркер обновления.\n\n### Использование маркера JWT в качестве гранта авторизации\n\n* Данный тип гранта позволяет авторизоваться в системе по данным из JWT маркера выпущенного другой (внешней) системой, например Google.\n\n**Параметры запроса:**\n\nПоле | Значение | Описание\n------------ | :------------: | ------------\nclient_id | `client_id` | **Обязательный**. Идентификатор клиента.\nclient_secret | `client_secret` | **Обязательный**. Секрет клиента.\ngrant_type | urn:ietf:params:oauth:grant-type:jwt-bearer | **Обязательный**. Это поле должно содержать значение urn:ietf:params:oauth:grant-type:jwt-bearer.\nassertion | `assertion` | **Обязательный**. Маркер JWT выданный другой (внешней) системой.\n\n* Согласно [спецификации](https://tools.ietf.org/html/rfc6749#section-2.3.1) OAuth 2.0, параметры авторизации клиента (`client_id` и `client_secret`) могут быть переданы как в теле запроса так и в HTTP заголовке `Authorization` (HTTP Basic authentication).\n\n```\nAuthorization: Basic d2ViLXNlcnZpY2UucnU6Y2xpZW50IHNlY3JldA==   \n```\n\n**Пример зпроса:**\n\n```http request\nPOST http://localhost:8080/oauth2/token\nContent-Type: application/x-www-form-urlencoded\n \nclient_id=YOUR-CLIENT-ID\u0026\nclient_secret=YOUR-CLIENT-SECRET\u0026\ngrant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer\u0026\nassertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.[сокращенно для краткости].NorYsi-Ht826HUFCEArVZ60_dEUmYiJYXubnTyweIMg\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapostoldevel%2Fmodule-authserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapostoldevel%2Fmodule-authserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapostoldevel%2Fmodule-authserver/lists"}