Мы проверили наличие проблем с неправильными файлами и дублированием определений.
PHP-FPM был перезапущен после последних исправлений, поэтому это не проблема со старым процессом PHP или состоянием opcache.
Полностью новый запрос DiscourseConnect после этих изменений по-прежнему не проходит валидацию HMAC.
Другими словами, текущая ошибка воспроизводится при новом запросе.
Что нам пока не удалось доказать
Что эффективный секрет, используемый Discourse во время выполнения, побайтово идентичен секрету, используемому WordPress.
Что полезная нагрузка sso не изменяется где-либо до момента, когда WordPress наблюдает запрос.
На данном этапе мы не хотим продолжать слепое изменение настроек или кода.
Вопрос
Для текущих версий Discourse/DiscourseConnect, какой лучший способ определить, какая именно полезная нагрузка и секрет используются Discourse при расчете ожидаемого HMAC?
Существует ли рекомендуемый метод отладки/логирования, который позволил бы нам сравнить входные данные для HMAC на стороне Discourse с входными данными на стороне WordPress, не раскрывая фактический секрет публично?
Если есть известные проблемы, связанные с обработкой WordPress/PHP, кодированием URL, полезными нагрузками Base64, обратными прокси или хостинговым Discourse, которые могли бы привести к такой ситуации, я буду благодарен за указания.
При необходимости я могу предоставить очищенные значения запроса/callback, соответствующий код WordPress и логи.
Привет, Ричард. WP-Discourse установлен, но его провайдер DiscourseConnect и функции синхронизации входа отключены.
Мы используем небольшой собственный плагин WordPress в качестве провайдера DiscourseConnect. Он получает параметры sso и sig от Discourse, проверяет входящий HMAC с использованием общего секрета, а затем формирует и подписывает ответ для отправки обратно в Discourse.
В настоящее время сбой происходит на этапе входящего запроса от Discourse к WordPress — наша свежая диагностика показывает, что пересчитанный HMAC не совпадает с полученным от Discourse sig.
Буду рад опубликовать соответствующий PHP-код обратного вызова/валидации. Перед публикацией я удалю значения конфигурации и секреты.
Очевидным решением было бы использовать плагин WP-Discourse, но, скорее всего, у вас есть веские причины, чтобы этого не делать.
Да, пожалуйста, опубликуйте код.
Да — вы правы. В исходном сообщении я перепутал формулировки.
Текущий сбой происходит в направлении Discourse → WordPress.
Discourse формирует запрос DiscourseConnect, содержащий sso и sig. WordPress получает его, и наш собственный провайдер EA пытается проверить подпись. Проверка входящего HMAC не проходит, поэтому WordPress останавливается на этом этапе. Он не доходит до этапа отправки данных аутентифицированного пользователя обратно в Discourse.
WP-Discourse установлен, но его провайдер DiscourseConnect и функции синхронизации при входе пользователей отключены. В настоящее время мы используем собственный провайдер EA, так как хотим, чтобы слой аккаунта/профиля EA оставался под нашим контролем.
Ниже я приведу соответствующий код обратного вызова/конфигурации/проверки HMAC, удалив все секреты и частные настройки.
Спасибо, Ричард. Я проверил этот момент с учётом обработки запросов в PHP/WordPress и текущего потока подписи в Discourse.
В нашем колбэке мы читаем данные из $_GET, поэтому PHP уже декодировал параметры запроса из URL до того, как EA их получает. wp_unslash() лишь отменяет экранирование запросов WordPress; он не выполняет URL-декодирование.
Применение urldecode() снова на этом этапе приведёт к двойному декодированию значения и может превратить + в Base64 в пробел, что само по себе нарушит HMAC.
Я также подтвердил, что наш свежий диагностический код по-прежнему не проходит проверку HMAC, даже после того как секреты WordPress и Discourse были исправлены и приведены в соответствие.
Поэтому я не считаю, что замена wp_unslash() на urldecode() является правильным решением для этого конкретного пути колбэка. Я продолжаю отслеживать, где подписанный пакет данных может расходиться до того, как он дойдёт до PHP.