Quickbooks PHP SDK OAuth2,如何获取和存储访问/刷新令牌

时间:2019-01-20 15:49:13

标签: php oauth-2.0 magento2 quickbooks-online

我有一个Magento 2.3存储,我正在尝试将一些数据同步到Quickbooks Online。 我已经创建了QBO App,但这是我第一次使用oauth,并且对如何存储和使用访问/刷新令牌有些困惑。

根据Quickbooks文档,我需要存储最新的刷新令牌:

  

每个访问令牌只能在创建后的一个小时内有效。如果您尝试在一个小时后使用相同的访问令牌进行API调用,则请求将被QBO阻止。这就是刷新令牌的用途。它用于在访问令牌过期后请求新的访问令牌,因此一小时后您仍然可以访问QBO公司。请记住,每当您调用refreshToken API时,始终在会话或数据库中存储最新刷新令牌值。在QuickBooks Online OAuth 2协议中,它不是您应该存储的访问令牌,而是您需要存储的刷新令牌。

所以我的问题是,每当我的API调用同步数据时,如何正确存储和调用刷新令牌以生成新的访问令牌。

当前,我通过将OAuth令牌硬编码到帮助文件中来直接使用它们:

<?php
namespace Company\Module\Helper;

use QuickBooksOnline\API\DataService\DataService;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
  public function getConfigurationSetting()
  {
    $dataService = DataService::Configure(array(
      'auth_mode' => 'oauth2',
      'ClientID' => '<<my ClientID',
      'ClientSecret' => '<<my ClientSecret>>',
      'accessTokenKey' => 'xxxxxx',
      'refreshTokenKey' => 'xxxxxx',
      'QBORealmID' => "123xxxxxxx",
      'baseUrl' => 'Development'
    ));

    $OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
    $refreshedAccessTokenObj = $OAuth2LoginHelper->refreshToken();
    $error = $OAuth2LoginHelper->getLastError();
    if ($error){
      $dataService->throwExceptionOnError(true);
    } else {
      $dataService->updateOAuth2Token($refreshedAccessTokenObj);
    }
    return $dataService;
  }
}

然后我从控制器中调用它:

<?php
namespace Company\Module\Observer;

use Magento\Framework\Event\ObserverInterface;
use QuickBooksOnline\API\DataService\DataService;

class CreateQbInvoice implements ObserverInterface
{

  protected $helperData;

  public function __construct(
    \Company\Module\Helper\Data $helperData
  ){
    $this->helperData = $helperData;
  }

  public function execute()
  {
    // Prep Data Services
    $dataService = $this->helperData->getConfigurationSetting();
...

现在这可以解决,直到我的访问令牌过期并且我需要生成一个新的令牌为止,我只是不确定如何更新我的访问令牌并正确存储新的刷新令牌,以使对我的应用程序的访问始终保持刷新状态。

3 个答案:

答案 0 :(得分:0)

因为您没有刷新令牌的机制。我想您需要一个永久访问令牌。

https://www.oauth.com/oauth2-servers/access-tokens/access-token-lifetime/

答案 1 :(得分:0)

一旦您获得访问令牌。使用它来获取令牌和刷新令牌。 您将获得令牌,刷新令牌,令牌到期,刷新令牌到期  用当前时间将所有数据保存在数据库中。

用于QuickBook令牌的令牌将在数小时后过期,但刷新令牌的令牌将在1年内过期。 因此,对于每个请求,您将首先检查令牌是否过期,并获取带有刷新令牌的新令牌。刷新令牌将返回令牌,而新的刷新令牌将替换上一个令牌

答案 2 :(得分:0)

use QuickBooksOnline\API\DataService\DataService;

$dataService = DataService::Configure(array(
    'auth_mode' => 'oauth2',
    'ClientID' => 'your client id',
    'ClientSecret' => 'your client secret',
    'RedirectURI' =>'redirect url',
     'scope' => "com.intuit.quickbooks.accounting openid profile",
     'baseUrl' => 'development or production'
));

$OAuth2LoginHelper = $dataService->getOAuth2LoginHelper();
$authorizationCodeUrl = $OAuth2LoginHelper->getAuthorizationCodeURL();

if( isset($_GET['code']) ) {
    $accessTokenObj = $OAuth2LoginHelper->exchangeAuthorizationCodeForToken( $_GET['code'], 'your company id') );

    // save these for later use

    $refreshTokenValue = $accessTokenObj->getRefreshToken();
    // Expires every 12 hours.
    $refreshTokenExpiry = $accessTokenObj->getRefreshTokenExpiresAt();

    // The access token and access token expiration.
    $accessTokenValue = $accessTokenObj->getAccessToken();
    $accessTokenExpiry = $accessTokenObj->getAccessTokenExpiresAt();
}