我正试图通过PHP API Client进入谷歌电子表格,但我得到了一个404->你需要许可。该文件已被授予我的用户编辑权限,该用户是我用于通过Google开发人员控制台设置JSON凭据的用户。我遗漏了什么?
下面是我的代码:
$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,但是我得到了“你需要许可”!?
有什么想法吗?
发布于 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文件。
参考文献
https://stackoverflow.com/questions/69972791
复制相似问题