Клиентската библиотека на Google Javascript OAUTH иска разрешение за офлайн достъп, въпреки че никога не е поискано

Моето приложение взаимодейства с Google само с Javascript. Той иска достъп до потребителски профил, достъп до имейл и разрешения за управление на контакти. При зареждане на страница приложението проверява дали потребителят вече е предоставил тези разрешения и получава токен за достъп, ако е дал.

Ето примерен код:

var GoogleContacts = {
...
    checkAuth: function(){
        gapi.auth.authorize({
            client_id: googleKeys.clientId, 
            scope: googleKeys.scopes, 
            immediate: true
          }, 
          jQuery.proxy(this.handleAuthResult, this)
        );
    },
    askAuth: function(){
        gapi.auth.authorize({
            client_id: googleKeys.clientId, 
            scope: googleKeys.scopes, 
            immediate: false
          }, 
          jQuery.proxy(this.handleAuthResult, this)
        );
    }
...
}

....

function handleGoogleApiLoad(){
    gapi.client.setApiKey(googleKeys.apiKey);
    gapi.auth.init(function(){console.info('popup api ready')});
    setTimeout(function(){GoogleContacts.checkAuth();}, 300);
}

....

$('#emailButton').click(function() {
    if(!accessToken)
       GoogleContacts.askAuth();
    ...
});

Сега, ако потребител дойде за първи път, той се пита за правилните разрешения, когато натисне бутона „Изпращане на имейл“. Когато потребителят презареди страница, безпроблемната проверка на разрешенията връща грешка и когато потребителят натисне бутона „изпрати имейл“, отваряме отново изскачащия прозорец за упълномощаване на Google и сега той иска разрешение за офлайн достъп.
Това изглежда неправилно, тъй като JS api няма реална употреба за офлайн достъп.
Изглежда, че този проблем е започнал, след като Google пусна функцията за постепенно удостоверяване: http://googleplusplatform.blogspot.co.il/2013/12/google-sign-in-improvements11.html

Това грешка ли е, която скоро ще бъде коригирана , или трябва да променим кода по някакъв начин, за да не объркваме потребителите си със странни искания за разрешение?

Актуализация:

Опитах се да използвам plus api и метода gapi.auth.signIn(), но със същия резултат. Очевидно този проблем зависи от обхвата, тъй като когато използвам само обхвата за влизане, всичко работи според очакванията, но добавянето на обхвата на достъп до Google Контакти https:||www.google.com/m8/feeds/ винаги води до офлайн достъп заявка при влизане в страницата втори път. Ето цигулка, за да потвърдите това: http://jsfiddle.net/hjLM6/6/ Това трябва е бъг и наистина бих искал Google скоро да се справи с него, тъй като плаши потребителите.


person Constantine Poltyrev    schedule 27.12.2013    source източник
comment
Може да е проблем, свързан с това: riskcompletefailure.com/2013 /12/   -  person abraham    schedule 29.12.2013
comment

Всъщност DirectX може да улови не само прозореца, рисуван от d3d, но и целия екран по този начин: http://imgur.com/FojhNwA

Току що завърших тази програма вчера :P

На моя компютър използването на gdi+ (Bitblt) струва около 60 ms, за да се направи 1080p екранна снимка, но само 9 ms, за да се направи екранна снимка и да се изобрази рамка от DirectX (IDXGIOutputDuplication).

Това е най-бързият начин, който бях пробвал, но за съжаление изглежда, че работи само на Windows 8 (не мога да стартирам тази програма на моята машина с Windows 7).

Можете да проверите информацията от тук: https://msdn.microsoft.com/en-us/library/windows/desktop/hh404487

И в тази статия има примерен код.

  -  person Constantine Poltyrev    schedule 29.12.2013


Отговори (2)


Параметърът immediate:false във вашия askAuth метод е причината. публикацията, която Ейбрахам споменава, обяснява предисторията.

Методът gapi.auth.authorize() обикновено трябва да се избягва в повечето случаи сега, когато методът gapi.auth.signIn() е достъпен за обработка програмно иницииране на потока за оторизация и също така трябва да използвате динамичните обратни извиквания. Информацията за наблюдение на състоянието на потребителска сесия обяснява как и кога да получите своя функция за обратно извикване за влизане, за да се задейства и как можете да използвате стойностите в резултата от обекта за удостоверяване, за да определите дали преди това са упълномощили приложението ви, дали са влезли (или излезли) от приложението ви или влезли (или излезли) от google.

Вашите функции checkAuth и askAuth ефективно ще бъдат комбинирани, за да проверят състоянието на резултатния обект за удостоверяване и да действат съответно. Вашето събитие за щракване върху бутон за имейл ще задейства вместо това gapi.auth.signIn() с необходимите параметри и обхвати за вашето приложение.

person BrettJ    schedule 29.12.2013
comment
Извиквам gapi.auth.authorize() с незабавно: true точно при събитието за зареждане на Google API. Винаги се проваля, докато потребителят не приеме разрешението за онлайн достъп, така че нямам друг избор след това да пусна изскачащ прозорец за оторизация с immediate:false Току-що отидох на демонстрационната страница gapi.auth.signIn() и поведението там е просто един и същ. - person Constantine Poltyrev; 29.12.2013
comment
Демонстрационната страница показва поведението, защото използва approvalprompt=force (предполагам за демонстрационни цели), което блогът, към който свързах, не препоръчва. - person abraham; 29.12.2013
comment
Добре, създадох цигулка от този пример и той все още иска офлайн достъп, когато го стартирате втори път. Може би проблемът е свързан с обхватите, които използвам? - person Constantine Poltyrev; 29.12.2013
comment
Надявам се Google да признае това за грешка - person Constantine Poltyrev; 02.01.2014

Току-що имах точно същия проблем с обхвата на drive.readonly, тъй като си струва начинът, по който го заобиколих, е винаги да извиквам авторизиране с immediate = false. Това не е толкова лошо, защото когато направите това за вече оторизиран потребител, Google ще отвори изскачащия прозорец за част от секундата, но след това веднага ще го затвори (очевидно използвайки възможността да отворите изскачащия прозорец в манипулатора на събития на браузъра в случай че потребителят трябва да упълномощи).

Любопитно е, че за localhost сървър, където преди това използвах immediate = true, продължавам да виждам заявки за офлайн достъп - но на производствения сървър не съм ги виждал досега, стискам палци.

person Ivan    schedule 13.01.2014
comment
И аз съм пробвал този подход. Все още изисква офлайн достъп при повторно влизане в страницата :( Предполагам, че докато хората от Google не се събудят, проблемът остава. - person Constantine Poltyrev; 14.01.2014