2017-06-17 21 views
0

C#WebアプリケーションでGoogle SSOを実装しようとしています。それはのように思えました。 Based on this tutorial、GoogleはId_Token JWTを取得するためにWebブラウザでその魔法を実行します。トークンが検証のために私のWebサービスに渡され、それをアプリケーション内のユーザーに一致させるために使用されます。サーバーコールでGoogle API GoogleJsonWebSignature.ValidateAsync(...)を使用する

サーバサイドのGoogle APIを使った私のアプローチが正しいかどうかはまだ分かりませんが、私の大きなハングアップは、私が戻ってくるものを見るためにGoogle APIの非同期呼び出しをどのように扱うかを調べようとしています。

私のコードはGoogle.Apis.Authの名前空間を使用して非常に単純です:

public async Task<GoogleJsonWebSignature.Payload> wfValidateAsync(string pId_Token) 
{ 
    GoogleJsonWebSignature.Payload Sig = await GoogleJsonWebSignature.ValidateAsync(pId_Token, null, false); 

    return Sig; 
} 

この非同期/のawaitパラダイムに新しいブランドが、私はAngularJS/NodeJSの約束/コールバックでいくつかの経験を持っています。私の挑戦は、非同期メソッドは、呼び出しスタックをバックアップするたびに他の非同期メソッドによってのみ呼び出すことができるということです。私は非同期応答が終了する前にサービスコールを終了し、サービスが結果に作用できることを意味すると思います。

また、ユニットテストを作成するには、[TestMethod]メソッドにasyncを設定すると、テストエクスプローラから完全に消えます。私はこの難問をテスト/デバッグする方法がわかりません。

私はこれでまっすぐ私の頭をねじ戻すのを助けることができる誰かに事前に感謝します。

答えて

2

この非同期/待機のパラダイムにはまったく新しいものですが、私はAngularJS/NodeJSの約束/コールバックの経験があります。

ただし、Typescriptは使用しないでください。

私の挑戦は、非同期メソッドは他の非同期メソッドによって呼び出しスタックをバックアップすることしかできないようです。

あなたがしなければ、悪いことが起こる可能性があります。

非同期応答が終了してサービスが結果に作用する前にサービスコールを終了することを意味します。

いいえ!コンパイラは、async修飾子を持つメソッドのステートマシンを生成し、awaitキーワードは、「何かを実行して、完了したらここに戻ってきます」を意味します。

また、ユニットテストを作成するには、asyncを[TestMethod]メソッドに入れると、テストエクスプローラから完全に消えます。私はこの難問をテスト/デバッグする方法がわかりません。

あなたのテスト方法はおそらくasync voidです。テストエンジンは、テストがいつ完了するかを知るために、async Taskにする必要があります。

Stephen Clearyblogをご覧ください。彼はasync-awaitに多くのコンテンツを持っています。

0

Paulo、ありがとうございます!

私は、テストメソッドについての最後の部分について、あなたの助言を得てこれを得ることができました。 、これはまた、ユニットテストは、テスト・エクスプローラから消えてしまいます私をハングアップされた追加の落とし穴として - NOW

//THIS TEST METHOD SHOWS IN THE TEST EXPLORER 

[TestMethod] 
public async Task AuthenticateGoogle() 
{ 
    string lToken = "[JWT TOKEN HERE]"; 
    wfUser lUser = new wfUser(_wfContext); 
    var lAuthenticateResult = await lUser.wfAuthenticateGoogle(lToken); 

    Assert.IsTrue(lAuthenticateResult, "JWT Token Validated"); 
} 

:これに

//THIS TEST METHOD DOESN'T SHOW IN THE TEST EXPLORER 

[TestMethod] 
public async void AuthenticateGoogle() 
{ 
    string lToken = "[JWT TOKEN HERE]"; 
    wfUser lUser = new wfUser(_wfContext); 
    var lAuthenticateResult = await lUser.wfAuthenticateGoogle(lToken); 

    Assert.IsTrue(lAuthenticateResult, "JWT Token Validated"); 
} 

:私はこれを変更しなければなりませんでした私は怠惰なコピー/非テストメソッドの定義を貼り付け、無駄にビルドの出力が私に値を返す必要があると私に言ったときに戻り値を追加することで見つけました。あなたが共有優れたブログに加えて

//THIS TEST METHOD DOESN'T SHOW IN THE TEST EXPLORER DUE TO RETURN VALUE 

[TestMethod] 
public async Task<bool> AuthenticateGoogle() 
{ 
    string lToken = "[JWT TOKEN HERE]"; 
    wfUser lUser = new wfUser(_wfContext); 
    var lAuthenticateResult = await lUser.wfAuthenticateGoogle(lToken); 
    Assert.IsTrue(lAuthenticateResult, "JWT Token Validated"); 

    return true; 
} 

Async Programming : Unit Testing Asynchronous Code題しMSDNマガジンから、この記事では、私はあまりにもそれのまわりで私の脳を得る助けました。

私はこのすべてを抱いていて、同期と非同期の方法をミックスしていて、うまくいきませんでした。コードは、私が実行したことがないかのように呼び出されたあとに設定したデバッグポイントをスキップしたように見えました。実行した場合、見えなかった場所で実行し、デバッガにログできませんでした。

金曜日の夜遅く、開発者が能力と健全性の両方に疑問を抱くようになったのは、恐ろしい瞬間でした。 :)

もう一度お手伝いします!

p.s.私は質問にAngular JSを間違って入力し、Angular 4を意味しました...そして、そこにTypeScriptを使用しています。ある日、Angularの新しいバージョンをAngularJSと誤って参照するのをやめます。

0

私の挑戦は、非同期メソッドは他の非同期メソッドによって呼び出しスタックをバックアップすることしかできないようです。

これは完全ではありません。同期メソッドでは、非同期メソッドを使用できます。もちろん、あなたは '非同期'効果の大部分を失っていますが、時にはそれをする必要があります。タスクを返す非同期メソッドとして、いくつかのオプションがあります。

タスクが結果を返すとき、t.Resultへの参照は、それがわかるまで実行をブロックします。そうでない場合は、Task.Waitを使用することができます(できればタイムアウトが必要です)。 google jwtトークンを検証するコード例:

public bool ValidateGoogleToken(string token) 
{ 
    try 
    { 
    if(GoogleJsonWebSignature.ValidateAsync(token).Wait(1000)) 
     return true; //success 
    //timeout exceeded 
    } 
    catch (Exception e) 
    { 
    //tampered token  
    } 
    return false; 
} 
関連する問題