Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google login not working after publish

I use VS2015, C#.

I have a problem with Google login. From my debug configuration (localhost) everything works fine. After publishing to the server, google login window simply doesn't get opened. And no exception is thrown. Here is my code:

[AllowAnonymous]
public async Task LoginWithGoogle()
{
    HttpRequest request = System.Web.HttpContext.Current.Request;
    string redirectUri = ConfigurationReaderHelper.GetGoogleRedirectUri();

    try
    {            
        ClientSecrets secrets = new ClientSecrets
        {
            ClientId = "***",
            ClientSecret = "***"
        };

        IEnumerable<string> scopes = new[] { PlusService.Scope.UserinfoEmail, PlusService.Scope.UserinfoProfile };

        GoogleStorageCredentials storage = new GoogleStorageCredentials();

        dsAuthorizationBroker.RedirectUri = redirectUri;
        UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync(secrets,
            scopes, "", CancellationToken.None, storage);
    }
    catch(Exception ex)
    {
        throw ex;
    }            
}


//just getting value from applicationSettings - web.config
            public static string GetGoogleRedirectUri()
            {
    #if DEBUG
                return GetValueFromApplicationSettings("RedirectUriDEBUG");
    #elif PRODUKCIJA
                return GetValueFromApplicationSettings("RedirectUriSERVER");            
    #endif
            }

Of course I added server's address to the origin uri and also to the authorised redirect uri on the google console for developers. (just like I did for the localhost). I just don't get it what is wrong, why login windows doesn't get opened?

EDIT:

Adding class dsAuthorizationBroker (was missing from my first post - sorry on that one):

namespace Notes
{
    public class dsAuthorizationBroker : GoogleWebAuthorizationBroker
    {
        public static string RedirectUri;

        public static async Task<UserCredential> AuthorizeAsync(
            ClientSecrets clientSecrets,
            IEnumerable<string> scopes,
            string user,
            CancellationToken taskCancellationToken,
            IDataStore dataStore = null)
        {
            var initializer = new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = clientSecrets,
            };
            return await AuthorizeAsyncCore(initializer, scopes, user,
                taskCancellationToken, dataStore).ConfigureAwait(false);
        }

        private static async Task<UserCredential> AuthorizeAsyncCore(
            GoogleAuthorizationCodeFlow.Initializer initializer,
            IEnumerable<string> scopes,
            string user,
            CancellationToken taskCancellationToken,
            IDataStore dataStore)
        {
            initializer.Scopes = scopes;
            initializer.DataStore = dataStore ?? new FileDataStore(Folder);
            var flow = new dsAuthorizationCodeFlow(initializer);
            return await new AuthorizationCodeInstalledApp(flow,
                new LocalServerCodeReceiver())
                .AuthorizeAsync(user, taskCancellationToken).ConfigureAwait(false);
        }
    }


    public class dsAuthorizationCodeFlow : GoogleAuthorizationCodeFlow
    {        
        public dsAuthorizationCodeFlow(Initializer initializer)
            : base(initializer) { }

        public override AuthorizationCodeRequestUrl
                       CreateAuthorizationCodeRequest(string redirectUri)
        {            
            return base.CreateAuthorizationCodeRequest(dsAuthorizationBroker.RedirectUri);            
        }
    }
}
like image 468
FrenkyB Avatar asked Jul 27 '16 17:07

FrenkyB


1 Answers

public static async Task<UserCredential> AuthorizeAsync

This method is already declared in GoogleWebAuthorizationBroker and therefore if you intend for your implementation of this function to take precedence over the base implementation, then you need to use the new keyword.

public new static async Task<UserCredential> AuthorizeAsync

This is why I assume you logging stops the line before

UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync

At this point, it is calling the base implementation.

Aside from this, I generally tend to use DotNetOpenAuth for interacting with Google and there are plenty of simple examples to follow, like here and here.. but if you really want to roll your own using Google Apis only then this is best place to start

like image 147
timkly Avatar answered Nov 02 '22 09:11

timkly



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!