因此,我正在开发一个 Node.js 应用程序,它将每隔x几秒轮询一次 Google Analytics api。我已经设置了一个“服务帐户”,并将p12密钥转换为.pem文件。初始设置看起来像这样:
var authClient = new google.auth.JWT(authData.serviceEmail, authData.keyFile, null, authData.scope, '');
authClient.authorize(function(err, tokens) {
if (err) {
winston.log('error', 'Error authorizing with GA', {error: err});
return;
}
setInterval(function() {
analytics.data.realtime.get({
'auth': authClient,
...
}, function (err, body) {
// getting 401 error here
})
}, 20000);
});
Run Code Online (Sandbox Code Playgroud)
我没有意识到初始代币的有效期为 1 小时;但是我收到的令牌如下所示:
{
access_token: ...,
token_type: 'Bearer',
expiry_date: NaN,
refresh_token: 'jwt-placeholder
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,一旦收到该401 invalidCredentials错误,我是否只需重新授权即可获取新的访问令牌以便能够从 Google Analytics 进行轮询?我是 JWT 的新手,这似乎会授权太多次。这有限制吗?
作为参考,我正在使用Google …
google-analytics google-api node.js jwt google-api-nodejs-client
使用 Google 的开发者控制台:
节点服务器初始步骤:
var url = oauth2Client.generateAuthUrl({
access_type: 'offline', //returns fresh token,
scope: 'https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.upload https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/youtubepartner'
});
Run Code Online (Sandbox Code Playgroud)
谷歌授权页面:
节点服务器最终步骤:
oauth2Client.getToken(code, function (err, tokens) {
// set tokens to the client
console.log('errors ' + err);
console.log('tokens ' + tokens);
oauth2Client.setCredentials(tokens);
})
Run Code Online (Sandbox Code Playgroud)
console.log 的结果是:
errors Error: invalid_request
tokens null
Run Code Online (Sandbox Code Playgroud)
是什么原因造成的invalid_request …
我尝试使用以下 node.js 代码将产品插入 Google Shopping API,但不断收到错误消息:
{ [Error: [product] INSERT request must specify product]
code: 400,
errors:
[ { domain: 'global',
reason: 'required',
message: '[product] INSERT request must specify product' } ] }
Run Code Online (Sandbox Code Playgroud)
这是我的 javascript 代码(我在这里使用节点客户端: https: //github.com/google/google-api-nodejs-client/):
var google = require('googleapis');
var OAuth2 = google.auth.OAuth2;
var oauth2Client = new OAuth2(*OAUTHDETAILS*);
oauth2Client.setCredentials({
access_token: '*ACCESSTOKEN*',
//refresh_token: 'REFRESH TOKEN HERE'
});
var content = google.content({ version: 'v2', auth: oauth2Client });
var product = {
"channel": "online",
"contentLanguage": "en",
"offerId": *PRODUCTID*,
"targetCountry": …Run Code Online (Sandbox Code Playgroud) javascript node.js google-shopping-api google-api-nodejs-client
我正在尝试从 node.js 应用程序查询 Google Analytics Reporting API。
我想我已经在 google 端正确设置了包括服务帐户在内的所有内容,但我一定遗漏了一部分。
我的应用程序成功地将使用数据发送给 Google,我可以在实时视图中看到它。我还可以使用交互式 API 资源管理器查询数据。
在我的 node.js 代码中,我在服务器启动时使用 API 进行身份验证,如下所示:
var googleapis_key = require('./config/google-api-key.json');
var googleapis = require('googleapis');
var googleapis_jwtClient = new googleapis.auth.JWT(
googleapis_key.client_email,
null,
googleapis_key.private_key,
["https://www.googleapis.com/auth/analytics.readonly"],
null);
var googleapis_analyticsreporting = googleapis.analyticsreporting('v4');
googleapis_jwtClient.authorize(function(err, tokens) {
if (err) {
lStartup.error(err);
lStartup.error("Could not authenticate with google API. Analytics not available.");
} else {
lStartup.info("Successfully authenticated with google service-account.");
lStartup.debug(googleapis_jwtClient.credentials);
}
});
Run Code Online (Sandbox Code Playgroud)
(其中 lStartup 是一个 log4js 记录器)。我得到了 Google 的肯定答复,未设置 err 并且记录到控制台的凭据看起来令人信服。
然后当相关的客户端请求进入我的服务器时,尝试向谷歌询问数据:
var reportingrequests …Run Code Online (Sandbox Code Playgroud) 我已经使用 oauth2 从我的 NodeJS 应用程序连接到 google plus,但是如何撤销令牌/断开连接?我在 NodeJS 的文档中找不到任何内容。
我想获得谷歌驱动器为存储的 pdf 文件创建的缩略图。通过这个函数,我列出了所有文件:
listFiles: function (folderId, onData, onError) {
drive.files.list({
auth: jwtClient,
q: "'" + folderId + "' in parents"
}, function (err, res) {
console.log(res.files)
}
});
Run Code Online (Sandbox Code Playgroud)
每个文件的控制台日志输出如下所示:
{
kind: 'drive#file',
id: '0BapkdhpPsqtgf01YbEJRRlhuaVUf',
name: 'file-name.pdf',
mimeType: 'application/pdf'
}
Run Code Online (Sandbox Code Playgroud)
当我检查谷歌的文档时,它说文件的元数据应该包含所有这些属性: https: //developers.google.com/drive/v3/reference/files
并在那里我发现:contentHints.thumbnail.image如何访问它?
javascript node.js google-drive-api google-api-nodejs-client
我有一个简单的客户端应用程序,使用react-google-login 和以下设置:
<GoogleLogin
clientId={config.CLIENT_ID}
scope={config.SCOPES.join(' ')}
buttonText="Login With Google"
onSuccess={response => onSignIn('google', response)}
onFailure={this.failure.bind(this)}
accessType="offline"
responseType="code"
/>
Run Code Online (Sandbox Code Playgroud)
它成功检索代码并将其发送到用 NodeJS 编写的后端服务器。
服务器端代码如下所示:
const { google } = require('googleapis');
const config = global.config;
const oauth2Client = new google.auth.OAuth2({
clientId: config.google.CLIENT_ID,
clientSecret: config.google.CLIENT_SECRET,
});
// code omitted for the sake of simplicity
var authCode = req.body.authCode; // the provided code by google
const { tokens } = await oauth2Client.getToken(authCode);
return tokens;
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它抛出错误:
{ error: 'invalid_request',
error_description: 'Missing parameter: redirect_uri' } },
code: '400' …Run Code Online (Sandbox Code Playgroud) 我一直在尝试为我的实现模拟 @google-cloud/storage 以便我可以测试它而不必在 gcp 中点击 cloud-storge 到目前为止它都是徒劳的我试图模拟 node_module 范围文件夹使用 jest doc 并没有解决因此我尝试在下面使用
这是我的实现类
import { GcloudAuthenticationInstance } from '../common/services/gcloud.authentication';
import * as fs from 'fs';
import pump from 'pump';
import pino from 'pino';
import * as _ from 'lodash';
import {
ENV_NAME_DEV,
GCLOUD_DATABASE_BUCKET_DEV,
GCLOUD_DATABASE_BUCKET_PROD,
GCLOUD_ENV_STR_BUCKET_NAME,
GCLOUD_STORED_FILE_NAME_DEV,
GCLOUD_STORED_FILE_NAME_PROD,
GCLOUD_UPLOAD_FILE_DEV_LOCAL_PATH,
GCLOUD_UPLOAD_FILE_PROD_LOCAL_PATH,
} from '../common/util/app.constants';
import { PinoLoggerServiceInstance } from '../common/services/pino.logger.service';
import { AppUtilServiceInstance } from '../common/services/app.util.service';
export const uploadEnvFiles = async (env_name: string) => {
const LOGGER: pino.Logger = PinoLoggerServiceInstance.getLogger(__filename);
return new …Run Code Online (Sandbox Code Playgroud) node.js google-cloud-storage typescript google-api-nodejs-client ts-jest
我正在尝试使用 google API 更改我的 google 电子表格的可访问权限,我已经使用 google API 使用我的 google 服务帐户创建了它。
我还可以将其所有权授予其他电子邮件地址并保留自己的编辑权限吗?
生成代码(我使用的是node js):-
const client = new google.auth.JWT(
keys.client_email,
null,
keys.private_key,
['https://www.googleapis.com/auth/spreadsheets']
);
client.authorize((err, tokens) => {
if (err) {
console.log('sheet auth err', err);
return;
}
console.log('success auth');
});
app.post('/generateSheet', async (req, res, next) => {
const { userId, sheetName } = req.body;
console.log(userId, sheetName);
// return res.redirect('/');
const integrationName = 'Google_Sheets';
const data = req.body;
try {
// const integrationInfoSnapshot = await db
// .doc(`integrationParameters/${integrationName}`)
// .get();
try …Run Code Online (Sandbox Code Playgroud) google-api node.js google-drive-api google-api-nodejs-client google-sheets-api
上传成功并返回 id。并尝试将其驱动。它存在。但驱动器中不存在文件?这是什么?我尝试按 id 上传到特定文件夹。文件上传位置在哪里?
const { google } = require('googleapis');
const fs = require('fs');
const credentials = require('./credentials.json');
const scopes = [
'https://www.googleapis.com/auth/drive'
];
const auth = new google.auth.JWT(
credentials.client_email, null,
credentials.private_key, scopes
);
const drive = google.drive({ version: 'v3', auth });
(async () => {
const fileMetadata = {
name: 'naruto.jpg'
};
const media = {
mimeType: 'image/jpeg',
body: fs.createReadStream('naruto.jpg')
};
const res = await drive.files.create({
q: `'1PhND1fjEDnL63BbrLmw2V4M4B6jIfP8Q' in parents`,
resource: fileMetadata,
media: media,
fields: 'id'
});
console.log(res.data);
})();
Run Code Online (Sandbox Code Playgroud) google-api node.js google-drive-api service-accounts google-api-nodejs-client
node.js ×9
google-api ×3
google-oauth ×2
javascript ×2
jwt ×1
oauth-2.0 ×1
ts-jest ×1
typescript ×1