Exception using Google.GData.Apps : The remote server returned an error: (503) Server Unavailable

513 views Asked by At

I am using google provisioning api on my website. I want to authenticate user using AppsService class.

AppsService service = new AppsService("domain", "admin username", "admin password");
UserEntry user = service.RetrieveUser("username");

But it throws exception: Execution of request failed: https://apps-apis.google.com/a/feeds/pmu.mygbiz.com/user/2.0/username

InnerException is: The remote server returned an error: (503) Server Unavailable.

It was working before 6 months ago.

1

There are 1 answers

2
Linda Lawton - DaImTo On

ClientLogin (login and password) was deprecated as of April 20, 2012 and turned off on May 26 2015. This code will not longer work you need to switch to using Oauth2.

I think you need to switch to the admin directory api as well

PM> Install-Package Google.Apis.Admin.Directory.directory_v1

Update code:

I can give you some sample code but I cant test it 100% I don't have an apps domain.

helper class:

class AuthenticationHelper
    {

        /// <summary>
        /// Authenticate to Google Using Oauth2
        /// Documentation https://developers.google.com/accounts/docs/OAuth2
        /// </summary>
        /// <param name="clientId">From Google Developer console https://console.developers.google.com</param>
        /// <param name="clientSecret">From Google Developer console https://console.developers.google.com</param>
        /// <param name="userName">A string used to identify a user.</param>
        /// <returns></returns>
        public static DirectoryService AuthenticateOauth(string clientId, string clientSecret, string userName)
        {

            // There are a lot of scopes check here: https://developers.google.com/admin-sdk/directory/v1/guides/authorizing
            string[] scopes = new string[] {
                    DirectoryService.Scope.AdminDirectoryGroup  ,  // Manage your Groups
                    DirectoryService.Scope.AdminDirectoryUser   // Manage users 
                    };

            try
            {
                // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
                UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }
                                                                    , scopes
                                                                    , userName
                                                                    , CancellationToken.None
                                                                    , new FileDataStore("Daimto.AdminSDK.Auth.Store")).Result;



                DirectoryService service = new DirectoryService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Directory API Sample",
                });
                return service;
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.InnerException);
                return null;

            }

        }

        /// <summary>
        /// Authenticating to Google using a Service account
        /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
        /// </summary>
        /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
        /// <param name="keyFilePath">Location of the Service account key file downloaded from Google Developer console https://console.developers.google.com</param>
        /// <returns></returns>
        public static DirectoryService AuthenticateServiceAccount(string serviceAccountEmail, string keyFilePath)
        {

            // check the file exists
            if (!File.Exists(keyFilePath))
            {
                Console.WriteLine("An Error occurred - Key file does not exist");
                return null;
            }

            // There are a lot of scopes check here: https://developers.google.com/admin-sdk/directory/v1/guides/authorizing
            string[] scopes = new string[] {
                    DirectoryService.Scope.AdminDirectoryGroup  ,  // Manage your Groups
                    DirectoryService.Scope.AdminDirectoryUser   // Manage users 
                    };

            var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
            try
            {
                ServiceAccountCredential credential = new ServiceAccountCredential(
                    new ServiceAccountCredential.Initializer(serviceAccountEmail)
                    {
                        Scopes = scopes
                    }.FromCertificate(certificate));

                // Create the service.
                DirectoryService service = new DirectoryService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Directory API Sample",
                });
                return service;
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.InnerException);
                return null;

            }
        }
    }

authenticate :

 var service = AuthenticationHelper.AuthenticateOauth("xxxxx-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com", "NDmluNfTgUk6wgmy7cFo64RV", "userID");

Make a request:

    try
    {
        var userList = service.Users.List();
        userList.MaxResults = 10;
        userList.Execute();
    }
    catch (Exception ex)
    {

        Console.WriteLine(ex.Message);


    }

    Console.ReadLine();

code ripped from sample project Google-Dotnet-Samples / admin Directory