如何使用刷新令牌在后台获得授权并获取访问令牌? [英] How to use refresh token to get authorized in background and getting access token?

查看:48
本文介绍了如何使用刷新令牌在后台获得授权并获取访问令牌?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 refreshToken 获取 accessToken,下面我已经发布了我的代码,请有人指导我.

I am trying to get accessToken using refreshToken, below I have posted my code please someone guide me.

它来自我正在开发的 wordpress 插件,我只需要检索 pageViews和 pagePath 所以不喜欢使用可用的插件.

It is from a wordpress plugin I am developing, I only need to retrieve pageViews and pagePath so not preferring using a available plugin.

参考 使用 OAuth 刷新令牌获取新的访问令牌 - Google API

 if( isset( $this->options['authenication_code'] ) ){   //plugin setting page settings 
                global $wpdb;
                $resultset = $wpdb->get_row( 'SELECT `refreshToken` FROM ' . $wpdb->prefix . 'analyticaAnalytics WHERE authenication_code ="' . $this->options["authenication_code"] . '"', ARRAY_A );
                var_dump( $resultset['refreshToken'] ); //retrieved refreshToken from database
                if ($client->isAccessTokenExpired()) {              //boolean true
                    $client->refreshToken( $resultset['refreshToken'] ); 
                    var_dump( $client );//getting blank
                }
            }

../google-api-php-client/src/Google/Auth/oauth2.php

private function refreshTokenRequest($params)
  { 
    if (isset($params['assertion'])) {

      $this->client->getLogger()->info(
          'OAuth2 access token refresh with Signed JWT assertion grants.'
      );
    } else {
        $this->client->getLogger()->info('OAuth2 access token refresh');
    }

    $http = new Google_Http_Request(
        self::OAUTH2_TOKEN_URI,
        'POST',
        array(),
        $params
    );

    $http->disableGzip();
    $request = $this->client->getIo()->makeRequest($http);
    //var_dump( $request );exit;//response 400, invalid grant
    $code = $request->getResponseHttpCode();

    $body = $request->getResponseBody();
    if (200 == $code) {
      $token = json_decode($body, true);
      if ($token == null) {
        throw new Google_Auth_Exception("Could not json decode the access token");
      }

      if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
        throw new Google_Auth_Exception("Invalid token format");
      }

      if (isset($token['id_token'])) {
        $this->token['id_token'] = $token['id_token'];
      }
      $this->token['access_token'] = $token['access_token'];
      $this->token['expires_in'] = $token['expires_in'];
      $this->token['created'] = time();
    } else {
      throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
    }
  }

花了很多时间后,我得到的错误是 $request = $this->client->getIo()->makeRequest($http); 的 responsecode 400 和那个是无效授权.

After spending a lot of time I got the error is responsecode 400 for $request = $this->client->getIo()->makeRequest($http); and that is invalid grant.

完整代码

推荐答案

这就是我解决的问题,我们需要将 refreshToken 存储在我们的数据库中并使用该 refreshToken,我们可以获得另一个可以使用的 accessToken得到结果,它不需要另一个身份验证.

This is how , I solved the problem, We need to store the refreshToken in our database and using that refreshToken, We can get another accessToken .which can be used to get the result and it does not need another authentication .

<?php
        $client = new Google_Client();
        $client->setAuthConfigFile(plugin_dir_url( __FILE__ ) . '/client_secrets.json');
        $client->setRedirectUri( site_url() . '/wp-admin/admin.php?page=analytica-admin-settings');
        $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
        $client->setIncludeGrantedScopes(true);
        $client->setAccessType('offline');
        if ( isset( $_GET['code'] )) {

            if($client->isAccessTokenExpired()){

                $client->authenticate($_GET['code']);

                $accessToken = $client->getAccessToken();
                $refreshToken = $client->getRefreshToken();

                $analytica_tokens = json_encode( array( 'time' => current_time( 'mysql' ),'accessToken' =>  $accessToken, 'refreshToken' => $refreshToken ) );
                update_option( 'analytica_tokens', $analytica_tokens );
            } 
        } else {
            $resultset = json_decode(get_option('analytica_tokens'));

            if ($client->isAccessTokenExpired()) {
                if( isset( $resultset ) ){
                    $refreshToken = $resultset->refreshToken;
                    $client->refreshToken( $refreshToken );
                    $accessToken = $client->getAccessToken();           
                    $analytica_tokens = json_encode( array( 'time' => current_time( 'mysql' ), 'accessToken' =>  $accessToken, 'refreshToken' => $refreshToken ) );
                    update_option( 'analytica_tokens', $analytica_tokens );
                } else {
                    echo 'You need to reauthorize the application to get the analytics report.';
                }
            }
        }
        $auth_url = $client->createAuthUrl();
        ?>
         <a class="connect-to-google-analytics" href='<?php echo $auth_url; ?>'  id="loginText">Connect To Your Google Analytics Account </a>
        <?php
        if( isset($accessToken) ){
            $_SESSION['access_token'] = $accessToken ? $accessToken : $refreshToken;
            $client->setAccessToken($_SESSION['access_token']);
            // Create an authorized analytics service object.
            $analytics = new Google_Service_Analytics($client);

            // Get the first view (profile) id for the authorized user.
            $profile = $this->getFirstProfileId($analytics);

            // Get the results from the Core Reporting API and print the results.
            $this->results = $this->getResults($analytics, $profile);
        }
        ?>

这篇关于如何使用刷新令牌在后台获得授权并获取访问令牌?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆