2015-02-10 5 views
3

Задавая для маркеров доступа с использованием URL как это (клиентская учетные данные как тип гранта):Получить токен обновления с FOSOAuthServerBundle

http://api.local/app_dev.php/oauth/v2/token?client_id=<client_id>&client_secret=<secret>&grant_type=client_credentials 

Я получаю следующий ответ JSON:

{ 
access_token: "XXXXXXXXXXX", 
expires_in: 3600, 
token_type: "bearer", 
scope: "user" 
} 

Обновления экрана отсутствует токен, любая идея, почему это может быть?

Мои FOSOAuthServerBundle в config.yml:

fos_oauth_server: 
    db_driver: orm 
    client_class:  Acme\ApiBundle\Entity\Client 
    access_token_class: Acme\ApiBundle\Entity\AccessToken 
    refresh_token_class: Acme\ApiBundle\Entity\RefreshToken 
    auth_code_class:  Acme\ApiBundle\Entity\AuthCode 
    service: 
     user_provider: platform.user.provider 
     options: 
      supported_scopes: user 

UPDATE

Клиент Entity делает вызов конструктора в материнской компании (находится в FOSOAuthServerBundle):

namespace Acme\ApiBundle\Entity; 

use FOS\OAuthServerBundle\Entity\Client as BaseClient; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
*/ 
class Client extends BaseClient 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 
} 

ответ

2

Florent is right, client_credentials не должен включать токен обновления по умолчанию. Однако он включен в более раннюю версию, которую я использую, поэтому я был в замешательстве.

Я предлагаю пойти на получение типа authorization_code или password, если это возможно. Если вам действительно нужно выставить токен обновления для client_credentials, я думаю, вы могли бы расширить/переопределить класс OAuth2 и переопределить метод grantAccessTokenClientCredentials, вызвав родителя и удалив 'issue_refresh_token' => false из возвращаемого результата.

Вы можете переопределить OAuth2, поставив его в вашем services.yml (До тех пор, как ваш пакет имеет «FOSOAuthServerBundle» в качестве родителя):

parameters: 
    fos_oauth_server.server.class: YourNS\YourBundle\Service\YourOauth2 
+0

Я обновил ответ с информацией об объекте Клиента. – rfc1484

+0

Я имею в виду в базе данных, проверьте свою таблицу клиентов, для используемого вами идентификатора, разрешен ли столбец allow_grant_types (сериализованный массив), содержит refresh_token? –

+0

Он присутствует в сериализованном массиве, но его значение пусто. – rfc1484

2

Проблема в знак обновления с использованием client_credentials является необязательным (см. RFC6749#section-4.4.3): Рефлекторный токен НЕ ДОЛЖЕН быть включен..

Это не ошибка, а нормальное поведение этого пучка.

+0

Однако, когда я создаю клиент, я также прошу обновить тип предоставления токенов. Даже если это необязательно, этого должно быть недостаточно? Команда, которую я использую для создания клиента: 'php app/console acme: oauth-server: client: create --redirect-uri =" http: //api.local/authorize "--grant-type =" authorization_code "- -grant-type = "password" --grant-type = "refresh-token" --grant-type = "token" --grant-type = "client_credentials" ' – rfc1484

Смежные вопросы