2016-07-27 11 views
8

私はVS2015、C#を使用しています。公開後にGoogleのログインが機能しない

Googleログインに問題があります。私のデバッグ設定(localhost)から、すべて正常に動作します。サーバーに公開した後、googleのログインウィンドウは単に開かれません。例外もスローされません。

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

私は元のURIにしても、開発者のためのGoogleのコンソール上の認可リダイレクトURIにサーバのアドレスを追加しましたもちろん: はここに私のコードです。 (ちょうど私がローカルホストのためにしたのと同じように)。私はちょうど何が間違っているのか、なぜログインウィンドウが開かれないのか分かりません。

EDIT:

追加クラスdsAuthorizationBroker(私の最初のポストから欠落していた - その1で申し訳ありません):あなたの場合

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

実行された最後の行を見つけるためのいくつかのデバッグステートメントを入れてください。根本原因をゼロにするのに役立ちます。私はAppSettings –

+0

から適切な値を得ていないと推測しています。イベントビューアのエラーを表示しようとするよりも仮想マシンに公開した場合 – Lakhtey

+0

@JohnPeters - ログを追加しました。私はsuccessfuly UserCredentialの資格情報の前に1行をログに記録します....(ログから)リダイレクトuriは、私はグーグルコンソールに返信URIを持っているuriです。 – FrenkyB

答えて

3
public static async Task<UserCredential> AuthorizeAsync 

この方法は、すでにのでGoogleWebAuthorizationBrokerで宣言されていますこの関数の実装を基本実装よりも優先させたい場合は、新しいキーワードを使用する必要があります。

public new static async Task<UserCredential> AuthorizeAsync 

私はあなたがログインすると仮定理由ですが、この時点で

UserCredential credential = await dsAuthorizationBroker.AuthorizeAsync 

前にラインを停止させ、それが基本実装を呼び出しています。これとは別に

、私は一般的にグーグルと対話するためのDotNetOpenAuthを使用する傾向があるとherehereのように、フォローする簡単な例がたくさんあります..しかし、あなたが本当にだけにしてGoogleのAPIを使用して独自のロールする場合は、このです最も良いplace to start

+0

お返事ありがとうございます。あなたの答えとDotNetOpenAuthの両方を試してみます。私があなたに聞いてもいいかもしれません - おそらくあなたはTwitter/FacebookでDotNetOpenAuthを使った実例を知っていますか? – FrenkyB

+0

数日後にいくつかのコードを追加できますが、あなたのユースケースが何であるか尋ねることはできますか?あなただけが許可する必要がありますか、電子メールなども必要ですか?もしそうなら、Twitterで飛び抜けるフープがもう少しある。ここでは、DotNetOpenAuthの[サンプルコード/例](https://github.com/DotNetOpenAuth/DotNetOpenAuth.Samples)をご利用いただきありがとうございます。これにはTwitterの例があります。 – timkly

+0

私が必要とするのは、ログイン - ユーザーのメールを取得することです。これ以上のソーシャルログインのテストケースがあれば、大歓迎です。 – FrenkyB

関連する問題