Symfony FOSOAuthServerBundle 以编程方式获取令牌?
Symfony FOSOAuthServerBundle get tokens programmatically?
使用 FOSOAuthServerBundle 的标准端点(带有 FOSUserBundle),我可以通过提供 client_id、client_secret、用户和密码组合来检索访问和刷新令牌。响应如下所示:
{
"accessToken": "YTg2ZTJkNTY2MGM5MGQyNzZjYjkyZWMwYzg1YTZmZTZmOTIyMzAxNDY2MTkwZDU5ODYzZTAzYmIyNDI0YTQ4ZQ",
"expiresIn": 3600,
"tokenType": "bearer",
"refreshToken": "OTU1MGZhNDQ2ODFkZDUzMmQ4Y2FhNTk5OWM0NWFlNDk0YTY0ZDZhOTRjZTUwM2JlYTE3MDkxYzU3ZWY1OGRkYQ"
}
我的问题是,如何通过传入客户端和用户凭据以编程方式检索类似数据? IE。如何在不通过 HTTP(慢),而是直接通过捆绑代码(快)的情况下从应用程序的另一部分进行相同的调用?
我敢肯定一定有一种简单的方法可以做到这一点,但到目前为止我能找到的最好的方法是 https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/347,它并没有真正实现与 HTTP 调用相同的功能。
我的理解是您使用的是密码授予类型。这将要求您的应用程序知道用户和密码对以获取令牌。我建议改为使用 client_credentials 授权类型。
使用 FOSOAuthServerBundle,您应该能够获得类似(在 ContainerAware 上下文中)的访问令牌
$this->get('fos_oauth_server.server')->grantAccessToken($request)
这里你可以看到需要一个请求对象,但是你可以很容易地伪造这个对象
您也可以试试
$this->get('fos_oauth_server.server')->createAccessToken($client, null)
其中 $client 是您的 OAuth 客户端的一个实例。
以下是使用请求对象直接从 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();
使用 FOSOAuthServerBundle 的标准端点(带有 FOSUserBundle),我可以通过提供 client_id、client_secret、用户和密码组合来检索访问和刷新令牌。响应如下所示:
{
"accessToken": "YTg2ZTJkNTY2MGM5MGQyNzZjYjkyZWMwYzg1YTZmZTZmOTIyMzAxNDY2MTkwZDU5ODYzZTAzYmIyNDI0YTQ4ZQ",
"expiresIn": 3600,
"tokenType": "bearer",
"refreshToken": "OTU1MGZhNDQ2ODFkZDUzMmQ4Y2FhNTk5OWM0NWFlNDk0YTY0ZDZhOTRjZTUwM2JlYTE3MDkxYzU3ZWY1OGRkYQ"
}
我的问题是,如何通过传入客户端和用户凭据以编程方式检索类似数据? IE。如何在不通过 HTTP(慢),而是直接通过捆绑代码(快)的情况下从应用程序的另一部分进行相同的调用?
我敢肯定一定有一种简单的方法可以做到这一点,但到目前为止我能找到的最好的方法是 https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/issues/347,它并没有真正实现与 HTTP 调用相同的功能。
我的理解是您使用的是密码授予类型。这将要求您的应用程序知道用户和密码对以获取令牌。我建议改为使用 client_credentials 授权类型。
使用 FOSOAuthServerBundle,您应该能够获得类似(在 ContainerAware 上下文中)的访问令牌
$this->get('fos_oauth_server.server')->grantAccessToken($request)
这里你可以看到需要一个请求对象,但是你可以很容易地伪造这个对象
您也可以试试
$this->get('fos_oauth_server.server')->createAccessToken($client, null)
其中 $client 是您的 OAuth 客户端的一个实例。
以下是使用请求对象直接从 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();