我使用以下代码使用Google .Net客户端库向Google进行身份验证。
public static void auth()
{
string clientId = "xxxxxx.apps.googleusercontent.com";
string clientSecret = "xxxxx";
string[] scopes = new string[] { "https://www.googleapis.com/auth/contacts.readonly" }; // view your basic profile info.
try
{
// Use the current Google .net client library to get the Oauth2 stuff.
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }
, scopes
, "test"
, CancellationToken.None
, new FileDataStore("test")).Result;
// Translate the Oauth permissions to something the old client libray can read
OAuth2Parameters parameters = new OAuth2Parameters();
parameters.AccessToken = credential.Token.AccessToken;
parameters.RefreshToken = credential.Token.RefreshToken;
RunContactsSample(parameters);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
我正在使用自己的客户端ID和客户端密钥。 当我从visual studio运行时,此代码完全正常工作,但在IIS中托管后无效。
我在谷歌api控制台中提到了重定向的URI http://localhost/authorize/
我的IIS主机网址是 http://localhost/googleintegration.aspx
我在过去的一个月内遇到了这个问题,有人可以为此提供解决方案..
答案 0 :(得分:2)
(重新发布自https://github.com/google/google-api-dotnet-client/issues/888)
GoogleWebAuthorizationBroker
用于在最终用户计算机上本地运行的应用程序。它会打开一个Web浏览器本地,允许用户进行身份验证。
听起来你正试图在IIS中的服务器机器上使用GoogleWebAuthorizationBroker
;因为它会尝试在服务器机器上打开一个Web浏览器,它将无法正常工作 - 这将失败,并且最终用户无法看到它,因为它和&# #39;将在服务器上,而不是他们的机器上。
我自己没有这样做,但看起来instructions here(对于ASP.NET MVC网络应用程序)可能会有所帮助。
答案 1 :(得分:0)
有几种不同类型的应用程序。您可以具有Web应用程序,本机安装的应用程序或移动应用程序。用于验证这些身份的方法略有不同。
GoogleWebAuthorizationBroker.AuthorizeAsync方法用于本机安装的应用程序。它将在运行代码的计算机上打开浏览器窗口。在您在Visual Studio中运行它的情况下,它可以正常工作,但是一旦尝试托管它,它将尝试在Web服务器上打开无法运行的浏览器窗口。
您需要使用专为与Web应用程序一起使用的GoogleAuthorizationCodeFlow。您可以找到示例here。
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "PUT_CLIENT_ID_HERE",
ClientSecret = "PUT_CLIENT_SECRET_HERE"
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});