Проверка конечной точки уведомления не работает с конечной точкой Laravel - PullRequest
0 голосов
/ 19 декабря 2018

Я использую Microsoft Graph, и мне нужно настроить веб-крючок для получения изменений в электронной почте и событиях календаря.Мне удалось заставить его работать с моим приложением PHP Laravel, но теперь, когда я пытаюсь подписаться на уведомления, у меня возникают проблемы с проверкой notificationUrl, который указывает на мой публичный сервер.

Скрипт для создания веб-крюка возвращает следующую ошибку:

Client error: POST https://graph.microsoft.com/v1.0/subscriptions resulted in a 400 Bad Request response: 
{ 
  "error": { 
     "code": "InvalidRequest", 
     "message": "Subscription validation request failed. Response must ex (truncated...)

Мне кажется, что усеченная часть

Ошибка проверки подписки.На этот запрос нужно ответить 200 OK.

Вот мой код для создания подписки:

$data = [
    "changeType" => "created",
    "notificationUrl" => "https://anatbanielmethod.successengine.net/office365/webhooks/events",
    "resource" => "me/events",
    "expirationDateTime" => "2018-12-20T18:23:45.9356913Z",
    "clientState" => "secret",
];

$result = $graph->createRequest('POST', '/subscriptions')
    ->attachBody($data)
    ->execute();

, и вот мой метод для моего notificationUrl:

public function events()
{
    //if validationToken exists return that to validate notificationUrl
    if(isset($_REQUEST['validationToken'])){
        return response($_REQUEST['validationToken'], 200)
            ->header('Content-Type', 'text/plain');
    }

    //process event normally for those that have already been validated
}

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

Первоначально я настроил простой одностраничный PHP-скрипт для проверки правильности notificationUrl и этого простого сценария.работал нормально.Он успешно проверяет созданных Webhooks, которые указывают на это.Вот этот код скрипта на одну страницу:

<?php
    if(isset($_REQUEST['validationToken'])){
        echo $_REQUEST['validationToken']; // needed only once when subscribing
    } else {
      //process like normal not a validation Token request...
        }
    }

Итак, я ожидаю, что конечная точка Laravel будет работать как простой одностраничный PHP-скрипт, и это когда я тестирую оба URL в Postman, но конечную точку Laravelне проверяется, когда Office365 пытается проверить его при создании нового веб-крючка.

Я искал справку по этому вопросу и прочитал всю документацию Microsoft для разработчиков, которую я могу найти на веб-уроках, и это некоторые из наиболее полезных частей документации, но я до сих пор не могу найти ответ на этот вопрос.этот выпуск:

Есть идеи на этот счет?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Странно, что ответ JakeD требует использования ob_clean ().вот мой метод контроллера webhook в моем приложении Laravel 5.7.x:

use Illuminate\Http\Request;


public function webhook (Request $request) {
    if (filled($request->input('validationToken'))) {
        return response($request->input('validationToken'))
                ->header('Content-Type', 'text/plain');
    }


    // code to process the webhook after validation is complete
}

Я не вижу лишнего символа перевода строки, и подписка Microsoft Graph API проверена и создана.

0 голосов
/ 19 декабря 2018

Спасибо, Марк!Вы были правы в том, что проблема заключалась в переводе строки, я до сих пор не уверен, откуда берется перевод строки, и каким образом Laravel добавляет его.Излишне говорить, что я нашел решение, добавив "ob_clean ();"прямо перед возвратом ответа.Ниже мой обновленный метод messagesUrl:

public function events()
{
    //if validationToken exists return that to validate notificationUrl
    if(isset($_REQUEST['validationToken'])){

      ob_clean();//this line is cleaning out that previously added linefeed

      return response($_REQUEST['validationToken'], 200)
          ->header('Content-Type', 'text/plain');
    }

    //process event normally for those that have already been validated
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...