Клиентская библиотека 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
Я так и думал, но оказалось, что до тех пор, пока пользователь фактически не примет разрешение на автономный доступ, немедленный метод аутентификации не работает, поэтому я вынужден вызывать не немедленный, а затем он запрашивает автономный доступ.   -  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. Это всегда терпит неудачу, пока пользователь не примет разрешение на онлайн-доступ, поэтому у меня нет другого выбора, кроме как запустить всплывающее окно авторизации с немедленно: false. Я только что зашел на демонстрационную страницу gapi.auth.signIn(), и поведение там просто такой же. - person Constantine Poltyrev; 29.12.2013
comment
Демо-страница показывает поведение, потому что она использует ApprovalPropt=force (я предполагаю, что для демонстрационных целей), против чего рекомендует блог, на который я ссылаюсь. - person abraham; 29.12.2013
comment
Хорошо, я создал скрипку из этот пример, и он по-прежнему запрашивает автономный доступ, когда вы запускаете его во второй раз. Может быть, проблема связана с прицелами, которые я использую? - person Constantine Poltyrev; 29.12.2013
comment
Надеюсь, Google признает это ошибкой - person Constantine Poltyrev; 02.01.2014

У меня была точно такая же проблема с областью действия drive.readonly, потому что то, как я работал, всегда вызывало авторизацию с немедленным = false. Это не так уж плохо, потому что, когда вы делаете это для уже авторизованного пользователя, Google откроет всплывающее окно на долю секунды, но затем немедленно закроет его (очевидно, используя возможность открыть всплывающее окно в обработчике событий браузера). в случае, если пользователю действительно необходимо авторизоваться).

Любопытно, что для локального сервера, где я ранее использовал сразу = true, я продолжаю видеть запросы на автономный доступ, но на рабочем сервере я их пока не видел, скрестим пальцы.

person Ivan    schedule 13.01.2014
comment
Я тоже пробовал такой подход. Он по-прежнему запрашивает автономный доступ при повторном входе на страницу :( Я думаю, пока ребята из Google не проснутся, проблема останется. - person Constantine Poltyrev; 14.01.2014