我有一个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();
...
现在这可以解决,直到我的访问令牌过期并且我需要生成一个新的令牌为止,我只是不确定如何更新我的访问令牌并正确存储新的刷新令牌,以使对我的应用程序的访问始终保持刷新状态。>
答案 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();
}