Google Apps Script (GAS) позволяет автоматизировать задачи и интегрировать различные сервисы Google, а также внешние API. Однако, часто возникает необходимость контроля доступа к вашим скриптам и данным, особенно если они содержат конфиденциальную информацию или используются для работы с персональными данными. В этой статье мы рассмотрим, как реализовать системы входа (аутентификации) в Google Apps Script, начиная с простых методов и заканчивая более сложными и безопасными подходами.
Зачем нужна система входа в Google Apps Script?
Система аутентификации необходима для:
- Контроля доступа: Ограничения доступа к функциям скрипта только для авторизованных пользователей.
- Персонализации: Возможности предоставить разный функционал в зависимости от роли или прав пользователя.
- Безопасности данных: Предотвращения несанкционированного доступа к конфиденциальной информации.
- Аудита: Отслеживания действий пользователей в системе.
Например, представим скрипт для автоматической рассылки персонализированных email-писем рекламной кампании. Без аутентификации любой, кто получит доступ к скрипту, сможет отправлять письма от вашего имени. Система входа позволит ограничить доступ только для сотрудников отдела маркетинга.
Обзор основных методов аутентификации
В GAS доступны различные методы аутентификации:
- Простая аутентификация через Google Sign-In: Использует учетную запись Google пользователя. Самый простой в реализации, подходит для базового контроля доступа.
- OAuth 2.0: Более гибкий и безопасный метод, позволяет предоставлять доступ к определенным данным и функциям вашего скрипта. Необходим для работы со сторонними API, требующими OAuth.
- Сервисные аккаунты (Service Accounts): Используются для автоматического доступа к ресурсам Google от имени приложения, без участия пользователя. Подходят для автоматизированных задач, выполняющихся в фоновом режиме.
- Собственные системы аутентификации: Можно реализовать собственную систему аутентификации с использованием баз данных или внешних сервисов. Самый сложный, но и самый гибкий метод.
Простая аутентификация с использованием Google Sign-In
Это самый простой способ ограничить доступ к вашему скрипту, используя существующие учетные записи Google.
Настройка Google Cloud Platform для аутентификации
Хотя для простой аутентификации не требуется явная настройка GCP, если вы планируете использовать OAuth 2.0 в будущем, полезно создать проект в Google Cloud Platform и включить API, которые вы планируете использовать. Это обеспечит лучшую управляемость и контроль над вашими приложениями.
Реализация клиентской части для входа через Google
Для реализации входа через Google на стороне клиента (например, в веб-приложении, созданном с помощью HTML Service
в GAS) можно использовать JavaScript-библиотеку Google Sign-In.
Пример HTML:
<script src="https://accounts.google.com/gsi/client"></script>
<div id="g_id_onload"
data-client_id="YOUR_CLIENT_ID.apps.googleusercontent.com"
data-context="signin"
data-ux_mode="popup"
data-login_uri="/action/login"
data-auto_prompt="false">
</div>
<div class="g_id_signin" data-type="standard" data-size="large" data-theme="outline" data-text="sign_in_with" data-shape="rectangular" data-logo_alignment="left"></div>
Замените YOUR_CLIENT_ID.apps.googleusercontent.com
на ваш Client ID, который можно получить в Google Cloud Console (если вы используете OAuth 2.0).
Обработка токена аутентификации на стороне Apps Script
После успешной аутентификации на стороне клиента, Google Sign-In возвращает токен ID. Этот токен необходимо отправить на серверную часть (Apps Script) для проверки и аутентификации пользователя.
Пример кода: Простая реализация входа
/**
* @param {string} idToken The ID token received from Google Sign-In.
* @return {string} The email address of the authenticated user.
*/
function authenticateUser(idToken: string): string | null {
try {
// Verify the ID token
const ticket = AuthClient.verifyIdToken({
idToken: idToken,
audience: [CLIENT_ID],
});
const payload = ticket.getPayload();
const email = payload['email'];
// In a real application, you would check if the user exists in your database.
// If the user doesn't exist, you would create a new user.
Logger.log(`User ${email} authenticated successfully.`);
return email;
} catch (e) {
Logger.log(`Authentication failed: ${e}`);
return null;
}
}
/**
* Example function to be called after user authentication
* @param {string} userEmail The email of user
*/
function myFunction(userEmail:string){
if (userEmail === null){
throw new Error("User not authenticated.");
}
Logger.log("Running my function for " + userEmail);
// add your logic here
}
Важно: Этот пример предполагает наличие переменной CLIENT_ID
, содержащей Client ID вашего приложения.
Использование OAuth 2.0 для более сложной аутентификации
OAuth 2.0 предоставляет более мощный и гибкий механизм аутентификации и авторизации, позволяющий безопасно предоставлять доступ к ресурсам без передачи логина и пароля пользователя.
Получение учетных данных OAuth 2.0
Для использования OAuth 2.0 необходимо:
- Создать проект в Google Cloud Platform.
- Включить необходимые API (например, Google Sheets API, Google Drive API).
- Создать учетные данные OAuth 2.0 (Client ID и Client Secret).
- Указать URI перенаправления (redirect URI), куда Google будет перенаправлять пользователя после аутентификации.
Обновление токена доступа (refresh token)
Токен доступа (access token) имеет ограниченный срок действия. Для получения нового токена доступа без повторного запроса аутентификации у пользователя используется токен обновления (refresh token). Важно правильно настроить и использовать refresh token.
Безопасное хранение учетных данных
Client Secret и Refresh Token являются конфиденциальной информацией и должны храниться в безопасном месте. Никогда не храните их в коде скрипта. Рекомендуется использовать Secret Manager в Google Cloud Platform или другие сервисы для хранения секретов.
Пример кода: Аутентификация через OAuth 2.0
// This example uses the Apps Script OAuth2 library.
// See https://github.com/googleworkspace/apps-script-oauth2
/**
* Configures the OAuth2 service.
* @return {OAuth2} The service object.
*/
function getOAuthService() {
return OAuth2.createService('myServiceName')
// Set the endpoint to request the authorization.
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
// Set the endpoint to request the access token.
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
// Set the client ID and secret.
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
// Set the name of the callback function in the script.
.setCallbackFunction('authCallback')
// Set the property store where authorized tokens should be persisted.
.setPropertyStore(PropertiesService.getUserProperties())
// Set the scopes to request.
.setScope(['https://www.googleapis.com/auth/spreadsheets.readonly'])
// Below are optional configuration options.
// Use them at your own discretion.
// Set access type to offline to request a refresh token.
.setAccessType('offline')
// Enable incremental authorization.
.setIncrementalAuthorization(true);
}
/**
* Handles the OAuth2 callback.
*
* @param {Object} request The request parameters.
* @return {HtmlOutput} The content to show to the user.
*/
function authCallback(request) {
const service = getOAuthService();
const authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied.');
}
}
/**
* Reset the OAuth2 state.
*/
function resetOAuth() {
const service = getOAuthService();
service.reset();
}
/**
* Gets the OAuth2 authentication URL.
* @return {string} The authorization URL.
*/
function getOAuthURL():string {
const service = getOAuthService();
return service.getAuthorizationUrl();
}
/**
* Makes a request to the Google Sheets API.
* @return {string} The data returned from the API.
*/
function callSheetsApi() {
const service = getOAuthService();
if (service.hasAccess()) {
const url = 'https://sheets.googleapis.com/v4/spreadsheets/YOUR_SPREADSHEET_ID/values/Sheet1!A1:B2';
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + service.getAccessToken()
}
});
const result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
return JSON.stringify(result, null, 2);
} else {
const authorizationUrl = service.getAuthorizationUrl();
Logger.log('Please authorize the script: %s', authorizationUrl);
return "Please authorize the script, open authorizationUrl";
}
}
Важно: Замените YOUR_SPREADSHEET_ID
на ID вашей таблицы Google Sheets. Этот код предполагает использование библиотеки Apps Script OAuth2. Необходимо добавить библиотеку в ваш проект Apps Script.
Альтернативные методы и соображения безопасности
Использование сервисных аккаунтов (Service Accounts)
Сервисные аккаунты позволяют приложениям получать доступ к ресурсам Google от своего имени, без участия пользователя. Это полезно для автоматизированных задач, выполняющихся в фоновом режиме.
Защита от XSS и CSRF атак
При разработке веб-приложений на базе GAS важно учитывать уязвимости безопасности, такие как XSS (Cross-Site Scripting) и CSRF (Cross-Site Request Forgery).
- XSS: Тщательно фильтруйте все данные, полученные от пользователя, перед отображением их в HTML.
- CSRF: Используйте токены CSRF для защиты от подделки межсайтовых запросов.
Рекомендации по безопасному хранению секретов и ключей API
- Не храните секреты в коде: Используйте Secret Manager или аналогичные сервисы.
- Ограничьте права доступа: Предоставляйте скрипту только необходимые права доступа.
- Регулярно обновляйте ключи API: Это снижает риск компрометации данных.
Заключение
Реализация системы входа в Google Apps Script – важный шаг для обеспечения безопасности и контроля доступа к вашим скриптам и данным. Выбор подходящего метода аутентификации зависит от сложности проекта и требований к безопасности.
Выбор подходящего метода аутентификации для вашего проекта
- Простая аутентификация: Для простых скриптов, где требуется базовый контроль доступа.
- OAuth 2.0: Для более сложных приложений, работающих со сторонними API или требующих детального контроля доступа.
- Сервисные аккаунты: Для автоматизированных задач, выполняющихся без участия пользователя.
Дальнейшие шаги и ресурсы
- Документация Google Apps Script: https://developers.google.com/apps-script
- Apps Script OAuth2 Library: https://github.com/googleworkspace/apps-script-oauth2
- Google Cloud Platform documentation: https://cloud.google.com/docs