Symfony FOSOAuthServerBundle以编程方式获取令牌


使用

FOSOAuthServerBundle 的标准端点(使用 FOSUserBundle),我可以通过提供client_id、client_secret、用户和密码组合来检索访问和刷新令牌。响应如下所示:

{
  "accessToken": "YTg2ZTJkNTY2MGM5MGQyNzZjYjkyZWMwYzg1YTZmZTZmOTIyMzAxNDY2MTkwZDU5ODYzZTAzYmIyNDI0YTQ4ZQ",
  "expiresIn": 3600,
  "tokenType": "bearer",
  "refreshToken": "OTU1MGZhNDQ2ODFkZDUzMmQ4Y2FhNTk5OWM0NWFlNDk0YTY0ZDZhOTRjZTUwM2JlYTE3MDkxYzU3ZWY1OGRkYQ"
}

我的问题是,如何通过传入客户端和用户凭据以编程方式检索类似的数据? 即,我怎样才能从应用程序的另一部分进行相同的调用,而不通过HTTP(慢),而是直接通过捆绑代码(快)?

我确信一定有一种简单的方法可以做到这一点,但到目前为止我能找到的最好的是这个 https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/347 它并没有真正实现与 HTTP 调用相同的目标。

以下是使用请求对象直接从 fos_oauth_server.server 服务获取相同响应的方法:

$grantRequest = new Request(array(
        'client_id'  => $clientId,
        'client_secret' => $clientSecret,
        'grant_type' => 'password',
        'username' => $username,
        'password' => $password
    ));
$tokenResponse = $this->get('fos_oauth_server.server')->grantAccessToken($grantRequest);
$token = $tokenResponse->getContent();

我的理解是您使用的是密码授予类型。这将要求应用程序知道用户和密码对才能获取令牌。我建议改用client_credentials赠款类型。

使用 FOSOAuthServerBundle,您应该能够获得类似(在 ContainerAware 上下文中)的访问令牌

$this->get('fos_oauth_server.server')->grantAccessToken($request)
在这里,您可以

看到一个请求对象是必需的,但您可以轻松伪造此对象

或者你可以尝试

$this->get('fos_oauth_server.server')->createAccessToken($client, null)

其中$client是 OAuth 客户端的实例。

相关内容

  • 没有找到相关文章