この7/26に第9回まどべんよっかいちを開催しました。 私からは「Windows.Web.Http.HttpClientとWebAuthenticationBroker」と題して、 Windows 8.xストアアプリやWindows Phone 8.1アプリでWebサービスに アクセスするときに便利な2つのクラスを紹介しました。
サンプルコード
サンプルコードをGitHubで公開しました。
Windows.Web.Http.HttpClient: Windows 8.1での利用例です。
WebAuthenticationBroker: Windows 8.1, Windows Phone 8.1, WPFでの利用例です。
WebAuthenticationBrokerの補足
Windows Phone 8.1でWebAuthenticationBrokerを使った場合、認証画面の呼び出しはAuthenticateAndContinue(Uri requestUri, Uri callbackUri)メソッドで行います(サンプルコードのWebAuthenticationBrokerSample / TwitterOAuth / TwitterOAuth.WindowsPhone / MainPage.xaml.csの106行目)。
このとき、アプリはいったん処理が中断されます。認証が終わると、アプリが再開されてActivatedイベントが発生します。このようにWindows 8.1の場合と認証実行時の動作が異なります。
Windows Phone 8.1において、認証結果を受けてアプリの処理を継続するためには、以下の対応が必要です。
1. AppクラスにOnActivatedイベントハンドラを実装して、IActivatedEventArgsクラスの引数がIContinuationActivatedEventArgsインターフェースを実装しているか調べる。
2. 実装している場合は、アプリが継続した場合なので、引数のKindプロパティの値を調べる。(WebAuthenticationBrokerSample / TwitterOAuth / TwitterOAuth.Shared / App.xaml.csの189行目、WebAuthenticationBrokerSample / TwitterOAuth / TwitterOAuth.WindowsPhone / ContinuationManager.csの54行目)
3. KindがActivationKind.WebAuthenticationBrokerContinuationの場合はWebAuthenticationBrokerの認証画面から戻った場合なので、IContinuationActivatedEventArgsインターフェースの引数をさらにWebAuthenticationBrokerContinuationEventArgsインターフェースでCastしてその値を利用して処理を継続する。サンプルコードでは、IWebAuthenticationContinuableインターフェースを実装したMainPageクラスをrootFrame.Contentから取得して、そのContinueWebAuthenticationメソッドを呼び出しています。
4. WebAuthenticationBrokerContinuationEventArgsインターフェースは、認証結果のResponseStatusプロパティ(WebAuthenticationResultクラス)があります。WebAuthenticationResultクラスは、認証結果のステータスコードのResponseStatusプロパティ、認証結果の応答のResponseDataプロパティがあり、認証に成功したかどうかと、成功した場合は認証情報を得ることができます。
なお、Windows 8.1ではWebAuthenticationBroker.AuthenticateAsyncを非同期で呼び出してその結果を処理すればよいので、このような考慮は不要です。