2016-07-27 40 views
8

Używam VS2015, C#.Logowanie Google nie działa po opublikowaniu

Mam problem z logowaniem się do Google. Z mojej konfiguracji debugowania (localhost) wszystko działa dobrze. Po opublikowaniu na serwerze okno logowania do google po prostu się nie otwiera. I nie jest wyrzucany wyjątek. Oto mój kod:

[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 
      } 

Oczywiście dodałem adres serwera do URI pochodzenia, a także do autoryzowanego URI przekierowania na konsoli Google dla deweloperów. (tak jak zrobiłem dla lokalnego hosta). Po prostu nie rozumiem, co jest nie tak, dlaczego okna logowania się nie otwierają?

EDIT:

Dodawanie klasa dsAuthorizationBroker (brakowało od mojego pierwszego postu - Niestety na jednym):

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);    
     } 
    } 
} 
+1

Umieść kilka komunikatów debugowania, aby dowiedzieć się, co zostało wykonane. Pomoże to wyzerować główną przyczynę. Zgaduję, że nie uzyskał poprawnej wartości z AppSettings –

+0

Jeśli opublikowałeś go na maszynie wirtualnej, niż spróbuj zobaczyć błędy z Podglądu zdarzeń – Lakhtey

+0

@JohnPeters - Dodałem rejestrowanie. Pomyślnie zalogowałem jedną linię przed UserCredential credential = .... przekierowanie uri (z logu) jest URI, które mam w zamian URI w konsoli Google. – FrenkyB

Odpowiedz

3
public static async Task<UserCredential> AuthorizeAsync 

Metoda ta jest już zadeklarowana w GoogleWebAuthorizationBroker i dlatego jeśli Zamierzeniem, aby Twoja implementacja tej funkcji miała pierwszeństwo przed podstawową implementacją, musisz użyć nowego słowa kluczowego.

public new static async Task<UserCredential> AuthorizeAsync 

Dlatego zakładam, że zalogowaniu zatrzymuje linię przed

UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync 

W tym momencie, to dzwoni realizację podstawowej.

Poza tym, ja generalnie mają tendencję do używania DotNetOpenAuth do interakcji z Google i istnieje wiele prostych przykładów do naśladowania, jak here i here .. ale jeśli naprawdę chcesz się toczyć własną rękę za pomocą Google Apis tylko to jest najlepiej place to start

+0

dzięki za odpowiedź. Wypróbuję zarówno twoją odpowiedź, jak i DotNetOpenAuth. Jeśli mogę cię o to zapytać - być może wiesz o dobrym przykładzie z DotNetOpenAuth na Twitterze/Facebooku? – FrenkyB

+0

Mogę dodać kod w ciągu kilku następnych dni, ale czy mogę zapytać, jaki jest twój przypadek użycia? Czy potrzebujesz tylko autoryzować lub chcesz otrzymywać e-maile itp.? Jeśli tak, jest jeszcze kilka kół, z którymi można przeskoczyć na Twitterze. Mówiąc to, oto [przykładowy kod/przykłady] (https://github.com/DotNetOpenAuth/DotNetOpenAuth.Samples) dla DotNetOpenAuth, aby zacząć, który ma przykład Twittera. – timkly

+0

Wszystko, czego potrzebuję, to zalogować się - uzyskaj pocztę od użytkowników. Jeśli masz jeszcze jakieś przypadki testowe do społecznych loginów, serdecznie zapraszamy. – FrenkyB