当调用google oauth库方法时,它没有出错就失败了--没有任何数量的trycatch-ing捕捉到任何错误信息。
我试图获得一个身份令牌,就像我在执行 gcloud auth print-identity-token
使用 gcloud cli 从命令行获取身份令牌。
需要身份令牌的原因是,另一个云功能服务需要它作为 Authorization : Bearer [token]
当我在我的代码中插入一个手动生成的身份标记时,它确实可以正常工作。这不是一个适合开发或生产的解决方案。
我从众多来源中拼凑出来的代码片段是这样的,用于获取身份令牌。
using (var stream = new FileStream(credentialsFilePath, FileMode.Open, FileAccess.Read))
{
var credentials = GoogleCredential.FromStream(stream);
if (credentials.IsCreateScopedRequired)
{
credentials = credentials.CreateScoped(scopes);
}
OidcToken oidcToken = await credentials.GetOidcTokenAsync(
Options
.FromTargetAudience(scopes[0])
.WithTokenFormat(OidcTokenFormat.Standard));
// this line bombs immediately, jumping out of this method and the calling method.
string token = await oidcToken.GetAccessTokenAsync();
return token;
}
在上面的代码中,scopes[0]是之前一次尝试留下的代码 它包含了云功能服务的端点。https:/subdomain.cloudfunctions.netcloud-functionv1。 是我作为 web api 的一部分调用的云函数端点的一般形式。
这是否是一种有效和合理的方式来获取相当于 gcloud auth print-identity-token
? 如果是,为什么会出现史诗级的失败?
我需要使用google服务账号进行服务对服务的认证。开发环境是visual studio 2019,.net core 3.1,dockerlinux。
PS--服务账号有云函数的云函数Invoker角色。
PPS - 这个问题似乎与docker和我在docker中启动项目时得到的一组错误信息有关。我一直忽略了它们,因为直到现在它们还没有损害功能。
在System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)在System.Net.Http.CurlHandler.MultiAgent.FinishRequest(StrongToWeakReference`1 easyWrapper, CURLcode messageResult)
运行在windows上的代码工作。
倒数第二个问题是,我需要将一个上游方法异步化,并添加一个 await。现在上面的代码每次都能正常工作。这个改变让我找到了最终的问题,其解决方案是在ConfigureServices()中对与AddHttpClient()设置相关的代码进行重构。
curl异常是由于试图在配置不好的情况下添加logger.loggerFactory.AddGoogle(...).这真是一个糟糕的发日。
这个问题也是一个不能做的例子--即我用了太多的极简主义来描述这个问题。