FOSOAuthServerBundle: недопустимый параметр grant_type или параметр отсутствует

Я пытаюсь построить REST API, используя Symfony 3.1 и FOSRestBundle, FOSUserBundle и FOSOAuthServerBundle. Мне удалось достичь этого, следуя руководству на https://gist.github.com/tjamps/11d617a4b318d65ca583 .

Теперь я борюсь с процессом аутентификации. Когда я делаю POST-запрос на сервер для аутентификации (localhost: 8000/oauth/v2 / token) с параметрами, закодированными в JSON в теле запроса:

{
    "grant_type": "password",
    "client_id": "1_myveryverysecretkey",
    "client_secret": "myveryverymostsecretkey",
    "username": "theuser",
    "password": "thepassword"
}

Дополнительные заголовки HTTP следующие:

Accept: application/json
Cache-Control: no-store, private
Connection: close
Content-Type: */json

Клиент в таблице БД oauth2_client имеет тип grant_type «password»a:1:{i:0;s:8:"password";}, как указано в руководстве.

Сервер принимает запрос, но я всегда получаю ответ

{"error":"invalid_request","error_description":"Invalid grant_type parameter or parameter missing"}

Есть предложения, что мне не хватает? Спасибо!

3 ответа

  1. У меня была та же проблема. Похоже, fosOAuthBundle не принимает json. если вы отправляете запрос с полями формы, он будет работать.

  2. Это связано с тем, что FOSRestBundle использует прослушиватель тела, который преобразует подчеркнутые ключи в case camel. Таким образом , параметры , которые получает ваш сервер OAuth2, не grant_typeявляются, а скорееgrantType, которые он не может обработать, и поэтому он дает вам эту ошибку.

    Решение для этого было бы использовать пользовательский нормализатор массива на прослушивателе тела FOS rest.

  3. действительно прослушиватель тела FOSRestBundle является основной «причиной» этой проблемы.

    Конфигурация нормализатора массива

    fos_rest:
        body_listener:
            array_normalizer: fos_rest.normalizer.camel_keys 
    

    он преобразуется _в формат camel case.

    Решение было удалить его моей конфигурации на данный момент.

    повторный вызов /oauth/v2/tokenконечной точки:

    {
        "access_token": "NDBlZGViN2YwZGM5MTQ3ZTgwN2FhOGY4MDU4MTc1MTY2YzZmOThlMTdkM2JiZDJmMDVmNTg3MjU4N2JmODY3ZA",
        "expires_in": 3600,
        "token_type": "bearer",
        "scope": null,
        "refresh_token": "MDRiODllNjlhZWYxZjI5MjlhMzAxNGVhMDY5NjQxMmVmNDE5MzY3YzU0MGM0MDU1ZTVlY2Y2Zjg4ZTYyYzU3Mw"
    }