【问题标题】:Invaild Grant issue in Xero OAuth2.0 Refresh tokenXero OAuth 2.0 刷新令牌中的无效授权问题
【发布时间】:2020-04-24 15:33:27
【问题描述】:

我正在使用 Xero OAuth2.0 API,一旦令牌过期,我将刷新令牌。 Xero Documentation 我将令牌存储在 JSON 文件中,以便下次可以检索。

错误响应:

{
"error": "invalid_grant"
}

请参考下面我用过的代码

public function getAccessToken($code = null) {
    if(file_exists($this->tokenPath) && isset($code)) {
        $accessToken = $this->getAccessTokenFromAuthCode($code);
    } else if (file_exists($this->tokenPath)) {
        $accessToken = $this->getAccessTokenFromJSON();
        try {
            if (time() > $accessToken->expires) {
                $accessToken = $this->provider->getAccessToken('refresh_token', [
                    'refresh_token' => $accessToken->refresh_token
                ]);
            }
        } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
            //header('Location: ' . $this->getAuthorizationUrl());
        }

    } else if(isset($code)){
        $accessToken = $this->getAccessTokenFromAuthCode($code);
    } else {
        header('Location: ' . $this->getAuthorizationUrl());
    }

    return $accessToken;
}

public function getAccessTokenFromAuthCode($code) {
    return $this->storeAccessTokenToJSON($this->provider->getAccessToken('authorization_code', ['code' => $code]));
}

public function getAccessTokenFromJSON(){

    return json_decode(file_get_contents($this->tokenPath));
}

public function storeAccessTokenToJSON($accessToken){
    file_put_contents($this->tokenPath, json_encode($accessToken));

    return json_decode(file_get_contents($this->tokenPath));
}

【问题讨论】:

    标签: api oauth-2.0 xero-api


    【解决方案1】:

    访问令牌的过期时间为30 minutes。未使用的刷新令牌在60 days. 之后过期如果您在 60 天内未刷新访问令牌,用户将需要重新授权您的应用。

    • 如果您成功执行令牌刷新,您将获得带有新访问令牌new refresh token
    • 如果由于某种原因,您在执行令牌刷新后没有收到响应,您可以在 30 分钟的宽限期内重试刷新旧令牌
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://identity.xero.com/connect/token?=",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => array(
     'XXXXXXXXXXXXX','client_secret' =>
     'YYYYYYYYYYYYYYYYYYYYYYYYYYYYY'),
      CURLOPT_HTTPHEADER => array(
        "grant_type: refresh_token",
        "Content-Type: application/json",
         ),
    ));
    
    $response = curl_exec($curl);
    
    curl_close($curl);
    echo $response;
    

    【讨论】:

      【解决方案2】:

      您在获得初始令牌时是否指定了“offline_access”范围?

      https://developer.xero.com/documentation/guides/oauth2/scopes#offline-access

      【讨论】:

        【解决方案3】:

        Invalid_grant 是刷新令牌过期时的标准错误响应代码。

        常见的令牌生命周期类似于: * 访问令牌 = 60 分钟 * 刷新令牌 = 8 小时

        当刷新令牌过期时,您必须让用户重新登录。

        【讨论】:

        猜你喜欢
        • 2014-09-22
        • 2014-07-09
        • 1970-01-01
        • 2017-12-25
        • 2018-10-01
        • 2016-11-11
        • 2015-04-01
        • 1970-01-01
        • 2013-02-23
        相关资源
        最近更新 更多