«Сложные» отношения между клиентом и сервером

Из всех отношений, существующих в технологической вселенной, возможно, ни одна из них не является настолько «сложной», но синхронной, как отношения между клиентом и его сервером. Как человек, который изучал информатику, в основном программирование во внешнем интерфейсе (можно ли называть CSS своим любимым языком?), Работа с серверами была для меня неизведанной территорией, когда я начал стажировку в Google всего месяц назад. Сегодня, однако, взаимоотношения клиент / сервер - это то, что я изучил досконально, и хотя они, безусловно, сложны, но важно понимать. Ниже я обрисовал ключевые характеристики этого технологического романа.

Клиент нуждается.

Самая фундаментальная часть взаимоотношений клиент / сервер заключается в том, что клиенту нужен свой сервер. Новое веб-приложение, которое я сейчас разрабатываю, отображает HTML-страницу (с JavaScript), чтобы пользователь мог войти в свою учетную запись Google, а затем использует свой сервер (Облачная функция Google) для вызова Google Sheets API. GCF здесь является прекрасным вариантом, поскольку он является легким и не требует использования сервера.

Это внутреннее действие - вызов API Таблиц - выполняется на стороне сервера. Почему? Потому что, когда вы собираете данные, сервер добавляет безопасность, которую не предлагает клиент. В моем апплете использование сервера защищает мои ключи API. Таким образом, хотя клиент отлично подходит для отображения текста, кнопок и подсказок пользователю, он не идеален для каждой задачи.

После того, как пользователь вошел в свою учетную запись Google, эту авторизацию необходимо сохранить, чтобы иметь возможность создать новую таблицу в своей учетной записи. Клиент может полностью контролировать этот процесс авторизации, используя JavaScript-клиент для входа в Google для получения и хранения необходимых учетных данных.

function setAuthToken() {
        var googleAuth = gapi.auth2.getAuthInstance();
        var googleUser = googleAuth.currentUser.get();
        var authResponse = googleUser.getAuthResponse(true);
        AUTH_PARAM = authResponse.access_token;
        console.log("Auth param is: " + AUTH_PARAM);
        createSheet(AUTH_PARAM);
}

Вот "AUTH_PARAM" - мое странное маленькое прозвище для "параметра авторизации".

Однако именно здесь клиент застревает. Несмотря на то, что у него есть все необходимые уровни авторизации, клиент не может безопасно вызвать API Таблиц без использования своего сервера. Внутри createSheet () клиент теперь отправляет серверу запрос (выборка!), Чтобы выполнить эту задачу… как нужно.

Сервер может управлять.

Вместо того, чтобы позволить клиенту продолжать и делать вызовы API, сервер предпочитает контролировать выполнение этих внутренних операций. В своем предыдущем сообщении в блоге я обсуждаю использование запросов на выборку для вызова Google Cloud Functions, и это именно то, что я использую в этом веб-приложении для доступа к Google Sheets API.

Вот как эстафета передается серверу:

function createSheet(AUTH_PARAM) {
            var data = {'auth': AUTH_PARAM};
    fetch(functionEndpoint, {
                   method: 'POST',
                   body: JSON.stringify(data),
                   headers:{
                       'Content-Type': 'application/json'
                   }
                }).then(res => { 
                  // handle response!
                }

У них проблемы со связью.

Теперь, когда клиент отправил сообщение (или запрос) на сервер, сервер должен правильно уловить и понять этот запрос, чтобы правильно его выполнить. В приведенном выше коде клиент отправил запрос POST, что означает, что параметр отправляется безопасно, в отличие от запросов GET, где параметр отправляется как часть URL-адреса конечной точки функции. Проблемы с доверием? Может быть.

Вывод здесь заключается в том, что клиент и сервер не могут свободно общаться - клиенту необходимо указать, следует ли сохранять конфиденциальность своих сообщений.

После получения запроса «POST» серверу необходимо получить необходимые параметры для выполнения функции.

const authToken = req.body.auth;

В качестве альтернативы, в запросе «GET» сервер вместо этого будет обращаться к параметрам через запрос:

const authToken = req.query.auth;

Это небольшая разница, но смешивание тела с запросом здесь может сломать ваш код. Видите ли, общение действительно . Особенно, когда ваш клиент говорит на JavaScript, а ваш сервер говорит на Node.js.

Сервер может взять верх.

После того, как необходимая информация отправлена ​​от клиента к серверу, настала очередь последнего выполнять свои очень важные внутренние задачи. Однако серверу необходимо выполнить некоторую дополнительную настройку и «управлять», чтобы выполнить то, что он должен делать.

async function createSheet(authToken) {
  const oauth2Client = new google.auth.OAuth2();
  oauth2Client.setCredentials({
   access_token: authToken
  });

Вы можете просмотреть полный код в моем GitHub.

Выше мы сначала устанавливаем авторизацию клиента для нового экземпляра OAuth2, который затем отправляется как часть запроса API Таблиц. Это фактически создает новый лист в учетной записи Google конечного пользователя, который ранее вошел в систему через клиента.

«Это сложно», но работает.

Какими бы сложными ни казались отношения, вскоре становится ясно, что клиент и сервер хорошо работают синхронно вместе, выполняя задачи, которые один не может выполнить в одиночку. Сервер более эффективен в отношении выполнения задач, в то время как клиент имеет полный контроль над тем, как конечный пользователь взаимодействует на поверхности. Это роман «Ромео и Джульетта», в котором ни одно не может существовать без другого.

Если вы хотите больше поиграть с клиентами и серверами, подумайте об использовании Google Cloud Functions для управления серверной частью. GCF не только имеет щедрый бесплатный уровень, он также поддерживает такие языки, как JavaScript, Python, Go и их собственные библиотеки. Так что не волнуйтесь, если Node.js вам не подходит - в море GCF много и других рыб.

Сообщите мне, как вы используете отношения клиент / сервер для обновления функций своих веб-приложений. Буду рад услышать от вас!