За последние два месяца я столкнулся с проблемой истечения срока действия токена обновления, мне приходится генерировать новый токен обновления из игровой площадки 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);
}
}
Игровая площадка 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;
}
Пока ваше приложение находится на этапе тестирования, ваш токен обновления будет действителен только в течение семи дней. Вам нужно будет настроить приложение на производство, после чего срок действия вашего токена обновления перестанет действовать.
Это верно. но теперь он работает только для учетных записей рабочей области.
Нужно ли загружать файл token.json и учетные данные.json для приведенного выше кода? @DaImTo
учетные данные.json исходит из консоли разработчика Google. Для созданного вами проекта. Приведенный выше код сгенерирует token.json, в нем будет храниться токен обновления.
Вам нужно только скачать файл credentials.JSON
. Вы можете сделать это, создав OAuth client ID
внутри проекта.
что мне поставить на uri перенаправления, я поставил uri google Oauth2 playgound, но он выдает мне ошибку недопустимого uri @DaImTo
Ошибка: Предоставленный ключевой файл не определяет допустимый URI перенаправления. Должен быть определен хотя бы один URI перенаправления, и в этом примере предполагается, что он перенаправляет на «localhost: 3000/oauth2callback». Пожалуйста, отредактируйте свой ключевой файл и добавьте раздел «redirect_uris».
когда я использую это в uri перенаправления "localhost: 4343/api/v1/oauth2callback", выдает ошибку: - слушайте EADDRINUSE: адрес уже используется ::: 4343
у вас есть что-то еще, работающее на этом порту
если я изменю номер порта, то снова выдает ошибку EADDRINUSE: адрес уже используется
эй @DaImTo, если использовать учетную запись службы вместо oAuth2, есть ли срок действия?
Сервисные аккаунты предварительно авторизованы. Пока он настроен, он будет работать, пока его кто-нибудь не удалит.
Как сказал @DaImTo, лучший способ — использовать токен обновления. Просто добавим, что если только вы будете использовать приложение/код и иметь учетную запись Workspace, вы можете создать внутренний проект, и срок действия кода не истечет каждые 7 дней.