Search code examples
asp.net-mvc-4google-oauthappharborgoogle-drive-api

Hosting MVC 4 site with Google Drive Client API on AppHarbor hang on oAuth authentication


I am playing with Google Drive Client API with MVC 4 web project. The code works great locally with IIS express. However, when I deploy the site to AppHarbor, the oAuth authentication hang. I tried both web client credentials and installed app client credentials. What do I need to do to get it working?

Here is the code snippet for Authentication:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

        UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            new ClientSecrets
            {
                ClientId = { Client_ID set in Google developer console},
                ClientSecret = { Client secret in Google developer console},
            },
            new[] { DriveService.Scope.Drive },
            "user",
            CancellationToken.None).Result;

         //Create the service.
        var service = new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Google Drive Reader",
        });

         //More code goes here

        return View();
    }
}

Update:

I figured this out and put an answer to this question in case others may what to know.


Solution

  • I figured this out.

    First of all, the method I used in the question works only for standalone applications, does not work for MVC applications. MVC application should follow the method documented here:

    https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web_applications

    One important thing to notice is that web application client ID should be used, and the Redirect URL needs to be the URL to your AuthCallbackController.

    Second, there is a problem in the Sample code: in HomeController

     public async Task IndexAsync(CancellationToken cancellationToken)
    

    Should be:

     public async Task<ActionResult> IndexAsync(CancellationToken cancellationToken)
    

    Third: make sure adding the following appSetting to web.config so that AppHarbor sends correct redirect url.

    <appSettings>
         <add key="aspnet:UseHostHeaderForRequestUrl" value="true" />
    </appSettings>
    

    After that, it worked for me both locally with IIS Express and on AppHarbor.