Особливості роботи з API Google Drive

Нещодавно нам потрібно було зробити просте додаток для Google Drive. Додаток повинно було формувати список користувачів, на яких расшарены документи у зазначеній папці з можливістю редагування. Завдання, в принципі, проста, тому недовго думаючи розгорнув болванку проекту на angularJS і почав кодити. Гугл, подумав я, це ж велика компанія, у нього повинен бути зрозумілий і стабільний API і я зроблю це за пару днів.

Я був занадто наївний.

Авторизація

Додаток передбачало відсутність серверної частини (тільки клієнтський js), тому для авторизації та ідентифікації було вирішено використовувати авторизацію гугла. Авторизація — це ж просто! Але не тут-то було. Для ідентифікації користувача між екранами додатки вирішив зберігати об'єкт авторизації, який повертається методом gapi.auth.getToken(). Метод штатний, все як би для цього і створено. Але при серіалізації цього об'єкта постійно виникала кумедна помилка «Permission denied access to property 'toJSON'». Помилка «інтуїтивно» зрозуміла, тому витратив на неї пів дня. Виявилося, що в об'єкті, який повертає ця функція, є циклічне посилання на самого себе. Циклічне посилання містилася в змінної g-oauth-window. Тому простий код вирішив цю проблему:

var oAuthObj = gapi.auth.getToken();
oAuthObj['g-oauth-window'] = null;
$window.localStorage.setItem('googlerSession', JSON.stringify(oAuthObj));

Наступна проблема при клієнтської авторизації — це відновлення клієнтської сесії. Сесія аутентифікації при використанні тільки клієнтської аутентифікації зберігається на 1 годину. Але як відновити або продовжити — не зрозуміло. Мої танці з бубном з повторною авторизацією і іншим шаманством не змогли мені допомогти, тому досі клієнтська частина у мене авторизує користувача на 1 годину. Для зручності вивів у верхнє меню час, що залишився до инвалидации сесії. В принципі, для цього інструменту 1 години цілком вистачає.

Робота з документами

І тут не обійшлося без проблем. Перша проблема, з якою зіткнувся, — як отримати зовнішню посилання на документ? Якщо зі звичайними документами все гаразд — вона береться з властивості alternateLink об'єкта файлу, папки якась магія. Будь-яка папка повертається у вигляді посилання на дивний інтерфейс folderview, який я до цього ніколи не бачив. Гугление ні до чого не привело, тому довелося виправляти це негарним кодом:

var fileLink = fileObject.alternateLink;
if (fileLink.indexOf("folderview") != 0) {
fileLink = fileLink.replace("folderview?id=", "#folders/");
fileLink = fileLink.replace("&usp=drivesdk", "");
fileLink = fileLink.replace("docs.google.com", "drive.google.com");
}

Права на документи

Весь масив власників документа я будував щодо userId, який віддає гугл. Я думав, він унікальний і дає повне розуміння, що це один і той же користувач. Але це виявилося не так. Згідно документації drive.permissions.list, як id повертається ідентифікатор користувача (пруфлінк). Але в реальності виявилося, що це не той ідентифікатор, який я шукаю. Чому так — для мене досі залишається загадкою. Тому для ідентифікації та «впізнавання» користувача в списку власників я використовував email. Але це ще пів біди.

Така плутанина з ідентифікаторами призводить до іншого цікавого багу. Якщо поточний авторизований користувач є читачем документа, то permission.list не поверне список прав доступу. Отже, що б показати, що я читач — я використовую інформацію з userInfo поточного користувача. А якщо ця ж людина потім буде в permission.list іншого файлу, наприклад, власник документа, то у нього буде зовсім інший ідентифікатор. Це призводить до того, що в списку користувачів поточний авторизований користувач може бути продубльований.



Висновок: ідентифікатора користувача довіряти не можна, тк він може змінюватися. Для ідентифікації користувача краще використовувати email, хоча, теоретично він може бути відсутнім. Наприклад, якщо документ расшарен на корпоративний домен, то в цьому випадку email не буде, так як він расшарен на всіх користувачів, які належать цьому домену.

Була ще пара дрібниць, які вже вилетіли з голови. Наприклад, в об'єкті з інформацією про файл не було кількох змінних описаних у документації. Чесно кажучи вже не пам'ятаю жодних, але це вже дрібниці.

P.S. Що з цього всього вийшло, можна спостерігати тутhttp://googler.chililab.pro). Якщо є ідеї, як доповнити сервіс, пишіть в коментарях — реалізую.

P.P.S. Якщо ви знаєте гарне рішення описаних у статті проблем, напишіть в лічку або в коментарях. Думаю, я не перший, хто зіткнувся з цими проблемами.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.