Google api 未授权测试服务器上的站点,但在本地主机上工作
Google api not authorizing for site on test server, but working on localhost
我的网站使用 google 驱动器 API 时遇到问题,它只会影响我们拥有它的测试服务器,但不会影响我正在测试它的本地主机。正如您可以想象的那样,这使得故障排除变得困难。在程序运行时写入文本文件后,我设法找到了导致问题的确切语句:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
null).Result;
这让我相信错误与 permissions/authorization 有关。我的本地主机和测试站点权限在 google api 控制台上完全相同,这是我从中获取客户端机密的地方。
https://i.imgur.com/fJDAWWz.png
44354 以上是我的本地主机,涂黑的 http(不是 https)url 是我们的测试服务器。
如您所见,origins 和 redirect uris 完全相同,所以我不明白为什么它适用于一个而不适用于另一个。
这是语句流来自:
var stream = new FileStream(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/client_secret.json"), FileMode.Open, FileAccess.Read)
编辑:我刚刚意识到测试服务器实际上是http地址,而不是https地址。这可能是为什么? google API 调用不能通过 http 工作吗?
我最终通过反复试验弄明白了。
我不得不添加这段代码:
GoogleClientSecrets cs = GoogleClientSecrets.Load(stream);
flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = cs.Secrets.ClientId,
ClientSecret = cs.Secrets.ClientSecret
},
Scopes = Scopes,
});
然后得到令牌。为了获得令牌,我按照 OAuth Playground 下的说明进行操作:https://developers.google.com/adwords/api/docs/guides/authentication
然后用那里的信息做了这个:
TokenResponse token = new TokenResponse
{
RefreshToken = "refreshtokenhere",
TokenType = "Bearer",
ExpiresInSeconds = 3600
};
(我认为 tokentype 或 expires 不重要,但我还是包含了它们)
最后:
credential = new UserCredential(flow, "me", token);
然后和之前一样使用这个凭据
我的网站使用 google 驱动器 API 时遇到问题,它只会影响我们拥有它的测试服务器,但不会影响我正在测试它的本地主机。正如您可以想象的那样,这使得故障排除变得困难。在程序运行时写入文本文件后,我设法找到了导致问题的确切语句:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
null).Result;
这让我相信错误与 permissions/authorization 有关。我的本地主机和测试站点权限在 google api 控制台上完全相同,这是我从中获取客户端机密的地方。
https://i.imgur.com/fJDAWWz.png
44354 以上是我的本地主机,涂黑的 http(不是 https)url 是我们的测试服务器。 如您所见,origins 和 redirect uris 完全相同,所以我不明白为什么它适用于一个而不适用于另一个。
这是语句流来自:
var stream = new FileStream(System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/client_secret.json"), FileMode.Open, FileAccess.Read)
编辑:我刚刚意识到测试服务器实际上是http地址,而不是https地址。这可能是为什么? google API 调用不能通过 http 工作吗?
我最终通过反复试验弄明白了。
我不得不添加这段代码:
GoogleClientSecrets cs = GoogleClientSecrets.Load(stream);
flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = cs.Secrets.ClientId,
ClientSecret = cs.Secrets.ClientSecret
},
Scopes = Scopes,
});
然后得到令牌。为了获得令牌,我按照 OAuth Playground 下的说明进行操作:https://developers.google.com/adwords/api/docs/guides/authentication
然后用那里的信息做了这个:
TokenResponse token = new TokenResponse
{
RefreshToken = "refreshtokenhere",
TokenType = "Bearer",
ExpiresInSeconds = 3600
};
(我认为 tokentype 或 expires 不重要,但我还是包含了它们)
最后:
credential = new UserCredential(flow, "me", token);
然后和之前一样使用这个凭据