首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我尝试连接到谷歌电子表格时,我得到错误-> 404“你需要权限”

当我尝试连接到谷歌电子表格时,我得到错误-> 404“你需要权限”
EN

Stack Overflow用户
提问于 2021-11-15 10:20:09
回答 1查看 150关注 0票数 0

我正试图通过PHP API Client进入谷歌电子表格,但我得到了一个404->你需要许可。该文件已被授予我的用户编辑权限,该用户是我用于通过Google开发人员控制台设置JSON凭据的用户。我遗漏了什么?

下面是我的代码:

代码语言:javascript
复制
     $this->client = new Google_Client();
        $this->client->setApplicationName('BreezingForms Google Drive Spreadsheets');
        $this->client->addScope(array('https://spreadsheets.google.com/feeds'));

        // testing:
        // 197794184197-bt2q9knrdu1i54vgladd97ob196k4c6s.apps.googleusercontent.com
        // dImciIWj3WNOrIcYRbu9MFeA

        if (isset($_POST['gdata_custom_client_id']) && trim($_POST['gdata_custom_client_id']) != '' && trim($_POST['gdata_custom_client_secret']) != '') {

            $this->client->setClientId(trim($_POST['gdata_custom_client_id']));
            $this->client->setClientSecret(trim($_POST['gdata_custom_client_secret']));

            $db->setQuery("Update #__breezingforms_addons_gdata Set custom_client_id = " . $db->quote(trim($_POST['gdata_custom_client_id'])) . ", custom_client_secret = " . $db->quote(trim($_POST['gdata_custom_client_secret'])) . " Where form_id = " . intval($_REQUEST['form']));
            $db->execute();

        } else {

            $form_id = -1;

            if(JRequest::getInt('ff_form',-1) > 0){

                $form_id = JRequest::getInt('ff_form',-1);

            }else if(isset($_REQUEST['form'])){

                $form_id = intval($_REQUEST['form']);
            }

            $db->setQuery("Select * From #__breezingforms_addons_gdata Where form_id = " . $db->quote($form_id));
            $client = $db->loadObject();

            if ($client) {

                $this->client->setClientId($client->custom_client_id);
                $this->client->setClientSecret($client->custom_client_secret);
            }
        }

        $this->client->setApprovalPrompt('auto');
        $this->client->setPrompt('consent');
        $this->client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');
        $this->client->setAccessType('offline');


    }
    
    function onPropertiesDisplay($form_id, $tabs){
        
        if(!$form_id) return '';
        
        $error = '';
        
        $db = JFactory::getDBO();
        
        $db->setQuery("Select `title`,`name`,`id` From #__facileforms_elements Where form = " . intval($form_id) . " And `title` Not In ('bfFakeTitle','bfFakeTitle2','bfFakeTitle3','bfFakeTitle4','bfFakeTitle5') And `type` Not In ('','UNKNOWN') Order By ordering");
        $breezingforms_fields = $db->loadObjectList();
        
        $db->setQuery("Select `enabled`, `username`, `password`, `worksheet_id`, `spreadsheet_id`, `fields`, `meta`, `debug` From #__breezingforms_addons_gdata Where form_id = " . intval($form_id));
        $gdata = $db->loadObject();
        
        if( $gdata === null ){
            $gdata = new stdClass();
            $gdata->username = '';
            $gdata->password = '';
            $gdata->enabled = 0;
            $gdata->worksheet_id = '';
            $gdata->spreadsheet_id = '';
            $gdata->fields = '';
            $gdata->meta = '';
            $gdata->debug = 0;
        }
        
        $gdata->fields = explode('/,/', $gdata->fields);
        $gdata->meta   = explode('/,/', $gdata->meta);
        
        $gdata_spreadsheets = array();
        $gdata_worksheets = array();
        $gdata_columns = array();
        
        //if( $gdata->enabled == 1 ){
           
            
            try{
            
                $spreadsheetFeed = null;
                
                $auth_url = '';
                
                $db->setQuery("Select password From #__breezingforms_addons_gdata Where form_id = " . intval($form_id));
             $accessToken = $db->loadResult();
              // $accessToken='{"access_token":"ya29.a0ARrdaM--_ZKuuOfK3CyRsAubHXYgGlwMhLfg9x10fLbYhOq0Polqela1GjGYjhBO9Fi0v7LKuDauV4qA-uFLCilun0_NuQDuEFHjYb9iX0rcOjS6YWMDTHfe2UsyxJkyvlULrMIV7sh4_-_-vORj0kh6sw7o","expires_in":3599,"refresh_token":"1\/\/09aQ4SG_STBzBCgYIARAAGAkSNwF-L9Ir9FDHRmbwiLoCXglVSksa1tfyes6AdQedbTx2dqZKGh-ZTMT-M2i665x18NzT1luWu1Q","scope":"https:\/\/www.googleapis.com\/auth\/spreadsheets","token_type":"Bearer","created":1635842294}';

                if(!$accessToken){
                    
                    $auth_url = $this->client->createAuthUrl();
                    
                    
                } else {
                    
                    try{
                        
                        $this->client->setAccessToken($accessToken);
                        $token = json_decode($accessToken);
                
                        if ($this->client->isAccessTokenExpired()) {
                            $this->client->refreshToken($token->refresh_token);
                            $tok = json_encode($this->client->getAccessToken());
                            $token = json_decode($tok);
                            $db->setQuery("Update #__breezingforms_addons_gdata set password = " . $db->quote($tok) . " Where form_id = " . intval($form_id));
                            $db->execute();
                        }
                        
                        $serviceRequest = new DefaultServiceRequest($token->access_token, $token->token_type);
                        ServiceRequestFactory::setInstance($serviceRequest);

                        $spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
                        $spreadsheetFeed = $spreadsheetService->getSpreadsheets();
                        
                    }catch(Exception $ee){
                        
                      //$accessToken = null;
                        //$auth_url = $this->client->createAuthUrl();
              $error=$ee->getMessage();
                                  
                                  }
                }

                if($spreadsheetFeed !== null){
                    foreach($spreadsheetFeed As $sheet){
                        $gdata_spreadsheets[$sheet->getId()] = $sheet->getTitle();
                    }
                }
                
                if($gdata->spreadsheet_id != '' && isset( $gdata_spreadsheets[$gdata->spreadsheet_id] ) && $spreadsheetFeed !== null){

                    $spreadsheet = $spreadsheetFeed->getByTitle($gdata_spreadsheets[$gdata->spreadsheet_id]);
                    $worksheetFeed = $spreadsheet->getWorksheets();
                    
                    foreach ( $worksheetFeed as $sheet ){
                        $gdata_worksheets[$sheet->getId()] = $sheet->getTitle();
                    }
                    
                    if($gdata->worksheet_id != '' && isset( $gdata_worksheets[$gdata->worksheet_id] )){
                        
                        $worksheet = $worksheetFeed->getByTitle($gdata_worksheets[$gdata->worksheet_id]);
                        $cellFeed = $worksheet->getCellFeed();

                        foreach($cellFeed->getEntries() as $cellEntry) {
                            
                            $row = $cellEntry->getRow();
                            $col = $cellEntry->getColumn();
                            
                            if( $row > 1 ){
                                break;
                            }
                            
                            $gdata_columns[] = $cellFeed->getCell($row, $col)->getContent();
                            
                        }
                        
                    }
                }
            
            } catch(Exception $e){
                
                $error = $e->getMessage();
            }
        //}
        
        ob_start();
        $version = new JVersion();
        if(version_compare($version->getShortVersion(), '1.6', '<')){
            require_once JPATH_SITE . DS . 'plugins' . DS . 'breezingforms_addons' . DS . 'breezingforms_addons_gdata_tmpl' . DS . 'properties.php';

        }else{
            require_once JPATH_SITE . DS . 'plugins' . DS . 'breezingforms_addons' . DS . 'gdata' . DS . 'breezingforms_addons_gdata_tmpl' . DS . 'properties.php';
        }
        $c = ob_get_contents();
        ob_end_clean();
        return $c;
    }
    
    function onPropertiesSave($form_id){
        
        if(!$form_id) return '';
        
        $accessToken = '';
        
        $reset_accessToken = false;
        
        if(isset($_POST['gdata_code']) && $_POST['gdata_code'] != ''){
            
            $accessToken =json_encode($this->client->authenticate($_POST['gdata_code']));
            
            
        }
        
        if(isset($_POST['gdata_reset'])){
            $reset_accessToken = true;
            $accessToken = '';
            
        }
        
        if(isset($_POST['gdata_fields']) && is_array($_POST['gdata_fields'])){
            $_POST['gdata_fields'] = implode('/,/', $_POST['gdata_fields']);
        }else{
            $_POST['gdata_fields'] = '';
        }
        
        if(isset($_POST['gdata_meta']) && is_array($_POST['gdata_meta'])){
            $_POST['gdata_meta'] = implode('/,/', $_POST['gdata_meta']);
        }else{
            $_POST['gdata_meta'] = '';
        }
        
        $db = JFactory::getDBO();
        
        $db->setQuery("Select form_id From #__breezingforms_addons_gdata Where form_id = " . intval($form_id));
        $exists = $db->loadResult();
        
        if(!$exists){
            $db->setQuery("Insert Into #__breezingforms_addons_gdata (
                `form_id`, `enabled`,`password`,`spreadsheet_id`,`worksheet_id`,`fields`,`meta`) Values 
                (   ".intval($form_id).",
                    ".JRequest::getInt('gdata_enabled', 0).",
                    ".($accessToken ? $db->quote($accessToken).',' : '"",')."
                    ".$db->quote(hexToStr(JRequest::getVar('gdata_spreadsheet_id', "''"))).",
                    ".$db->quote(hexToStr(JRequest::getVar('gdata_worksheet_id', "''"))).",
                    ".$db->quote($_POST['gdata_fields']).",
                    ".$db->quote($_POST['gdata_meta'])."
                )");
            $db->query();
        } 
    else {
//$token1=json_encode(array("username" => "text",
   //"password" => "text"));
            $gspid = $reset_accessToken ? "''" : hexToStr(JRequest::getVar('gdata_spreadsheet_id', "''"));
            $wid = $reset_accessToken ? "''" : hexToStr(JRequest::getVar('gdata_worksheet_id', "''"));

            $db->setQuery("Update #__breezingforms_addons_gdata Set
                `enabled`  = ".JRequest::getInt('gdata_enabled', 0).",
                 ".($accessToken || $reset_accessToken ? "`password` = " . $db->quote($accessToken).',' : '')."
                `spreadsheet_id` = ".$db->quote(trim($gspid) == '' ? "''" : $gspid).",
                `worksheet_id` = ".$db->quote(trim($wid) == '' ? "''" : $wid).",
                `fields` = ".$db->quote($_POST['gdata_fields']).",
                `meta` = ".$db->quote($_POST['gdata_meta'])."
                ".($reset_accessToken ? ",`custom_client_id` = " . $db->quote("34263101371-4rcre0p6r9ehuhoat1d6ls8u84etuanp.apps.googleusercontent.com").', `custom_client_secret` = ' . $db->quote("IDq59sdLo6wC81KCUweDKVf2") : '')."
                 Where form_id = " . intval($form_id) . "
            ");
            $db->query();
        }

我在我的Goole账户上给了许可应用程序访问,然后我从Google账户上得到了auth token,但是我得到了“你需要许可”!?

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-15 12:49:01

您遇到的错误源于您使用的 https://spreadsheets.google.com/feeds 作用域是无效的作用域。

Sheets API的授权作用域列表如下:

允许您查看、编辑、创建和删除所有Google Drive文件的

  • https://www.googleapis.com/auth/drive

  • https://www.googleapis.com/auth/drive.file,允许您查看和管理使用此应用程序打开或创建的Google Drive文件和文件夹;

允许您查看和下载所有Google Drive文件的

  • https://www.googleapis.com/auth/drive.readonly

允许您在Google Drive中查看、编辑、创建和删除电子表格的

  • https://www.googleapis.com/auth/spreadsheets

允许你查看你的谷歌Spreadsheets.的

  • https://www.googleapis.com/auth/spreadsheets.readonly

因此,根据您希望允许用户执行的确切操作,您必须从上面的列表中选择一个作用域。此外,如果您最终修改了作用域,请确保删除token.json文件。

参考文献

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69972791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档