Для моего приложения экспресс-сервера у меня есть auth.json
файл для аутентификации, который отлично работает при разработке. В моем развернутом приложении проверка подлинности не выполняется, когда я загружаю файл с сообщением об ошибке:
Ошибка: не удалось загрузить учетные данные по умолчанию. Перейдите к https://cloud.google.com/docs/authentication/getting-started для получения дополнительной информации.
Почему моя аутентификация не работает при развертывании?
В настоящее время все мои сегменты в этом проекте являются общедоступными для Интернета, а роли allUsers и электронная почта учетной записи службы имеют полные роли создателя / просмотра / администратора объекта хранилища. Файл auth.json
находится на том же иерархическом уровне, что и app.js.
Вот мой код app.js со всеми библиотеками и почтовый запрос, который загружает изображение. Следует отметить, что функция uploadThumb()
работает каждый раз, но именно uploadFile
вызывает ошибку, показанную ниже.
const express = require("express");
const bodyParser = require("body-parser");
const _ = require("lodash")
const ejs = require("ejs");
const sharp = require('sharp');
const multer = require("multer");
const fs = require("file-system");
const imageThumbnail = require("image-thumbnail");
const {Storage} = require('@google-cloud/storage');
const storage = new Storage({keyFileName: "auth.json"});
const app = express();
//this writes the user submitted image to the local file system
var localStorage = multer.diskStorage({
destination: function (req, file, cb) {
const imageDirect = req.body.categories + "/" + req.body.subcat.charAt(0).toUpperCase() + req.body.subcat.slice(1).replace(/ /g, "-") + "/";
var dir = "./" + imageDirect;
if(!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
cb(null, imageDirect)
},
filename: function (req, file, cb) {
let tempImageName = file.originalname;
req.imageName = tempImageName
cb(null, tempImageName.replace(/ /g, "-"))
}
});
var upload = multer({storage: localStorage});
app.post("/upload", upload.single("image"), (req, res) => {
//These define the paths and destinations dynamically
let cat = req.body.categories;
let subCatLiteral = req.body.subcat.split(" ");
let subCat = ""
for (i=0; i < subCatLiteral.length; i++) {
var eachWord = subCatLiteral[i].charAt(0).toUpperCase() + subCatLiteral[i].slice(1);
if (i < subCatLiteral.length-1) {
subCat = subCat.concat(eachWord + "-");
} else {
subCat = subCat.concat(eachWord);
}
}
let img = req.imageName.replace(/ /g, "-");
let imgTitle = img.split(".")[0];
let imagePath = cat + '/' + subCat + '/' + img
//This is uploaded 1st
async function uploadThumb() {
await storage.bucket(thumbs).upload(imgTitle + "-thumb.jpg", {metadata: {cacheControl: "no-cache"}, gzip: true, destination: cat + "/" + subCat + "/" + req.body.name.replace(/ /g, "-") + "-thumb.jpg"})
uploadFile().catch(console.error);
fs.unlinkSync(imgTitle + "-thumb.jpg") //deletes file after upload
}
//This is uploaded 2nd, causing the error
async function uploadFile() {
await storage.bucket(bucketName).upload(imagePath, {metadata: {cacheControl: "no-cache"}, resumable: true, gzip: true, destination: cat + "/" + subCat + "/" + req.body.name.replace(/ /g, "-") + ".jpg"})
//deletes file after upload
fs.unlinkSync(`${cat}/${subCat}/${img}`)
fs.rmdirSync(`./${cat}/${subCat}/`)
setTimeout(() => {
fs.rmdirSync(`./${cat}`)
}, 500)
await listFiles().catch(console.error);
}
//This function starts the chain of uploads
sharp(imagePath)
.resize(null, 300).toFile(imgTitle + "-thumb.jpg", function(err) {
if (!err) console.log("image resized");
uploadThumb().catch(console.error);
})
res.redirect("/upload#upload");
});
Если кто-нибудь знает, почему это не работает в производстве или где именно в документации я могу найти решение, я был бы признателен.
Вот самая последняя ошибка, отправленная в журнал пассажира.
App 21701 output: Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
App 21701 output: at GoogleAuth.getApplicationDefaultAsync (/home/kaylakos/nodevenv/rootdir/kayla/12/lib/node_modules/google-auth-library/build/src/auth/googleauth.js:157:19)
App 21701 output: at processTicksAndRejections (internal/process/task_queues.js:97:5)
App 21701 output: at async GoogleAuth.getClient (/home/kaylakos/nodevenv/rootdir/kayla/12/lib/node_modules/google-auth-library/build/src/auth/googleauth.js:490:17)
App 21701 output: at async GoogleAuth.request (/home/kaylakos/nodevenv/rootdir/kayla/12/lib/node_modules/google-auth-library/build/src/auth/googleauth.js:543:24)
App 21701 output: at async Upload.makeRequest (/home/kaylakos/nodevenv/rootdir/kayla/12/lib/node_modules/gcs-resumable-upload/build/src/index.js:320:21)
App 21701 output: at async Upload.createURIAsync (/home/kaylakos/nodevenv/rootdir/kayla/12/lib/node_modules/gcs-resumable-upload/build/src/index.js:145:22)
gcloud
auth на основе сообщения об ошибке. - person John Hanley   schedule 05.10.2020const storage = new Storage({keyFilename: "/fullpath/serviceaccount.json"});
- person John Hanley   schedule 06.10.2020Could not load the default credentials
означает, что вы неправильно указываете файл для загрузки учетных данных. Отредактируйте свой вопрос и покажите код, который вы используете, и удалите код, который вы пробовали. Затем опубликуйте ошибки, соответствующие коду. Включите строки, которые показывают библиотеки, которые вы используете. - person John Hanley   schedule 06.10.2020