(все еще не решено) Предоставление доступа к веб-приложению для доступа к календарю пользователя Google на стороне клиента и сервера? (с Firebase и Google API) - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть веб-приложение Firebase ,
и хотите, чтобы любой пользователь мог войти в систему и авторизовать мое веб-приложение для доступа к своим календарям Google (чтение / запись) на клиенте AND Сервер сторона (для управления календарями, когда пользователь в сети и когда он не в сети).


Вкл. На стороне клиента .
После создания ключа API и идентификатора клиента OAuth 2.0 (веб-приложение) в консоли разработчиков Google , Я реализовал этот код:

Сначала войдите с помощью Google через Аутентификация Firebase

firebase.initializeApp({apiKey: 'MY_WEB_APP_API_KEY'})
var provider = new firebase.auth.GoogleAuthProvider()
provider.addScope('https://www.googleapis.com/auth/calendar')
firebase.auth().signInWithPopup(provider)

И попросите авторизацию, чтобы мое веб-приложение могло получить доступ к пользовательскому Календарю Google с клиентом Google Api JS

// https://apis.google.com/js/api.js
gapi.load('client:auth2', () => {
  gapi.auth2.authorize({
      scope: 'https://www.googleapis.com/auth/calendar',
      client_id: 'MY_WEB_APPL_CLIENT_ID',
      prompt: 'none',
      access_type: 'offline',
      include_granted_scopes: true
    }, () => {
      gapi.client.init({
        discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest']
      }).then(()  => {
        return gapi.client.calendar.events.list({
          calendarId: 'ANY_USER_CALENDAR_ID' // example: 123456789@group.calendar.google.com
        })
      }).then((resolve, reject) => {
        // IT WORKS ON CLIENT SIDE (RETURNS EVENTS LIST AS EXCEPTED)
      })
  })
})

Здесь все работает как на стороне клиента (чтение и запись в подключенный пользовательский Календарь Google).


Но сейчас, на на стороне сервера .
После создания .json ключа учетной записи службы (учетная запись службы App Engine по умолчанию) на консоли разработчиков Google я реализовал google-api-nodejs-client on Облачные функции Firebase , с этим кодом:

const privatekey = require("./MY_WEB_APP_SERVICE_ACCOUNT_KEY.json")
const {google} = require('googleapis')
const jwtClient = new google.auth.JWT(
  privatekey.client_email,
  null,
  privatekey.private_key,
  ['https://www.googleapis.com/auth/calendar']
)
jwtClient.authorize()
const calendar = google.calendar('v3')

calendar.events.list({
  auth: jwtClient,
  calendarId: 'ANY_USER_CALENDAR_ID' // (in this case, the same previously used on client side: 123456789@group.calendar.google.com)
}).then((resolve, reject) => {
  // IT DOESNT WORKS ON SERVER SIDE (RETURNS 'Not Found' ERROR...)
})

А вот работает аутентификация ,
но calendar.events.list() возвращает ошибку 'Not Found' (которая не очень помогает ...).


Если пользователь ранее разрешил моему веб-приложению доступ к своим календарям,
читать или писать на эти календари через сервисную учетную запись должно работать?

Так что я не понимаю что я пропустил или неправильно понял? и нужен явный код для продвижения вперед.

Надеюсь, что мое объяснение достаточно ясное.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 01 мая 2018

Когда пользователь предоставит разрешения вашему приложению (с идентификатором клиента), ваше приложение сможет получить доступ к информации о пользователе, в данном случае - «Календарь».

Однако это делается не через учетную запись службы, а через идентификатор клиента.

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

Ваша учетная запись службы не будет иметь доступа к Календарю пользователя, если только пользователь не предоставит / не поделится Календарем с учетной записью службы (аналогично разделению Календаря с другой учетной записью Gmail).

Если вы хотите получить доступ к Календару этого пользователя на стороне сервера, вам нужно будет передать токен доступа и обновить токен, возвращенный Google Authentication на клиенте, на ваш сервер. Затем вы можете использовать токен доступа для совершения звонков в Календарь от имени пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...