使用 FOSOAuthServerBundle 获取刷新令牌
Get refresh token with FOSOAuthServerBundle
当使用这样的 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();
}
}
Florent 是对的,client_credentials
默认情况下不应包含刷新令牌。然而,它包含在我使用的旧版本中,这就是我感到困惑的原因。
如果可能,我建议申请 authorization_code
或 password
类型的资助。如果你真的需要为 client_credentials
公开刷新令牌,我想你可以 extend/override OAuth2
class 并通过调用父类和覆盖方法 grantAccessTokenClientCredentials
从返回的结果中删除 'issue_refresh_token' => false
。
您可以通过将以下内容放入您的 services.yml 来覆盖 OAuth2
(只要您的包具有 'FOSOAuthServerBundle' 作为父项):
parameters:
fos_oauth_server.server.class: YourNS\YourBundle\Service\YourOauth2
使用 client_credentials
发布刷新令牌是可选的(参见 RFC6749#section-4.4.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();
}
}
Florent 是对的,client_credentials
默认情况下不应包含刷新令牌。然而,它包含在我使用的旧版本中,这就是我感到困惑的原因。
如果可能,我建议申请 authorization_code
或 password
类型的资助。如果你真的需要为 client_credentials
公开刷新令牌,我想你可以 extend/override OAuth2
class 并通过调用父类和覆盖方法 grantAccessTokenClientCredentials
从返回的结果中删除 'issue_refresh_token' => false
。
您可以通过将以下内容放入您的 services.yml 来覆盖 OAuth2
(只要您的包具有 'FOSOAuthServerBundle' 作为父项):
parameters:
fos_oauth_server.server.class: YourNS\YourBundle\Service\YourOauth2
使用 client_credentials
发布刷新令牌是可选的(参见 RFC6749#section-4.4.3):不应包含刷新令牌。.
这不是错误,而是此包的正常行为。