Как получить доступ к Google Drive API без истечения срока действия или отзыва токена обновления или любого другого решения

За последние два месяца я столкнулся с проблемой истечения срока действия токена обновления, мне приходится генерировать новый токен обновления из игровой площадки Google Oauth каждые 3-4 дня. Мне нужно постоянное решение, чтобы я мог получить доступ к API Google Диска с бесконечным временем.

Это код авторизации, который я написал в узле js.

const { google } = require('googleapis');
const async = require('async')

const CLIENT_ID = process.env.GOOGLE_CLIENT_KEY;
const CLIENT_SECRET = process.env.GOOGLE_SECRET_KEY;
const REDIRECT_URI = https://developers.google.com/oauthplayground
const REFRESH_TOKEN = process.env.REFRESH_TOKEN;
const oauth2Client = new google.auth.OAuth2(
    CLIENT_ID,
    CLIENT_SECRET,
    REDIRECT_URI
);

oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });

const drive = google.drive({
    version: 'v3',
    auth: oauth2Client,
});

async function uploadFile(res) {
  try {
    const response = await drive.files.create({
      requestBody: {
        name: `${res}.docx`,
        mimeType: 'application/vnd.google-apps.document',
      },
      media: {
        mimeType: 'application/vnd.google-apps.document',
        body: "you can write in a body field in backend",
      },
    });
    return response.data.id
  } catch (error) {
    console.info(error);
  }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Игровая площадка Google oauth2 предназначена только для тестирования. Он не предназначен для использования в качестве производственного решения.

Вы должны настроить свой код для запроса авторизации один раз и сохранить токен. Затем он сможет запросить новый токен доступа, когда ему это понадобится. см. краткое руководство по node.js

const fs = require('fs').promises;
const path = require('path');
const process = require('process');
const {authenticate} = require('@google-cloud/local-auth');
const {google} = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = path.join(process.cwd(), 'token.json');
const CREDENTIALS_PATH = path.join(process.cwd(), 'credentials.json');

/**
 * Reads previously authorized credentials from the save file.
 *
 * @return {Promise<OAuth2Client|null>}
 */
async function loadSavedCredentialsIfExist() {
  try {
    const content = await fs.readFile(TOKEN_PATH);
    const credentials = JSON.parse(content);
    return google.auth.fromJSON(credentials);
  } catch (err) {
    return null;
  }
}

/**
 * Serializes credentials to a file comptible with GoogleAUth.fromJSON.
 *
 * @param {OAuth2Client} client
 * @return {Promise<void>}
 */
async function saveCredentials(client) {
  const content = await fs.readFile(CREDENTIALS_PATH);
  const keys = JSON.parse(content);
  const key = keys.installed || keys.web;
  const payload = JSON.stringify({
    type: 'authorized_user',
    client_id: key.client_id,
    client_secret: key.client_secret,
    refresh_token: client.credentials.refresh_token,
  });
  await fs.writeFile(TOKEN_PATH, payload);
}

/**
 * Load or request or authorization to call APIs.
 *
 */
async function authorize() {
  let client = await loadSavedCredentialsIfExist();
  if (client) {
    return client;
  }
  client = await authenticate({
    scopes: SCOPES,
    keyfilePath: CREDENTIALS_PATH,
  });
  if (client.credentials) {
    await saveCredentials(client);
  }
  return client;
}

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

Как сказал @DaImTo, лучший способ — использовать токен обновления. Просто добавим, что если только вы будете использовать приложение/код и иметь учетную запись Workspace, вы можете создать внутренний проект, и срок действия кода не истечет каждые 7 дней.

Giselle Valladares 08.11.2022 18:33

Это верно. но теперь он работает только для учетных записей рабочей области.

DaImTo 08.11.2022 19:01

Нужно ли загружать файл token.json и учетные данные.json для приведенного выше кода? @DaImTo

Sudhanshu Sahu 08.11.2022 19:35

учетные данные.json исходит из консоли разработчика Google. Для созданного вами проекта. Приведенный выше код сгенерирует token.json, в нем будет храниться токен обновления.

DaImTo 08.11.2022 20:24

Вам нужно только скачать файл credentials.JSON. Вы можете сделать это, создав OAuth client ID внутри проекта.

Giselle Valladares 08.11.2022 20:48

что мне поставить на uri перенаправления, я поставил uri google Oauth2 playgound, но он выдает мне ошибку недопустимого uri @DaImTo

Sudhanshu Sahu 11.11.2022 06:22

Ошибка: Предоставленный ключевой файл не определяет допустимый URI перенаправления. Должен быть определен хотя бы один URI перенаправления, и в этом примере предполагается, что он перенаправляет на «localhost: 3000/oauth2callback». Пожалуйста, отредактируйте свой ключевой файл и добавьте раздел «redirect_uris».

Sudhanshu Sahu 11.11.2022 06:35

когда я использую это в uri перенаправления "localhost: 4343/api/v1/oauth2callback", выдает ошибку: - слушайте EADDRINUSE: адрес уже используется ::: 4343

Sudhanshu Sahu 11.11.2022 07:21

у вас есть что-то еще, работающее на этом порту

DaImTo 11.11.2022 09:14

если я изменю номер порта, то снова выдает ошибку EADDRINUSE: адрес уже используется

Sudhanshu Sahu 11.11.2022 09:58

эй @DaImTo, если использовать учетную запись службы вместо oAuth2, есть ли срок действия?

Sudhanshu Sahu 15.11.2022 06:23

Сервисные аккаунты предварительно авторизованы. Пока он настроен, он будет работать, пока его кто-нибудь не удалит.

DaImTo 15.11.2022 09:15

Другие вопросы по теме

Похожие вопросы