首页 文章

Symfony FOSOAuthServerBundle以编程方式获取令牌?

提问于
浏览
0

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

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

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

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

2 回答

  • 1

    以下是使用请求对象直接从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();
    
  • 6

    我的理解是你使用的是密码授权类型 . 这将要求您的应用程序知道用户和密码对以获取令牌 . 我建议改为使用client_credentials grant类型 .

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

    $this->get('fos_oauth_server.server')->grantAccessToken($request)
    

    在这里,您可以看到Request对象是必需的,但您可以轻松地伪造此对象

    另外你可以试试

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

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

相关问题