Подтвердить что ты не робот

Как авторизовать приложение (веб или установленное) без вмешательства пользователя?

Допустим, у меня есть веб-приложение, которому нужен доступ к файлам диска в фоновом режиме. Ему будут принадлежать файлы, к которым он обращается, или он будет запущен в учетной записи Google, с которой владелец поделился документами.

Я понимаю, что моему приложению нужен токен обновления, но я не хочу писать код для его получения, поскольку я сделаю это только один раз.

NB. Это НЕ использование Сервисной учетной записи. Приложение будет работать под обычной учетной записью Google. Сервисная учетная запись является допустимым подходом в некоторых ситуациях. Однако техника использования Oauth Playground для симуляции приложения может сэкономить кучу лишних усилий и применяется к любым API, для которых совместное использование с учетной записью службы не поддерживается.

4b9b3361

Ответ 1

Это можно сделать с помощью Oauth2 Playground по адресу https://developers.google.com/oauthplayground.

Шаги: -

  1. Создайте учетную запись Google (например, [email protected]). Или пропустите этот шаг, если вы используете существующую учетную запись.
  2. Используйте консоль API для регистрации mydriveapp (https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp или просто https://console.developers.google.com/apis/).
  3. Создайте новый набор учетных данных (NB OAuth Client ID не Service Account Key а затем выберите "Веб-приложение" из списка)
  4. Добавьте https://developers.google.com/oauthplayground в качестве действительного URI перенаправления.
  5. Запишите идентификатор клиента (веб-приложение) и Client Secret
  6. Войдите как [email protected]
  7. Перейти на площадку Oauth2
  8. В настройках (значок шестеренки) установите
    • Oauth flow: сервер
    • Тип доступа: автономный
    • Используйте свои собственные учетные данные OAuth: TICK
    • Идентификатор клиента и секрет клиента: с шага 5
  9. Нажмите Шаг 1 и выберите Drive API https://www.googleapis.com/auth/drive (сказав, что этот метод также работает для любого из перечисленных API Google)
  10. Нажмите Авторизовать API. Вам будет предложено выбрать свой аккаунт Google и подтвердить доступ
  11. Нажмите Шаг 2 и "Код авторизации Exchange для токенов"
  12. Скопируйте возвращенный токен обновления и вставьте его в свое приложение, исходный код или в какое-либо хранилище, откуда ваше приложение сможет его получить.

Ваше приложение теперь может запускаться без присмотра и использовать токен обновления, как описано https://developers.google.com/accounts/docs/OAuth2WebServer#offline, чтобы получить токен доступа.

NB. Имейте в виду, что срок действия маркера обновления может истечь, что означает, что вам нужно повторить шаги 5 и далее, чтобы получить новый токен обновления. Симптомом этого будет возвращение недействительного гранта при попытке использовать токен обновления.

NB2. Этот метод работает хорошо, если вам нужно веб-приложение, которое имеет доступ к вашей (и только к вашей) учетной записи Drive, не беспокоясь о том, чтобы написать код авторизации, который будет запускаться только один раз. Просто пропустите шаг 1 и замените "my.drive.app" своим собственным адресом электронной почты на шаге 6. Убедитесь, что вы знаете о последствиях безопасности, если маркер обновления будет украден.

См. Ниже комментарий Вуди, где он ссылается на это видео Google https://www.youtube.com/watch?v=hfWe1gPCnzc

, ,

Вот небольшая процедура JavaScript, которая показывает, как использовать токен обновления из OAuth Playground, чтобы получить список некоторых файлов Drive. Вы можете просто скопировать и вставить его в консоль разработчика Chrome или запустить его с помощью узла. Конечно, предоставьте свои собственные учетные данные (ниже приведены все поддельные).

function get_access_token_using_saved_refresh_token() {
    // from the oauth playground
    const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0";
    // from the API console
    const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com";
    // from the API console
    const client_secret = "WnGC6KJ91H40mg6H9r1eF9L";
    // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
    const refresh_url = "https://www.googleapis.com/oauth2/v4/token";

    const post_body = 'grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}';

    let refresh_request = {
        body: post_body,
        method: "POST",
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }

    // post to the refresh endpoint, parse the json response and use the access token to call files.list
    fetch(refresh_url, refresh_request).then( response => {
            return(response.json());
        }).then( response_json =>  {
            console.log(response_json);
            files_list(response_json.access_token);
    });
}

// a quick and dirty function to list some Drive files using the newly acquired access token
function files_list (access_token) {
    const drive_url = "https://www.googleapis.com/drive/v3/files";
    let drive_request = {
        method: "GET",
        headers: new Headers({
            Authorization: "Bearer "+access_token
        })
    }
    fetch(drive_url, drive_request).then( response => {
        return(response.json());
    }).then( list =>  {
        console.log("Found a file called "+list.files[0].name);
    });
}

get_access_token_using_saved_refresh_token();

Ответ 2

Я все еще получаю {"error_description": "Unauthorized", "error": "invalid_client"} на шаге 11 - любая помощь? пожалуйста