3

当使用这样的 url 请求访问令牌时(客户端凭据作为授权类型):

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"
}

缺少刷新令牌,知道为什么会这样吗?

我在 config.yml 中的 FOSOAuthServerBundle:

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

更新

客户端实体调用父实体(位于 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();
    }
}
4

2 回答 2

2

Florent 是对的,client_credentials默认情况下不应该包含刷新令牌。但是,它包含在我正在使用的旧版本中,这就是我感到困惑的原因。

如果可能的话,我会建议选择 grant typeauthorization_codepassword。如果您确实需要为 公开刷新令牌client_credentials,我想您可以扩展/覆盖OAuth2该类并grantAccessTokenClientCredentials通过调用父级并'issue_refresh_token' => false从返回的结果中删除该方法来覆盖该方法。

您可以OAuth2通过在 services.yml 中添加以下内容来覆盖 (只要您的捆绑包具有 'FOSOAuthServerBundle' 作为父级):

parameters:
    fos_oauth_server.server.class: YourNS\YourBundle\Service\YourOauth2
于 2015-02-10T13:22:16.410 回答
2

使用刷新令牌的问题client_credentials是可选的(参见RFC6749#section-4.4.3):不应包含刷新令牌。.

这不是错误,而是此捆绑包的正常行为。

于 2015-02-10T15:54:00.183 回答