У меня есть веб-приложение 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' (которая не очень помогает ...).
Если пользователь ранее разрешил моему веб-приложению доступ к своим календарям,
читать или писать на эти календари через сервисную учетную запись должно работать?
Так что я не понимаю что я пропустил или неправильно понял? и нужен явный код для продвижения вперед.
Надеюсь, что мое объяснение достаточно ясное.
Спасибо за вашу помощь!