Авторизация Google OAuth 2 - ошибка: redirect_uri_mismatch

386

На веб-сайте https://code.google.com/apis/console я зарегистрировал свое приложение, настроил сгенерированный идентификатор клиента: и Client Secret для своего приложения и попытался войти в систему с помощью Google. К сожалению, я получил сообщение об ошибке:

Error: redirect_uri_mismatch
The redirect URI in the request: http://127.0.0.1:3000/auth/google_oauth2/callback did not match a registered redirect URI

scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
response_type=code
redirect_uri=http://127.0.0.1:3000/auth/google_oauth2/callback
access_type=offline
approval_prompt=force
client_id=generated_id

Что означает это сообщение, и как я могу это исправить? Я использую драгоценный камень omniauth-google-oauth2 .

user984621
источник
Если у вас есть другие проблемы, обратите внимание, что вы можете устранить эту проблему, открыв URL-адрес, как https://accounts.google.com/o/oauth2/auth?client_id={client_id}&response_type=token&redirect_uri={redirect_uri}&scope={scope}в браузере, вместо запуска всего приложения для тестирования.
Джек М
Я заметил, Google автоматически связывает redirect_uri в двойных кавычках в (redirect_uri = "what") выше URL, и приводит к этой ошибке. Если я уберу эти двойные кавычки, я смогу перейти к следующему экрану. Теперь, как мы можем избежать этих двойных кавычек, так как они автоматически перенаправляются самим Google.
Абхишек Сони

Ответы:

389

URI перенаправления (куда возвращается ответ) должен быть зарегистрирован в консоли API, и ошибка указывает на то, что вы этого не сделали или сделали не правильно.

Перейдите в консоль для вашего проекта и посмотрите под API Access. Вы должны увидеть свои client ID& client secretтам, вместе со списком URI перенаправления. Если требуемый URI отсутствует в списке, нажмите «Изменить настройки» и добавьте URI в список.

РЕДАКТИРОВАТЬ: (Из комментария с высокой оценкой ниже) Обратите внимание, что обновление консоли API Google и это изменение может занять некоторое время. Обычно всего несколько минут, но иногда кажется, что это дольше.

Стив Базил
источник
9
Есть какая-то магия, потому что, когда я попробовал тот же самый обратный вызов час назад, он не работал, но теперь он работает. В любом случае, спасибо!
user984621
337
Столкнулся с аналогичной проблемой, и хотел заметить, что обновление консоли API Google и это изменение может занять некоторое время. Обычно всего несколько минут, но иногда кажется, что это дольше.
Сдолфин
31
Позвольте мне завершить ответ @ Bazyl: в полученном мной сообщении они упомянули URI " localhost: 8080 " (который, конечно, кажется внутренней конфигурацией Google). Я изменил авторизованный URI для этого, " localhost: 8080 ", и сообщение больше не появлялось ... И видео загрузилось ... Документация APIS ОЧЕНЬ хромая ... Каждый раз, когда у меня что-то работает с google apis, я просто чувствую себя "счастливчиком", но не хватает хорошей документации об этом .... :(
David L
7
Откройте приватное / инкогнито окно в вашем браузере и попробуйте снова. Иногда это решает проблему кеширования.
Дунк
17
Google не имеет параметров для URI перенаправления в консоли Google в «Api & Auth> Credentials». Не имеет значения, если я создаю новый Client Id или создаю новый ключ, просто нет способа указать URI перенаправления из консоль гугл.
user3338098
114

В моем случае это был wwwи non-wwwURL. Фактический сайт имел wwwURL, а URL авторизованного перенаправления в консоли разработчика Google имели non-wwwURL. Следовательно, произошло несоответствие в URI перенаправления. Я решил это путем обновления Authorized Redirect URIsв консоли разработчика Google до wwwURL.

Другие распространенные несоответствия URI:

  • Использование http://в URI авторизованного перенаправления и в https://качестве фактического URL-адреса, или наоборот
  • Использование конечной косой черты ( http://example.com/) в URI авторизованного перенаправления и отсутствие конечной косой черты ( http://example.com) в качестве фактического URL-адреса или наоборот

Вот пошаговые снимки экрана консоли разработчика Google, чтобы тем, кому трудно найти страницу консоли разработчика, чтобы обновить URI перенаправления.

  1. Перейдите на страницу https://console.developers.google.com.

  2. Выберите свой проект

Выберите свой проект

  1. Нажмите на значок меню

Нажмите на значок меню

  1. Нажмите на API Managerменю

Выберите меню API Manager

  1. Нажмите на Credentialsменю. И под OAuth 2.0 Client IDs, вы найдете свое имя клиента. В моем случае это так Web Client 1. Нажмите на него, и появится всплывающее окно, где вы можете редактировать авторизованный URI- адрес Javascript и авторизованный URI перенаправления .

Выберите меню «Учетные данные»

Вот статья Google о создании проекта и идентификатора клиента .

Мукеш Чапагейн
источник
9
Этот ответ действительно нужно подтолкнуть выше, поскольку он дает реальный ответ. У нас была точно такая же проблема, и это помогло решить ее - спасибо!
Винна
4
Моя проблема была в том, что я знал, что делать, но не в том, где его найти в пользовательском интерфейсе. Скриншоты тут помогли. Спасибо.
Аллен
3
Я оставил авторизованные источники JavaScript пустыми и авторизованные URI перенаправления как 127.0.0.1/google_account/authentication, и это сработало у меня.
Криш
1
Можете ли вы помочь мне с моим вопросом? stackoverflow.com/questions/37307612/…
LatentDenis
Помоги мне, пожалуйста. stackoverflow.com/questions/41270512/…
Неразрушимый
91

Если вы используете кнопку JavaScript javascript , вам придется использовать postmessageвместо фактического URI. Мне потребовался почти весь день, чтобы понять это, поскольку в документах Google по какой-то причине не указано четко.

Майк Кескинов
источник
8
Так как этот вопрос является главным хитом при поиске сообщения об ошибке, вот несколько дополнительных указателей. Как говорит Майк, используйте «postmessage» для своего URI перенаправления. Вам нужно указать это в 2 местах (если вы используете поток web-app-server-flow). Один из них находится в кнопке g-signin на javascript. Другой - в клиенте авторизации печатей в коде вашего сервера.
Роб Уайтсайд
отличный ответ. Я отправлял сообщения с помощью javascript, и мне нужно было установить 'oauth2_redirect_uri' => 'postmessage' в файле google API config.php.
user2998553
4
postmessage звучит хорошо, но это приводит к бесполезномуError: invalid_request origin parameter is required!
user3338098
10
Потратив несколько часов на решение этой проблемы, ваш ответ мне очень поможет! Документация Google не очень понятна. На стороне сервера, если вы используете клиентскую библиотеку Google API, вы должны использовать этот код: $client->setRedirectUri('postmessage');вместо$client->setRedirectUri('http://your.url...');
Guicara
3
Ух ты ... Решение @Guicara сработало для меня после нескольких часов стука головы о стену.
djthoms
52

В любом потоке, в котором вы получили код авторизации на стороне клиента, например, GoogleAuth.grantOfflineAccess()API , и теперь вы хотите передать код на сервер, выкупить его, сохранить токены доступа и обновить, тогда вам придется использовать буквенную строку postmessageвместо redirect_uri.

Например, на основе фрагмента в документе Ruby :

client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json')
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'profile https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'postmessage' # <---- HERE
)

# Inject user's auth_code here:
auth_client.code = "4/lRCuOXzLMIzqrG4XU9RmWw8k1n3jvUgsI790Hk1s3FI"
tokens = auth_client.fetch_access_token!
# { "access_token"=>..., "expires_in"=>3587, "id_token"=>..., "refresh_token"=>..., "token_type"=>"Bearer"}

Единственная документация Google, которую можно упомянуть, postmessage- это старый документ для входа в Google+ . Вот скриншот и ссылка на архив, так как G + закрывается, и эта ссылка, вероятно, исчезнет:

Legacy Google+ API DOC

Абсолютно непростительно, что страница документации для автономного доступа не упоминает об этом. #FacePalm

Джефф Уорд
источник
1
Черт возьми, ваш пост казался совершенно нелогичным, но это было единственное, что сработало, как талисман. Большое спасибо, чувак !!!
Mariobgr
@mariobgr Да, здесь упоминаются другие ответы postmessage, но я хотел бы привести конкретные обстоятельства (например grantOfflineAccess), когда мне понадобился этот сумасшедший недокументированный взлом. : PI тоже не хотел, чтобы это было правдой. :) Стоит мне часами головной боли.
Джефф Уорд
Спасибо! Это именно то, что мне было нужно.
Эрнбрн
Это должно привлечь внимание Google. Это абсолютно ужасно.
поляна
Невероятно, но это правда ... O__o
mlb
41

Для моего веб-приложения я исправил свою ошибку, написав

instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/
Гувен Сезгин Курт
источник
Спасибо, что поделился, это помогает. Я застрял на этом, потому что API GitHub OAuth2 не требует от вас удаления номера порта.
Флорисла
Это сработало и для меня. Я следовал этому курсу: asp.net/mvc/overview/security/… и получал «ошибку перенаправления uri». После того, как я изменил localhost: 44334 / signin-google на localhost / signin-google, все заработало . Большое спасибо за полезный совет.
FrenkyB
1
Огромное спасибо. Я проводил тестирование с этим github.com/google/google-api-dotnet-client-samples и «URI перенаправления в запросе», по-видимому, был из другого порта каждый раз, когда я запускал его. Это мне очень помогло. Потребовались бы часы, чтобы понять, что происходит!
Алехандро Лоздзейски
Спасибо, это сработало и для меня. Просто брось порт! :)
виджет
30

Обязательно проверьте протокол "http: //" или "https: //", так как Google также проверяет протокол. Лучше добавить оба URL в список.

Chintan
источник
10
Я хотел бы прокрутить ваш ответ двумя часами ранее
BiAiB
2
Нет, лучше просто убедиться, что вы используете https.
Брэд Кох
7

Это кажется довольно странным и раздражающим, что единого решения не существует. для меня http: // localhost: 8000 не сработало, но http: // localhost: 8000 / сработало.

arshpreet
источник
2
это потому, что redirect_uriна консоли разработчика и в вашем приложении должен быть Точный матч.
Тони Гил
6

Когда вы регистрируете свое приложение на https://code.google.com/apis/console и создаете идентификатор клиента, вы получаете возможность указать один или несколько URI перенаправления. Значение redirect_uriпараметра в вашем URI аутентификации должно точно соответствовать одному из них.

Касир
источник
И именно с этим полем возникают проблемы с глубокими ссылками на основе Angular, поскольку Google не согласен [ landed1.github.io/videos.html#/oauth2callback]is действительный URL
приземлился
2
Кажется, что URL https://code.google.com/apis/consoleбольше не действителен
Энтони Конг
Спасибо @AnthonyKong за ваше обновление. Я изменил URL, чтобы жить один. Пожалуйста, проверьте сейчас.
Катир
6

Этот ответ так же , как ответить на этот вопрос Майка , и ответ Джеффа , оба набора redirect_uriна postmessageна стороне клиента. Я хочу добавить больше о стороне сервера, а также об особых обстоятельствах, применимых к этой конфигурации.

Tech Stack

Backend

Внешний интерфейс

Поток «Код» (специально для Google OAuth2)

Описание: React -> запросить «код» социальной авторизации -> запросить токен jwt для получения статуса «логин» с точки зрения вашего собственного внутреннего сервера / базы данных.

  1. Frontend (React) использует «кнопку входа Google», responseType="code"чтобы получить код авторизации. (это не токен, не токен доступа!)
    • Кнопка входа в Google из react-google-loginвышеупомянутых.
    • Нажатие на кнопку откроет всплывающее окно для пользователя, чтобы выбрать учетную запись. После того как пользователь выберет один и окно закроется, вы получите код из функции обратного вызова кнопки.
  2. Интерфейс отправляет это на конечную точку JWT внутреннего сервера.
    • POST запрос, с { "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
  3. Для моего сервера Django я использую Django REST Framework JWT + Django REST Social Auth. Django получает код от внешнего интерфейса, проверьте его с помощью сервиса Google (сделано для вас). После проверки он отправит JWT (токен) обратно во внешний интерфейс. Теперь интерфейс может собрать токен и хранить его где-нибудь.
    • Все REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI, REST_SOCIAL_DOMAIN_FROM_ORIGINи REST_SOCIAL_OAUTH_REDIRECT_URIв Джанго, settings.pyне нужны . (Это константы, используемые Django REST Social Auth) Короче говоря, вам не нужно ничего настраивать, связанные с перенаправлением URL в Django . "redirect_uri": "postmessage"В React внешнего интерфейса достаточно. Это имеет смысл, потому что социальная работа по аутентификации, которую вы должны выполнить на своей стороне, - это все POST-запросы в стиле Ajax во внешнем интерфейсе, без отправки какой-либо формы, поэтому по умолчанию перенаправление не происходит. Вот почему URL-адрес перенаправления становится бесполезным, если вы используете поток кода + JWT, а настройка URL-адреса перенаправления на стороне сервера не дает никакого эффекта.
  4. Django REST Social Auth управляет созданием аккаунта. Это означает, что он проверит адрес электронной почты / фамилию учетной записи Google и выяснит, соответствует ли она какой-либо учетной записи в базе данных. Если нет, он создаст его для вас, используя точную электронную почту и фамилию. Но имя пользователя будет примерно таким, как youremailprefix717e248c5b924d60если бы ваш адрес электронной почты был youremailprefix@example.com. Он добавляет некоторую случайную строку для создания уникального имени пользователя. Это поведение по умолчанию, я считаю, что вы можете настроить его и свободно копаться в их документации.
  5. Внешний интерфейс хранит этот токен, и когда он должен выполнить CRUD для внутреннего сервера, особенно создать / удалить / обновить, если вы прикрепите токен в свой Authorizationзаголовок и отправите запрос к внутреннему интерфейсу, серверный интерфейс Django теперь распознает его как имя входа, то есть аутентифицированное пользователь. Конечно, если ваш токен истекает, вы должны обновить его, сделав еще один запрос.

О, боже мой, я потратил более 6 часов и наконец понял это правильно! Я считаю, что это первый раз, когда я увидел эту postmessageвещь. Любой, кто работает над Django + DRF + JWT + Social Auth + Reactкомбинацией, обязательно столкнется с этим. Я не могу поверить, что ни одна из статей там не упоминает об этом, кроме ответов здесь. Но я очень надеюсь, что этот пост сэкономит вам массу времени, если вы используете стек Django + React.

Шаунг Ченг
источник
5

2015July15 - вход, который работал на прошлой неделе с этим скриптом при входе в систему

<script src="https://apis.google.com/js/platform.js" async defer></script>

перестал работать и начал вызывать ошибку 400 с Error: redirect_uri_mismatch

и в разделе ДЕТАЛИ: redirect_uri=storagerelay://...

я решил это, изменив на:

<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>
Тони Гил
источник
Обнаружена та же ошибка 400, но изменение сценария не работает внутри моего Cordova WebView.
Ник Спейсек,
@NickSpacek, пожалуйста, проверьте, были ли недостающие двойные кавычки.
Тони Гил
Вы можете помочь мне с моим вопросом? stackoverflow.com/questions/37307612/…
LatentDenis
5

Контрольный список:

  • httpили https?
  • &или &amp;?
  • косая черта ( /) или открытая ?
  • (CMD/CTRL)+F, найдите точное совпадение на странице учетных данных. Если не найден, ищите недостающий.
  • Подождите, пока Google обновит его. Может случиться через каждые полчаса, если вы часто переодеваетесь или он может оставаться в бассейне. Для моего случая это было почти полчаса, чтобы вступить в силу.
itsazzad
источник
4

В моем случае мой тип приложения - «Другое». Так что я не могу найти Authorized redirect URIsна странице учетных данных. Кажется, появляется в Тип приложения: «Веб-приложение». Но вы можете нажать на Download JSONкнопку, чтобы получить client_secret.jsonфайл. введите описание изображения здесь

Открыть файл в формате JSON, и вы можете найти параметр , как это: "redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]. Я решил использовать http: // localhost, и он прекрасно работает для меня.

codezjx
источник
помогите мне, пожалуйста stackoverflow.com/questions/41270512/…
нерушимый
4

URL перенаправления чувствителен к регистру.

В моем случае я добавил оба: http: // localhost: 5023 / AuthCallback / IndexAsync http: // localhost: 5023 / authcallback / indexasync

H3N
источник
1
И будьте осторожны с символом "/" в конце URL. Иногда это необходимо, а иногда нет.
Аджмена
чтобы мы могли хранить localhost как request_uri даже для живых сайтов?
Нерушимый
4

Ни одно из вышеперечисленных решений не помогло мне. ниже сделал

изменить авторизованные URL-адреса перенаправления на - https: // localhost: 44377 / signin-google

Надеюсь, это кому-нибудь поможет.

Дирадж Палагири
источник
если мы используем localhost, это будет работать и для опубликованного сайта. Я имею в виду, если в консоли API я добавляю URI запроса localhost. Как это будет работать, когда сайт заработает? Или для живых сайтов нам нужно поместить другой набор фактических URI в консоль API?
Нерушимый
4

Остерегайтесь лишнего /в конце URL http://localhost:8000отличается отhttp://localhost:8000/

Wolfgang
источник
Это то, что помогло мне :)
Яцек Гурай,
3

Пользователи Rails (из документации omniauth-google-oauth2 ):

Исправление несоответствия протокола для redirect_uri в Rails

Просто установите full_host в OmniAuth на основе Rails.env.

# config / initializers / omniauth.rb

OmniAuth.config.full_host = Rails.env.production? ? ' https://domain.com ': ' http: // localhost: 3000 '

ПОМНИТЕ: Не включайте в конце "/"

brntsllvn
источник
2

для меня это было потому, что в списке «URI авторизованного перенаправления» я неправильно поставил https://developers.google.com/oauthplayground/вместо https://developers.google.com/oauthplayground(без /конца).

Яцек Гурай
источник
1

Позвольте мне завершить ответ @ Bazyl: в полученном мною сообщении упоминается URI "http://localhost:8080/" (который, конечно, выглядит как внутренняя конфигурация Google). Я изменил авторизованный URI для этого "http://localhost:8080/", и сообщение больше не появлялось ... И видео загрузилось ... Документация APIS ОЧЕНЬ хромает ... Каждый раз, когда у меня что-то работает с google apis, я просто чувствую себя "везучим", но не хватает хорошей документации об этом .... :( Да, у меня все получилось, но я пока не понимаю, почему это не удалось, и почему это сработало ... Был только ОДИН место для подтверждения URI в сети, и оно было скопировано в client_secrets.json ... Я не получаю, если есть ТРЕТЬЕ место, где нужно написать тот же URI ... Я нахожу не только документацию, но и GUI дизайн Google '

Дэвид Л
источник
1

Любой, кто пытается найти, где установить URL-адреса перенаправления в новой консоли: APIs & Auth -> Credentials -> идентификаторы клиента OAuth 2.0 -> Нажмите на ссылку, чтобы найти все ваши URL-адреса перенаправления

Steji
источник
1

Мне нужно было создать новый идентификатор клиента в разделе «APIs & Services» -> «Учетные данные» -> «Создать учетные данные» -> OAuth -> «Другие».

Затем я скачал и использовал client_secret.json с моей программой командной строки, которая загружается в мою учетную запись YouTube. Я пытался использовать идентификатор клиента OAuth веб-приложения, который выдавал мне ошибку URI перенаправления в браузере.

Джеймс Т.
источник
0

Попробуйте сделать эти проверки:

  1. Идентификатор пакета в консоли и в вашем приложении. Я предпочитаю устанавливать Bundle ID приложения, например, «org.peredovik. $ {PRODUCT_NAME: rfc1034identifier}»
  2. Проверьте, добавили ли вы типы URL-адресов на вкладке «Информация», просто введите свой идентификатор пакета в «Идентификатор» и «Схемы URL-адресов», для роли установите значение «Редактор».
  3. В консоли на cloud.google.com "APIs & auth" -> "Экран согласия" заполните форму о вашем приложении. Поле «Название продукта» обязательно для заполнения.

Наслаждаться :)

Влад
источник
0

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

установленные приложения: http: // localhost [URI перенаправления] В этом случае localhost просто работает

веб-приложения: вам нужно действительное имя домена [URI перенаправления:]

Бхуван Гаутам
источник
0

Что вам нужно сделать, это вернуться в консоль разработчика и перейти к API-интерфейсам и авторизации> Экран согласия и заполнить его. В частности, название продукта.

Codetard
источник
Кроме того, не используйте название продукта, которое также используется в другом проекте. Убедитесь, что это уникально.
Флорисла
0

Не забудьте указать путь после вашего домена и IP. В моем случае я забыл:

/ oauth2callback

Matrym
источник
помогите мне, пожалуйста stackoverflow.com/questions/41270512/…
нерушимый
0

У меня было два URI запроса в консоли : http: // xxxxx / client / api / spreadsheet / authredirect и http: // localhost .

Я попробовал все лучшие ответы на этот вопрос и подтвердил, что ни один из них не был моей проблемой.

Я удалил localhost из консоли, обновил свой client_secret.json в моем проекте, и ошибка рассогласования исчезла.

Павел
источник
0

У меня была та же проблема с входом в Google, я собирался вырвать мои волосы !!! Я правильно ввел свои обратные вызовы на панели учетных данных Google на консоли разработчика Google, вот мои URL-адреса перенаправления:

https://www.example.com/signin-google

https://www.example.com/signin-google/

https://www.example.com/oauth2callback

https://www.example.com/oauth2callback/

каждая вещь кажется в порядке, верно? но он все еще не работал, пока я не добавил еще один волшебный URL - адрес. Я добавил signin-google url (который является обратным вызовом Google по умолчанию) без www и проблема решена.

Примите это во внимание (в зависимости от вашего домена), вам может понадобиться, а может и нет, добавлять как с URL-адресами, так и без них.

Code_Worm
источник
0

У меня есть приложение внешнего интерфейса и интерфейс API.

Со своего бэкэнд-сервера я тестировал, нажав google api, и столкнулся с этой ошибкой. В течение всего моего времени я задавался вопросом, почему я должен давать, redirect_uriпоскольку это всего лишь бэкэнд, для внешнего интерфейса это имеет смысл.

То, что я делал, давало другое redirect_uri(хотя и действительное) от сервера (при условии, что это просто заполнитель, его нужно только зарегистрировать в Google), но мой URL-адрес внешнего интерфейса, который создал код токена, был другим. Поэтому, когда я проходил этот код при тестировании на стороне сервера (для которого redirect-uri отличался), я столкнулся с этой ошибкой.

Так что не делайте эту ошибку. Убедитесь, что ваш веб-интерфейс redirect_uriсовпадает с вашим сервером, так как Google использует его для проверки подлинности.

Омаир Азам
источник
0

Ниже приведены причины ошибки: возникает проблема redirect_uri_mismatch:

  1. Пустое поле перенаправить URL в вашем проекте Google.
  2. URL перенаправления не соответствует вашему сайту
  3. Важный! Он будет работать только с рабочим доменом, таким как example.com, book.com и т. Д. (Не работает с локальным хостом или AWS LB URL)

Рекомендуется использовать домен URL

Вернит Гупта
источник
Что нужно сделать, если Google постоянно генерирует неверный параметр redirect_uri? Он генерируется как localhost: XXXXX со случайным номером порта, игнорируя перенаправление, которое я настроил при создании клиента.
А. Макаревич
0

Хитрость заключается в том, чтобы ввести правильный URL перенаправления в точке создания идентификатора. Я обнаружил, что обновление URL-адреса перенаправления после создания идентификатора с помощью «Редактирования» просто не выполняет работу. Для меня также работало дублирование всей папки «vendor» и копирование ее в то же место, где находится файл «oauth» (до тех пор, пока вы успешно не сгенерируете токен, а затем не сможете удалить дубликат папки «vendor»). Это потому, что попытка указать на папку поставщика через «../vendor/autoload» не сработала для меня.

Итак, удалите существующий проблемный идентификатор клиента OAuth и попробуйте этот подход, он будет работать.

Раймонд Вачага
источник