Как получить доступ к календарю пользователя Google и редактировать его, не запрашивая разрешения пользователя снова и снова - PullRequest
2 голосов
/ 07 августа 2020

На моем веб-сайте я прошу доступ к календарю Google. Я могу редактировать календарь пользователя, но я не хочу снова и снова спрашивать разрешения пользователя, поэтому после авторизации пользователя и предоставления доступа к календарю Google я могу редактировать его в любое время, пока пользователь не отменит доступ. Должен ли я реализовывать это во фронтенде или в бэкэнде и как? Я проверил несколько ответов, в которых упоминается, что мы можем использовать учетную запись службы, но неясно, как я могу редактировать или читать события календаря отдельного пользователя и как я могу удалить его, когда пользователь отменяет доступ. Этот вопрос был удален, потому что код отсутствовал, поэтому добавьте код ниже.

Я пробовал это, поэтому после входа в систему я получаю токен доступа, и я использую его

window.gapi.load("client:auth2", () => {
  window.gapi.client.setApiKey("api_key");
  window.gapi.client.load("https://content.googleapis.com/discovery/v1/apis/calendar/v3/rest")
  .then(() => {
    window.gapi.auth.setToken({ access_token: access_token })
    window.gapi.client.calendar.events.insert({
      "calendarId": "id",
      'resource': event
    }).then((res) => {
      console.log("calendar data res "+JSON.stringify(res))
    }).catch(err => console.log("error getting calendar data "+JSON.stringify(err)))
  }).catch(err => console.error("Error loading GAPI client for API", err) )
})

, но как только токен доступа истекает, как Могу ли я получить новый токен доступа (я не хочу снова и снова показывать пользователю всплывающее окно входа в систему. Я хочу знать, как это сделать, используя токен refre sh на стороне клиента).

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вы не можете получить токен refre sh на стороне клиента, не предоставив свой секретный ключ publi c.

Вы можете создать конечную точку, которая принимает код oAuth и возвращает токен , сохраните токен refre sh на потом. Вы настраиваете задание кукурузы, которое проверяет просроченные токены и обновляет их.

Каждый раз, когда пользователь обращается к вашему приложению, вы берете fre sh токен с сервера и продолжаете работать в обычном режиме.

Согласно рекомендациям Google. Сделайте от POST до https://oauth2.googleapis.com/token. Предполагая, что ваш стек на стороне сервера находится в Node.js, вы делаете что-то подобное, используя HTTP-клиент, например Ax ios:

const Axios = require('axios');
const Qs = require('querystring');

const GOOGLE_CLIENT_ID = 'abc';
const GOOGLE_CLIENT_SECRET = '123';

let refreshToken = getFromDataBase(); // should be stored in database

Axios.post('https://oauth2.googleapis.com/token', Qs.stringify({
    client_id: GOOGLE_CLIENT_ID,
    client_secret: GOOGLE_CLIENT_SECRET,
    refresh_token: refreshToken,
    grant_type: 'refresh_token'
}), {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
    }
})
.then(({ data }) => console.log(data.access_token)) // new token that expires in ~1 hour
.catch(console.log)
0 голосов
/ 07 августа 2020

Во-первых, хотите ли вы (а) обновить календарь, когда пользователь не вошел в систему, например, в ответ на внешнее событие? ... ИЛИ ... вы (б) хотите обновить календарь только из сеанса браузера?

Если (а), то вам нужно запросить у пользователя автономный доступ, который даст вам Refre sh Token, который вы можете безопасно хранить на сервере и использовать в любое время. (Забудьте все об учетных записях служб).

Если (b), тогда вам понадобится следующая информация: -

  1. Когда срок действия токена доступа истечет, запросите доступ снова, но добавьте флаг prompt=none. Это даст вам fre sh токен доступа, при этом пользователь не увидит никакого UX.
  2. Сделайте это в скрытом iframe, чтобы это происходило в фоновом режиме и было невидимо для пользователя. Таким образом, ваш iframe всегда будет иметь актуальный токен доступа, которым он может поделиться с вашим приложением через localStorage или postMessage.
...