在 Windows Phone上使用QQConnect OAuth2

來源:互聯網
上載者:User

QQ互聯OAuth2.0 .NET SDK 發布以及網站QQ登陸範例程式碼 這篇文章講述的普通的ASP.NET網站上使用QQ互聯,本篇文章主要介紹在WindowsPhone環境使用QQ互聯OAuth2 SDK,本文的程式改自Google OAuth2 on Windows Phone。QQ互聯的OAuth2和Google 的OAuth2的流程上差不多,QQ互聯的還更簡單一點。

代碼中使用了如下三個類庫:

  • RestSharp
  • JSON.NET
  • MVVM Light

這些庫都可以通過NuGet包安裝,需要注意的是JSON.NET (4.0.7)目前和RestSharp的最新版本102.6.0.0不相容,需要使用JSON.NET (4.0.5)版本。

想把這個例子跑起來,需要到http://connect.qq.com 註冊擷取到appkey和appscrect,填寫到設定檔:

其中CallBackURI是在登記的回調地址。程式採用MVVM模式,將OAuth2認證的頁面為AuthenticationPage.xaml,登陸的邏輯都在ViewModel對應於AuthenticationViewModel,和QQ互聯伺服器互動的是AuthenticationProcess。互動的流程參照【QQ登入】開發攻略_Client-side。

AuthenticationViewModel::GetAccessCode封裝了OAuth2的驗證授權的邏輯。

       private bool _isAuthenticating;
       private Queue<Action<string,string>> _queuedRequests = new Queue<Action<string,string>>();

       public void GetAccessCode(Action<string,string> callback)
       {
           lock (_sync)
           {
               if (_isAuthenticating)
               {
                   _queuedRequests.Enqueue(callback);
               }
               else if (HasAuthenticated)
               {
                   if (!_process.AuthResult.IsExpired)
                   {
                       callback(_process.AuthResult.AccessToken,_process.AuthResult.OpenId);
                   }
                   else
                   {
                       InvokeCallback(callback);
                   }
               }
               else
               {
                   InvokeCallback(callback);
               }
           }
       }

       private void InvokeCallback(Action<string, string> callback)
       {
           _isAuthenticating = true;
           _queuedRequests.Enqueue(callback);

           ((PhoneApplicationFrame)App.Current.RootVisual).Navigate(new Uri("/AuthenticationPage.xaml", UriKind.Relative));
           AuthUri = _process.AuthUri;
       }

1、如果正在認證過程中,把調用方法放到隊列裡,然後返回。

2、如果驗證過了,並且票據還是有效,直接回調方法。

3、如果沒有認證過,或者票據已經失效了,轉到驗證頁面,可以使用QQ號碼登陸。

AuthenticationPage.xaml頁面帶了一個WebBrowser對象,將一個綁定是AuthenticationViewModel的AuthUri ,類似於

http://openapi.qzone.qq.com/oauth/show?which=Login&display=mobile&response_type=token&client_id=204134&redirect_uri=win8charm.com&scope=get_user_info,add_share,list_album,upload_pic,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,add_one_blog,add_topic,get_tenpay_addr&display=mobile

使用者登陸後,如果是首次登陸還需要授權API的訪問,然後會返回到redirect_uri參數指定的地址,這裡可以拿到返回的使用者的Access Token:

private void webBrowser1_Navigating(object sender, NavigatingEventArgs e)
{
           if (e.Uri.Host.Equals("win8charm.com"))
           {
               webBrowser1.Visibility = Visibility.Collapsed;
               e.Cancel = true;
               // setting this text will bind it back to the view model
               codeBlock.Text = e.Uri.Fragment.Replace("#", "");
           }
}

把返回的AccessToken通過頁面的一個CodeBlock的掩藏TextBlock將結果傳遞給View Model ,將Access Token和OpenID結果解析完成,完成整個驗證過程。

private string _code;
       public string Code
       {
           get
           {
               return _code;
           }
           set
           {
               _code = value;
               _process.ExchangeCodeForToken(Code);
           }
       }

public void ExchangeCodeForToken(string code)
        {
            if (string.IsNullOrEmpty(code))
            {
                OnAuthenticationFailed(EventArgs.Empty);
            }
            else
            {
                OAuthToken response = this.restApi.GetUserAccessToken(code);
                GetAccessToken(response);
            }
        }

        void GetAccessToken(OAuthToken response)
        {
            Debug.Assert(response != null);
            AuthResult = new Model.AuthResult()
            { 
                AccessToken = response.AccessToken,
                Expires = response.ExpiresAt
            } ;
            restApi.GetUserOpenIdAsync(AuthResult.AccessToken, GetUserOpenId, GetUserOpenIdFailure);
        }

        void GetUserOpenId(string response)
        {
            if (string.IsNullOrEmpty(response))
            {
                OnAuthenticationFailed(EventArgs.Empty);
            }
            AuthResult.OpenId = response;
            OnAuthenticated();
        }

在認證成功或者失敗的時候引發認證成功或者失敗的事件最終完成整個登陸過程。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.