GoogleWebAuthorizationBroker无法从IIS主机运行

时间:2017-03-16 13:47:07

标签: c# asp.net iis google-oauth google-contacts

我使用以下代码使用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

我在过去的一个月内遇到了这个问题,有人可以为此提供解决方案..

2 个答案:

答案 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")
            });