Я пытаюсь создать скрипт приложений Google, который обрабатывает две таблицы одновременно - одна содержит личную информацию для пользователей; другой - публичный.
Поскольку в нем хранится личная информация, я должен убедиться, что только пользователь имеет к ней доступ. В конечном итоге я решил (что, возможно, не самый лучший способ справиться с этим), чтобы создать папку и файл на собственном диске Google пользователя для хранения данных. Я обращаюсь с этим внутри моего code.gs, и он отлично работает.
Проблема возникает, когда я пытаюсь получить доступ к этим данным через мое веб-приложение (которое использует тот же файл code.gs). Несмотря на то, что пользователям приходилось авторизовывать мое приложение для доступа к своим данным, когда оно впервые появлялось и пыталось создать файл, авторизации driveapp и spreadsheetapp, похоже, не учитываются для веб-приложения. Поэтому, хотя у меня есть fileId и url, я не могу получить к ним доступ. Я получаю следующую ошибку:
ACCESS_DENIED Эта электронная таблица недоступна для публичного просмотра и требует
учетные данные OAuth
Правильно ли я предположил, что если я войду и создаю учетные данные OAuth с использованием clientID, то это будет работать только на МОИХ электронных таблицах, а не на электронных таблицах моего ПОЛЬЗОВАТЕЛЯ? Когда я позаимствовал у собственной страницы Google информацию об авторизации электронных таблиц https://developers.google.com/chart/interactive/docs/spreadsheets#Authorization, и создал свое приложение только с этим (меняя местами URL-адреса и идентификаторы клиентов), я получил эту ошибку:
- Это ошибка.
Ошибка: redirect_uri_mismatch
Происхождение JavaScript в запросе,
https://[gobblydygook1] -script.googleusercontent.com , не соответствует
авторизованные для клиента OAuth. Визит
https://console.developers.google.com/apis/credentials/oauthclient/[validClientID].apps.googleusercontent.com?project=901868773794
обновить авторизованные источники JavaScript.
Узнать больше Подробнее
response_type=permission id_token
scope=https://www.googleapis.com/auth/spreadsheets
openid.realm=
redirect_uri=storagerelay://https/[gobblydygook1]-script.googleusercontent.com?id=auth590482
client_id=[validClientID].apps.googleusercontent.com
ss_domain=https://[gobblydygook1]-script.googleusercontent.com
gsiwebsdk=shim
Это все, что мы знаем.
К сожалению, у меня нет своего собственного домена ... когда я пытаюсь вставить действительный веб-сайт моего скрипта или ссылки, которые мне дает сообщение об ошибке, на странице Credentials, это не кажется взять их (или, может быть, так и не показывает их мне?).
Все это говорит, я даже не уверен, что делаю это правильно в первую очередь, учитывая, что я пытаюсь получить доступ к электронной таблице, которую я создал в папке моего пользователя.
Может ли мой code.gs каким-то образом передать авторизацию, которую он использовал для входа в этот файл, браузеру?
Я мог бы сделать так, чтобы code.gs собирал мои данные, но ... кажется, что это на несколько порядков медленнее, чем запросы визуализации.
Вот код, на случай, если вы хотите его увидеть:
index.html:
<!DOCTYPE html>
<html>
<head>
<?var userSheetURL = getUserSheetUrl();?>
</head>
<body>
<h1>Hello, World!</h1>
<h3>User sheet URL is <?=userSheetURL?></h3>
<div id="user_sheet_url" data-url="<?=userSheetURL?>"></div>
<?!= include('demo'); ?>
<button id="authorize-button" style="visibility: hidden">Authorize</button>
<script src="https://apis.google.com/js/auth.js?onload=init"></script>
</body>
</html>
demo.html:
<link href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquerymobile/1.4.5/jquery.mobile.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
var clientId = '[validClientId].apps.googleusercontent.com';
var scopes = 'https://www.googleapis.com/auth/spreadsheets';
function init() {
gapi.auth.authorize(
{client_id: clientId, scope: scopes, immediate: false},
handleAuthResult);
}
function handleAuthResult(authResult) {
var authorizeButton = document.getElementById('authorize-button');
if (authResult && !authResult.error) {
authorizeButton.style.visibility = 'hidden';
makeApiCall();
} else {
authorizeButton.style.visibility = '';
authorizeButton.onclick = handleAuthClick;
}
}
function handleAuthClick(event) {
gapi.auth.authorize(
{client_id: clientId, scope: scopes, immediate: false},
handleAuthResult);
return false;
}
function makeApiCall() {
var userUrl = $('#user_sheet_url').attr('data-url');
//the following alert is never triggered
alert(userUrl);
var tqUrl = userUrl + 'gviz/tq' +
'?tqx=responseHandler:handleTqResponse' +
'&access_token=' + encodeURIComponent(gapi.auth.getToken().access_token);
var slashScript = "/script"
document.write('<script src="' + tqUrl +'" type="text/javascript"><' + slashScript + '>');
}
function handleTqResponse(resp) {
document.write(JSON.stringify(resp));
}
</script>
(вызов getUserSheetUrl вызывает функцию в code.gs, которая возвращает URL файла пользователя, который я создал. Я вижу, что он успешно возвращает нужную мне строку в окне браузера)