2016-02-12 52 views
0

我正在創建一個訪問Microsoft Cloud API以獲取健康數據的應用程序。它使用OAuth登錄當你點擊登錄按鈕記住登錄憑據/權限UWP/C#(Microsoft Cloud API)

private void signinButton_Click(object sender, RoutedEventArgs e) 
    { 
     UriBuilder uri = new UriBuilder("https://login.live.com/oauth20_authorize.srf"); 
     var query = new StringBuilder(); 

     query.AppendFormat("redirect_uri={0}", Uri.EscapeDataString(RedirectUri)); 
     query.AppendFormat("&client_id={0}", Uri.EscapeDataString(ClientId)); 

     query.AppendFormat("&scope={0}", Uri.EscapeDataString(Scopes)); 
     query.Append("&response_type=code"); 

     uri.Query = query.ToString(); 

     this.webView.Visibility = Visibility.Visible; 
     this.webView.Navigate(uri.Uri); 
    } 

這帶來了一個web視圖與頁面登錄和使用微軟的憑據。一旦完成,它導致:

private async void WebView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args) 
    { 
     // 
     // When the web view navigates to our redirect URI, extract the authorization code from 
     // the URI and use it to fetch our access token. If no authorization code is present, 
     // we're completing a sign-out flow. 
     // 
     if (args.Uri.LocalPath.StartsWith("/oauth20_desktop.srf", StringComparison.OrdinalIgnoreCase)) 
     { 
      WwwFormUrlDecoder decoder = new WwwFormUrlDecoder(args.Uri.Query); 

      var code = decoder.FirstOrDefault((entry) => entry.Name.Equals("code", StringComparison.OrdinalIgnoreCase)); 

      var error = decoder.FirstOrDefault((entry) => entry.Name.Equals("error", StringComparison.OrdinalIgnoreCase)); 
      var errorDesc = decoder.FirstOrDefault((entry) => entry.Name.Equals("error_description", StringComparison.OrdinalIgnoreCase)); 

      // Check the code to see if this is sign-in or sign-out 
      if (code != null) 
      { 
       // Hide the browser again, no matter what happened... 
       sender.Visibility = Visibility.Collapsed; 

       if (error != null) 
       { 
        this.responseText.Text = string.Format("{0}\r\n{1}", error.Value, errorDesc.Value); 
        return; 
       } 

       var tokenError = await this.GetToken(code.Value, false); 

       if (string.IsNullOrEmpty(tokenError)) 
       { 
        this.responseText.Text = "Successful sign-in!"; 
        this.signoutButton.IsEnabled = true; 
        this.signinButton.IsEnabled = false; 
        this.getProfileButton.IsEnabled = true; 
        this.getDevicesButton.IsEnabled = true; 
        this.getActivitiesButton.IsEnabled = true; 
        this.getDailySummaryButton.IsEnabled = true; 
        this.getHourlySummaryButton.IsEnabled = true; 
       } 
       else 
       { 
        this.responseText.Text = tokenError; 
       } 
      } 
      else 
      { 
       this.responseText.Text = "Successful sign-out!"; 

       this.signoutButton.IsEnabled = false; 
       this.signinButton.IsEnabled = true; 
       this.getProfileButton.IsEnabled = false; 
       this.getDevicesButton.IsEnabled = false; 
       this.getActivitiesButton.IsEnabled = false; 
       this.getDailySummaryButton.IsEnabled = true; 
       this.getHourlySummaryButton.IsEnabled = false; 
      } 
     } 
    } 

    private async Task<string> GetToken(string code, bool isRefresh) 
    { 
     UriBuilder uri = new UriBuilder("https://login.live.com/oauth20_token.srf"); 
     var query = new StringBuilder(); 

     query.AppendFormat("redirect_uri={0}", Uri.EscapeDataString(RedirectUri)); 
     query.AppendFormat("&client_id={0}", Uri.EscapeDataString(ClientId)); 
     query.AppendFormat("&client_secret={0}", Uri.EscapeDataString(ClientSecret)); 

     if (isRefresh) 
     { 
      query.AppendFormat("&refresh_token={0}", Uri.EscapeDataString(code)); 
      query.Append("&grant_type=refresh_token"); 
     } 
     else 
     { 
      query.AppendFormat("&code={0}", Uri.EscapeDataString(code)); 
      query.Append("&grant_type=authorization_code"); 
     } 

     uri.Query = query.ToString(); 

     var request = WebRequest.Create(uri.Uri); 

     try 
     { 
      using (var response = await request.GetResponseAsync()) 
      { 
       using (var stream = response.GetResponseStream()) 
       { 
        using (var streamReader = new StreamReader(stream)) 
        { 
         var responseString = streamReader.ReadToEnd(); 
         var jsonResponse = JObject.Parse(responseString); 
         this.creds.AccessToken = (string)jsonResponse["access_token"]; 
         this.creds.ExpiresIn = (long)jsonResponse["expires_in"]; 
         this.creds.RefreshToken = (string)jsonResponse["refresh_token"]; 
         string error = (string)jsonResponse["error"]; 

         return error; 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
    } 

我不希望用戶每次啓動應用程序都必須接受權限。有沒有辦法在本地保存憑據,以便在啓動時自動進行身份驗證?謝謝!

+0

這是一個Windows應用程序或Web應用程序..如果它是網絡..只要會話沒有超時並檢查它在'Page_Load'事件中的值,爲什麼不把它存儲一個會話變量..在global.asax OnSession_Start事件中初始化Session變量..請告訴我們這是winforms或webforms的應用程序類型 – MethodMan

+0

非常感謝您澄清。這是一款UWP應用程序。 – robbiestells

回答

0

商店憑證更衣室API中所需的OAuth部分的代碼描述

Windows.Storage.ApplicationData.Current.LocalSettings 

這個過程很好。切勿將這些信息存儲在正常設置API中。

開始時,請閱讀oauth信息並使用refreshtoken獲取新的訪問令牌。

更多信息請點擊這裏。 https://msdn.microsoft.com/en-us/library/windows/apps/mt270189.aspx