1

Я написал онлайн-конвертер и интегрировал Auth0 на свой сайт. То, что я пытаюсь достичь, - автоматическая загрузка конвертированного файла на Google Диск зарегистрированного пользователя. Я создал Google oauth в Auth0, и все, казалось, работало нормально.Auth0 и API Google, токен доступа истек, способ записи файлов на Google Диск

Проблема в том, что access_token Google истекает через 60 минут, и у меня нет refresh_token. Поэтому пользователю необходимо снова войти в систему с помощью страницы входа в Google. Это не то, чего я хочу, потому что пользователь на самом деле зарегистрирован в пути дольше, чем 60 минут на моем сайте, но Google отказывается от API-вызовов (поскольку токен Google истек).

Я знаю, что могу запросить refresh_token, установив access_type=offline, но это добавит разрешения Have offline access. Я не хочу этого, я просто хочу загрузить данные на диск пользователя, если он нажал кнопку конвертировать на мою страницу. Я не хочу запрашивать у пользователей разрешения, которые мне не нужны. Если я (как пользователь) свяжу свою учетную запись Google с аналогичной страницей, и инструмент будет запрашивать автономный доступ, я бы не одобрил, если честно - разрешение звучит так, как создатель инструмента может делать все, что захочет, с вашей учетной записью всякий раз, когда он хочет ... Есть много инструментов, которые имеют доступ на запись к Диску пользователя без запроса автономного доступа и с одним единственным логином, пока пользователь не аннулирует разрешение. Как это делается?

Есть ли способ, чтобы сделать Google API вызовы без просить для автономного доступа и без заставляя пользователя утвердить приложение (который уже одобрил его) снова и снова каждый 60min?

Спасибо заранее, phlo

+0

Где вы нашли, чтобы добавить запрос на автономный доступ? Я использую Auth0 и блокируюсь с помощью Angular2 и пытаюсь найти способ сделать это. –

+0

- https://auth0.com/docs/tokens/refresh-token#obtain-a-refresh-token - https://auth0.com/forum/t/get-google-refresh-token/4674/6 – phlo

ответ

0

Я нашел решение!

Prerequirements

  1. Включить Use Auth0 instead of the IdP to do Single Sign On в панели управления вашего клиента
  2. Создать новый угловой маршрут для обработки молчаливого входа в функции обратного вызова (например,/sso)
  3. Добавить

    $rootScope.$on("$locationChangeStart", function() { 
        if ($location.path().indexOf("sso") == -1) { 
         authService.relogin(); //this is your own service 
        } 
    }); 
    

    к вашему выполнению функции и установите callbackURL в angularAuth0Provider.init() к новому углового маршруту (<YOUR_DOMAIN>/sso). Добавьте этот URL в обслуживаемых обратные вызовы в приборной панели Auth0 - это не закончится в бесконечном цикле, потому что locationChangeStart -Event не будет вызывать authService.relogin() для этого маршрута

  4. Добавить $window.close(); в контроллер углового маршрута (/sso) для автоматического закрытия всплывающего окна
  5. аутентифицировать пользователя через Auth0 и сохранить метку времени и Auth0- access_token где-то

на перезагрузкой:

Проверьте, действительно ли токен Auth0 действует в authService.relogin(). Если нет, пользователь должен снова войти в систему в любом случае. Если маркер является действительным, и маркер Google истекает в (проверьте это с сохраненной меткой времени для предотвращения ненужных вызовов API) проверять SSO-данные и вход молча, если он присутствует

/* ... */ 
    if (validToken && googleExpired) { 
     angularAuth0.getSSOData(function (err, data) { 
      var lastUsedConnection = data.lastUsedConnection; 
      var connectionName = (_.isUndefined(lastUsedConnection) ? undefined : lastUsedConnection.name); 
      var isGoogle = (_.isUndefined(connectionName) ? false : connectionName == "google-oauth2"); 
      if (!err && data.sso && isGoogle) { 
       authManager.authenticate(); 
       localStorage.setItem("last-relogin", new Date().getTime()); 
       angularAuth0.signin({ 
        popup: true, 
        connection: data.lastUsedConnection.name 
       }); 
      } 
     }); 
    } 

Теперь вы найдете свежую Google access_token для этого пользователя (без запроса доступа в автономном режиме)


Ресурсы:

0

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

Нет никакого способа запросить токен обновления, не показывая это сообщение. Также нет способа изменить сообщение, это стандартная вещь Google.

+0

Это имеет смысл. Но у меня есть несколько инструментов, связанных с моей собственной учетной записью Google, например, Thunderbird - только с разрешением «Gmail», без автономного доступа. Если я открою Thunderbird, я никогда не попрошу предоставить разрешение или логин снова - он просто работает. Как это делается? Почему Thunderbird может выполнять вызовы API без наличия токена обновления и не запрашивать пользователя для входа снова? – phlo

+0

Gmail особенный, вы также можете пройти через SMTP-сервер. Но я ничего не знаю о Thunderbird, кроме того, что это было когда-то действительно странное телешоу, не могу помочь – DaImTo

+0

У меня также есть инструменты с подключением к диску, и они не просят меня войти или повторно предоставить все. – phlo

0

Есть ли способ совершать вызовы API Google без запроса автономного доступа и не заставлять пользователя одобрять приложение (которое уже одобрено им) снова и снова каждые 60 минут?

Да, есть способы, но это зависит от особенностей вашего прецедента. Например, ваш код в Java/php/etc работает на сервере или работает JavaScript в браузере?

Выполнение авторизации в браузере, возможно, является самым простым решением, поскольку библиотека Google (https://developers.google.com/api-client-library/javascript/features/authentication) выполняет всю работу за вас.

+0

Спасибо за ваш ответ. Clientside - это угловые и серверные узлы. Авторизация выполняется на стороне клиента, и было бы здорово вызвать API с сервера, но это не обязательно. Спасибо за ссылку. – phlo

+0

В этом случае все очень просто. Вы можете использовать библиотеку Google JS или https://github.com/timdream/google-oauth2-web-client для создания токена доступа. Если/когда он истечет, библиотеки могут запросить новый в фоновом режиме, не видя пользовательского интерфейса.Когда у вас есть токен доступа, вы можете использовать его у клиента или отправить его на свой сервер - он работает одинаково хорошо из обоих источников. – pinoyyid

+0

Спасибо, это звучит здорово. Я дам ему попробовать. :) – phlo