我想在没有用户参与的情况下自动将视频上传到YouTube,所以我创建了一个服务帐户,跳过了箍,一切看起来很棒,然后尝试上传,一个块,并且我的代码遭到了这个Google_Exception异常的爆炸:
"无法启动可恢复上传(HTTP 401:youtube.header,Unauthorized)"
然后我在YouTube API v3上挖掘并找到错误信息:
https://developers.google.com/youtube/v3/docs/errors
"如果您尝试使用OAuth 2.0服务帐户流程,则会出现此错误.YouTube不支持服务帐户,如果您尝试使用服务帐户进行身份验证,则会收到此错误."
它是否正确?我无法使用服务帐户自动将视频上传到YouTube?
(这是浪费了几天努力工作!)
如何使用普通的网络用户界面登录Google服务帐户,例如google drive?
现在我只能使用脚本使用API登录.
oauth google-api google-drive-api google-oauth service-accounts
我在我的本地计算机上写了一个火花作业,它使用google hadoop连接器从谷歌云存储中读取文件,如gs://storage.googleapis.com/,如https://cloud.google.com/dataproc/docs/中所述连接器/云的存储
我已经设置了具有计算引擎和存储权限的服务帐户.我的火花配置和代码是
SparkConf conf = new SparkConf();
conf.setAppName("SparkAPp").setMaster("local");
conf.set("google.cloud.auth.service.account.enable", "true");
conf.set("google.cloud.auth.service.account.email", "xxx-compute@developer.gserviceaccount.com");
conf.set("google.cloud.auth.service.account.keyfile", "/root/Documents/xxx-compute-e71ddbafd13e.p12");
conf.set("fs.gs.project.id", "xxx-990711");
conf.set("fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem");
conf.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem");
SparkContext sparkContext = new SparkContext(conf);
JavaRDD<String> data = sparkContext.textFile("gs://storage.googleapis.com/xxx/xxx.txt", 0).toJavaRDD();
data.foreach(line -> System.out.println(line));
Run Code Online (Sandbox Code Playgroud)
我已经设置了名为GOOGLE_APPLICATION_CREDENTIALS的环境变量,该变量指向密钥文件.我尝试过使用两个密钥文件,即json和P12.但无法访问该文件.我得到的错误是
java.net.UnknownHostException: metadata
java.io.IOException: Error getting access token from metadata server at: http://metadata/computeMetadata/v1/instance/service-accounts/default/token
at com.google.cloud.hadoop.util.CredentialFactory.getCredentialFromMetadataServiceAccount(CredentialFactory.java:208)
at com.google.cloud.hadoop.util.CredentialConfiguration.getCredential(CredentialConfiguration.java:70)
Run Code Online (Sandbox Code Playgroud)
我正在使用java 8,spark 2.2.0依赖项和gcs-connector 1.6.1.hadoop2从eclipse运行我的工作.我只需要使用服务帐户连接,而不是通过OAuth机制连接.
提前致谢
java google-cloud-storage service-accounts apache-spark google-cloud-dataproc
我已阅读这些文件:
https://cloud.google.com/docs/authentication/getting-started?hl=ru#auth-cloud-implicit-java
https://cloud.google.com/storage/docs/reference/libraries?hl=ru
https://developers.google.com/identity/protocols/OAuth2ServiceAccount#callinganapi
我已存储服务帐户的 google-secrets.json 凭据。但是我不明白如何发送带有凭据的请求来获取身份验证令牌或 api 密钥。
只有已发布的库可以执行此操作。
如何在 Postman 中设置 HTTPS 身份验证?
google-api google-authentication google-oauth service-accounts postman
为此,我正在使用 Google Cloud Console。创建服务帐户时,我可以分配特定角色。但是在我创建它之后,我没有看到更新服务帐户角色的选项。
我尝试编辑服务帐户,但仍然没有添加或删除角色的选项。我在这里缺少什么?
service-accounts google-cloud-console google-cloud-platform gcloud
我在GAE中有一个应用程序,我正在使用服务帐户来调用一些谷歌服务.当我在仪表板中创建服务帐户时,会向我提供JSON密钥.json的内容是这样的:
{
"private_key_id": "bar-foo",
"private_key": "-----BEGIN PRIVATE KEY-----foo-bar\n-----END PRIVATE KEY-----\n",
"client_email": "foo-bar@developer.gserviceaccount.com",
"client_id": "bar-foo.apps.googleusercontent.com",
"type": "service_account"
}
Run Code Online (Sandbox Code Playgroud)
如何在我的java代码中使用此private_key来生成GoogleCredential对象?
我能够使用该setServiceAccountPrivateKeyFromP12File方法做到这一点,但为此我需要创建一个p12文件并将其存储在某处.使用json私钥我可以在我的属性文件中配置它.
我发现了一个setServiceAccountPrivate方法,GoogleCredential.Builder它接收一个PrivateKey对象作为参数,但我不知道如何从json内的值生成此对象.我发现的所有示例都使用p12文件.
我一直关注Googles网站上的Oauth2服务帐户文档.我也一直在挑选Googles .net客户端库,试图让它工作.
我已经达到了计算机的签名阶段.
Google的隐私密钥如下所示
-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDcmuyQC8rwWdPQ\nmIdksgzSJbVWTU5MeUxy+HAap3yut9wR/L6KGMJ4FBYcsPmXN5gQAhErybavGoZG\nfS1X1/PCpPVpTCA4749K8gbvuZg1JEIAqMtmHiBBrJj5l8eiekQc8pd7Pq35H4wi\nJYXAJGwggPcttkLBRi0xZzd+jdwL1st+7zRt8nMao/xFibInBBvKwb/gP4mJxlQg\nnRdGO6zgMk+PLTcA5C+gFyPA4SdkylrLib5CJO9123FgcfTJZJTukeHo1v0EfU+4\n3bK8HBZnOFa4DHH4mXhkhgYMjibv4Sr/WCEoomJJwNN04SbUEdyhgpM2rZ3cvx+4\nsmB0SQflAgMBAAECggEAXZ100+/dL7++zh9cHVQdcrRDzprBplw3H/bjg7wdgftN\n7Wgm5214YQKNG6HSWORjqC9oX/+agZYs8w69xjBDJg9ggU2nwuGOGky4utQ0jiCT\nzbnTjsMsBxKaXBiXxBBEhVBBDjDcHQLRMdBggNgz9lskCYb1rxT7qqJVf2PtxCuZ\nuxw3whLMRHXvKosER12sMQgGB/0+Nk86GWCqPigpfu7Ec92V0ffcSUaq3gjIUD54\n67TduTWaRDQNB+j2yQsWQZnqRv+TvIXOjinAI+pPbvCUovtiTSZAoz3EalsiXQ0l\nUqDVx26uzEJqhB2kzvAeApuW2Nd5EPxUnf48c4xh4QKBgQDw01mEChWyENV5CBKU\nMSfY0rpAPtq7ahHRR458ZKtITDBlqiZLMjydI65Rr1XxpQ3pJZALObMdUhbvCDfm\nu4BY/lCCt+hcdt9IICvVZsgXgvb6M+Fj2IbYZcAnOm4T1Z1D3I+pW5NdK2ALQRiK\nWsGINOqWCB9WRd7nhmb/XwWyjQKBgQDqgWht5laDuLMc4qpj9finY4qmk57eT3KG\npzbVlT3h7kv7j/j6e+6o9psrqdf1PXpu9XZi3bPtPbH1fX9x5pZgJQRMP4FGOURY\nQDkJfiOOSN/8Vl0senqkscT7DSbe2BqyqQlSlTB4BBF29p1wxb5Wz5HH2BvYE2zI\ni9B4WJcAuQKBgADnajCasRYoBgUcSKWRwaqIr/ZJxhxp+4Mjl59T6WiuEIhxKQ+j\nMqMMXT0lQVdU3UaAw5enMcrsYfWnvD37ejHbUoYLFq4yLAhjRobYieu8rByoUTJE\nv8zUJPKAv6UHaj20+D0UgOsanJOuPN9YE93lBPRnN2blgD6yPHS88JKJAoGABFyh\n16F4LH0L/9aLes6BcIOeeZi3VMU/iRelInXjL8eh7CzyYZ5agxQLMNW46ZvaIiQ4\nroAXL6t9GubZrwGt/F3T5aMswWShS87uAKoy+RuL5wKoOwKQM24HDvBgr7ZvULFq\nNfoGa8UPmhneNdHHx4+W05PGeM9rr5NCLmrfbCkCgYA0nMvEDIJvU3KA3S1cQ3fs\nVopRJwqRIFFL1cHTWaEyIsxEh6i/zAUc/habK82dN3/ZDn/XvWY14k7VZPsSdDC9\noVlQj2z8DVO2K99Oxyh0VlthtecW8exjzkIPJL4srOSl/dooQZS/7ZZyaRQU/BLI\nMdzKHlUKKXWcUU+Ko8W4+w\u003d\u003d\n-----END PRIVATE KEY-----\n
Run Code Online (Sandbox Code Playgroud)
清理钥匙
首先,我清理了一下钥匙
private const string PrivateKeyPrefix = "-----BEGIN PRIVATE KEY-----";
private const string PrivateKeySuffix = "-----END PRIVATE KEY-----";
/// <summary>Converts the PKCS8 private key to RSA parameters. This method uses the Bouncy Castle library.</summary>
private static RSAParameters ConvertPKCS8ToRSAParameters(string pkcs8PrivateKey)
{
var base64PrivateKey = pkcs8PrivateKey.Replace(PrivateKeyPrefix, "").Replace("\r\n", "").Replace(PrivateKeySuffix, "");
var privateKeyBytes = Convert.FromBase64String(base64PrivateKey);
RsaPrivateCrtKeyParameters crtParameters = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(privateKeyBytes);
return DotNetUtilities.ToRSAParameters(crtParameters);
}
Run Code Online (Sandbox Code Playgroud)
导入参数
RSAParameters rsaParameters = ConvertPKCS8ToRSAParameters(results.private_key);
RSACryptoServiceProvider key …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Cloud Tasks 调用 Cloud Run 服务,如此处文档中所述。
我有一个正在运行的 Cloud Run 服务。如果我公开该服务,它就会按预期运行。
我创建了一个云队列,并使用本地脚本安排云任务。这个是用我自己的账号。脚本看起来像这样
from google.cloud import tasks_v2
client = tasks_v2.CloudTasksClient()
project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'
parent = client.queue_path(project, location, queue)
task = {
'http_request': {
'http_method': 'GET',
'url': url,
'oidc_token': {
'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
}
}
}
response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
Run Code Online (Sandbox Code Playgroud)
我看到该任务出现在队列中,但它失败并立即重试。其原因(通过检查日志)是 Cloud Run 服务返回 401 响应。
我自己的用户具有“服务帐户令牌创建者”和“服务帐户用户”角色。它没有明确的“云任务入队”,但由于我能够在队列中创建任务,我想我已经继承了所需的权限。服务帐户“my-service-account@my-project.iam.gserviceaccount.com”(我在任务中使用它来获取 OIDC 令牌)具有以下角色:
所以我做了一个肮脏的伎俩:我为服务帐户创建了一个密钥文件,将其下载到本地,并通过使用密钥文件将帐户添加到我的 gcloud …
在我的代码中,我尝试从 Cloud Build 中的关联服务帐户收集应用程序默认凭据:
from google.auth import default
credentials, project_id = default()
Run Code Online (Sandbox Code Playgroud)
这在我的本地空间中工作得很好,因为我已经适当地设置了环境变量GOOGLE_APPLICATION_CREDENTIALS。但是,当在 Cloud Build 中执行此行(通过构建配置中的测试步骤)时,会引发以下错误:
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials.
Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application.
For more information, please see https://cloud.google.com/docs/authentication/getting-started
Run Code Online (Sandbox Code Playgroud)
这让我很困惑,因为根据文档:
默认情况下,Cloud Build 使用特殊服务帐户代表您执行构建。此服务帐号称为 Cloud Build 服务帐号,当您在 Google Cloud 项目中启用 Cloud Build API 时,它会自动创建。 在这里阅读
如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 将使用附加到正在运行代码的资源的服务帐户。 在这里阅读
那么为什么默认调用无法访问 Cloud Build 服务帐户凭据呢?
python service-accounts google-cloud-platform dockerfile google-cloud-build
我正在尝试使用 Dialogflow 的 V2 API 获取我的 Dialogflow 代理中的意图列表,但出现以下错误:
PermissionDenied:“projects/xxxx/agent”上的 403 IAM 权限“dialogflow.intents.list”被拒绝。
我采取了以下步骤:
以下是我的代码:
import dialogflow_v2 as dialogflow
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="/home/user/folder/service-account-key.json"
client=dialogflow.IntentsClient()
parent = client.project_agent_path('[PROJECT_ID]')
for element in client.list_intents(parent):
pass
Run Code Online (Sandbox Code Playgroud)
我制作了各种代理和服务帐户,甚至将角色从管理员更改为客户端,但找不到任何解决方案。我尝试了以下解决方案但没有用
尝试的解决方案:DialogFlow PermissionDenied:403 IAM 权限“dialogflow.sessions.detectIntent”
chatbot service-accounts google-cloud-platform dialogflow-es
service-accounts ×10
google-api ×3
google-oauth ×3
java ×2
apache-spark ×1
c# ×1
chatbot ×1
dockerfile ×1
gcloud ×1
json ×1
jwt ×1
oauth ×1
postman ×1
python ×1
youtube-api ×1