我正在尝试以编程方式访问我的Google Play开发者帐户的Google云存储桶,以获取应用程序的统计信息。即使我已将我的服务帐户添加到play console并授予其管理员权限,我仍收到一个身份验证错误。
'use strict'
const { google } = require('googleapis')
const {Storage} = require('@google-cloud/storage');
const key = require('../Gcloud-service-account.json')
const scopes = 'https://www.googleapis.com/auth/devstorage.read_only'
const jwt = new google.auth.JWT(key.client_email, null, key.private_key, scopes)
process.env.GOOGLE_APPLICATION_CREDENTIALS = '../Gcloud-service-account.json';
jwt.authorize((err, response) => {
const authCloudExplicit = async () => {
// [START auth_cloud_explicit]
// Imports the Google Cloud client library.
const projectId = 'gplay-stats-nodejs'
const keyFilename = '../Gcloud-service-account.json'
const storage = new Storage({projectId, keyFilename});
console.log('outside try')
// Makes an authenticated API request.
try {
const [buckets] = await storage.getBuckets();
console.log('inside try')
buckets.forEach(bucket => {
console.log(bucket.name);
});
} catch (err) {
console.error('ERROR:', err);
}
// [END auth_cloud_explicit]
};
authCloudExplicit();
//Reading data
async function downloadFile() {
// [START storage_download_file]
// Imports the Google Cloud client library
// Creates a client
const storage = new Storage();
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
const bucketName = 'pubsite__rev_05768497717432290806/stats/installs';
const srcFilename = 'installs_package-id-of-my-app_201901_app_version.csv';
const destFilename = '../download';
const options = {
destination: destFilename,
};
// Downloads the file
await storage
.bucket(bucketName)
.file(srcFilename)
.download(options);
console.log(
`gs://${bucketName}/${srcFilename} downloaded to ${destFilename}.`
);
}
downloadFile();
(err, result) => {
console.log(err, result)
}
})
//Here is my service account json
{
"type": "service_account",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/service-account-email"
}
删除了一些机密字段。
我得到这个错误:
code: 403,
errors: [
{
domain: 'global',
reason: 'forbidden',
message: 'service-account-email' +
'does not have storage.buckets.list access to project ' +
'2763836207.'
}
],
response: PassThrough {
_readableState: ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: null,
pipesCount: 0,
flowing: true,
ended: true,
endEmitted: true,
reading: false,
sync: false,
needReadable: false,
emittedReadable: false,
readableListening: false,
resumeScheduled: false,
paused: false,
emitClose: true,
autoDestroy: false,
destroyed: false,
defaultEncoding: 'utf8',
awaitDrain: 0,
readingMore: false,
decoder: null,
encoding: null
},
readable: false,
_events: [Object: null prototype] {
prefinish: [Function: prefinish],
error: [Array],
data: [Function],
end: [Function]
},
_eventsCount: 4,
_maxListeners: undefined,
_writableState: WritableState {
objectMode: false,
highWaterMark: 16384,
finalCalled: false,
needDrain: false,
ending: true,
ended: true,
finished: true,
destroyed: false,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
corked: 0,
sync: false,
bufferProcessing: false,
onwrite: [Function: bound onwrite],
writecb: null,
writelen: 0,
bufferedRequest: null,
lastBufferedRequest: null,
pendingcb: 0,
prefinished: true,
errorEmitted: false,
emitClose: true,
autoDestroy: false,
bufferedRequestCount: 0,
corkedRequestsFree: [Object]
},
writable: false,
allowHalfOpen: true,
_transformState: {
afterTransform: [Function: bound afterTransform],
needTransform: false,
transforming: false,
writecb: null,
writechunk: null,
writeencoding: 'buffer'
},
statusCode: 403,
statusMessage: 'Forbidden',
request: {
headers: [Object],
href: 'https://www.googleapis.com/storage/v1/b?project=gplay-stats-nodejs'
},
body: '{\n "error": {\n "errors": [\n {\n "domain": "global",\n ' +
'"reason": "forbidden",\n "message": ' +
'"service-account-email does ' +
'not have storage.buckets.list access to project 2763836207."\n }\n ' +
'],\n "code": 403,\n "message": ' +
'"service-account-email does ' +
'not have storage.buckets.list access to project 2763836207."\n }\n}\n',
headers: {
'alt-svc': 'quic=":443"; ma=2592000; v="46,43,39"',
'cache-control': 'private, max-age=0',
connection: 'close',
'content-length': '400',
'content-type': 'application/json; charset=UTF-8',
date: 'Sun, 04 Aug 2019 21:46:39 GMT',
expires: 'Sun, 04 Aug 2019 21:46:39 GMT',
server: 'UploadServer',
vary: 'Origin, X-Origin',
'x-guploader-uploadid': 'AEnB2UqCDuQdbWsAmyTty5rImnOYxLB71xh5hf7-4boSY9c5d7cCZly5mQJsbJY57emgn9jyGDVKtlDM4jeUG07IJKl7I3RpxQ'
},
toJSON: [Function: toJSON]
},
message: 'service-account-email ' +
'does not have storage.buckets.list access to project ' +
'2763836207.'
}
你们服务号的角色是什么?它必须只有存储对象查看器,不是吗?此角色允许服务号查看桶中的对象。但是这里你也需要用这行列出桶
const[bucket]=wait storage.getbucket()
顺便说一下,您的服务帐户还需要角色storageAdmin或projectViewer中包含的
storage.bucket.list
权限。就个人而言,我更喜欢并推荐projectViewer,因为这个角色不能创建/删除bucket,即使它可以查看项目的所有资源。
最好的解决方案是仅在具有正确权限的情况下创建自定义角色。使用您的代码并不总是一个好的解决方案,因为库有时会执行您不处理和/或不想要的调用。Python就是这样,node也可能是这样。
我想授予服务帐户访问Google Secrets Manager中的秘密的权限。 我可以像这样获得这个秘密: 但是当我的服务号尝试相同的命令时,gCloud会发出以下错误: 错误:(gcloud.beta.secrets.versions.access)权限被拒绝:请求的身份验证范围不足。 主要问题是:我还需要做些什么来确保服务帐户可以访问该机密? 我已授予该服务帐户“roles/secretma
我希望在我的服务器/笔记本电脑上运行一个简单的过程,每天一次将文件上传到我的Google驱动器。我不希望分享这个,允许其他用户使用它等。 我发现的所有示例似乎都涉及浏览到一个地址以获得用户(我)的许可,然后获取身份验证代码等并继续 参考: Java 快速入门 有没有一种方法/示例可以在不需要浏览器的情况下执行此操作,每次获得权限以获取唯一的身份验证代码,因为我只想为我的帐户执行此操作? 我可以将
我正在尝试开发一个应用程序,需要使用开发者电子邮件访问谷歌开发者API。我查阅了官方文件。我不太明白。我按照以下说明创建了客户端id。https://developers.google.com/android-publisher/authorization但是为了生成他们提到的用来调用这个API的令牌”https://accounts.google.com/o/oauth2/auth?scope=
我在谷歌云平台上创建了一个项目,并为我的gmail帐户创建了一个OAuth服务帐户id。使用此服务帐户id,我无法阅读电子邮件,因为它说我无法访问此范围Gmail只读。 我通过谷歌搜索发现,我需要从Gsuite admin获得范围访问权限,但如果提供了访问权限,它表示可以使用该权限检索所有组织用户的电子邮件。这个信息正确吗?如果是的话,有没有其他方法可以访问我账户的电子邮件? 下面是我用来访问电子
如何获取访问我的页面的访问者的windows用户名。我的页面是用Java编码的,在Intranet中运行。我知道用(我想是用activex)很容易做到这一点,但如何用Java做到这一点。 在一些话题中我发现了这样的东西。 如何在Java中获取Windows用户名? 但这些对我来说不是一个解决办法,因为; 给出程序运行的服务器的用户名,但我需要访问者的用户名。 有办法做到这一点吗?
我们正在尝试创建一个与谷歌管理SDK的集成,以便能够检索,更新和创建帐户在我们的领域。但是,我们不断收到一个403错误,表明我们没有被授权访问Resource/API。 我们正在使用从一个服务帐户获得的凭据,该帐户启用了域范围的授权,并且具有以下两个作用域:https://www.googleapis.com/auth/admin.directory.user.readonly,https://w