在 Windows Phone上使用QQConnect OAuth2

摘要:
QQ互联网的OAuth2的过程与谷歌的OAuth 2相似,而QQ互联网的OAuth2则稍微简单一些。要运行此示例,您需要http://connect.qq.com注册以获取appkey和appscrect,并填写配置文件:其中CallBackURI是注册的回调地址。程序采用MVVM模式。OAuth2认证的页面为AuthenticationPage.xaml。登录逻辑位于AuthenticationViewModel对应的ViewModel中,与QQ Internet服务器的交互为AuthenticationProcess。AuthenticationViewModel::GetAccessCode封装了OAuth2_Process的身份验证和授权逻辑。AuthResult。IsExpired){回调;}else{InvokeCallback;}}els{Invoke callback;}}privateevoidInvokeCallback{_isAuthenticating=true;_queuedRequests.Enqueue;.Navigate;AuthUri=_process.AuthUri;}1。如果正在进行身份验证,请将调用方法放入队列,然后返回。AuthenticationPage.xaml页面携带WebBrowser对象并绑定AuthenticationViewModel的AuthUri,类似于http://openapi.qzone.qq.com/oauth/show?

QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码 这篇文章讲述的普通的ASP.NET站点上使用QQ互联,本篇文章主要介绍在WindowsPhone环境使用QQ互联OAuth2 SDK,本文的程序改自Google OAuth2 on Windows Phone。QQ互联的OAuth2和Google 的OAuth2的流程上差不多,QQ互联的还更简单一点。

代码中使用了如下三个类库:

这些库都可以通过NuGet包安装,需要注意的是JSON.NET (4.0.7)目前和RestSharp的最新版本102.6.0.0不兼容,需要使用JSON.NET (4.0.5)版本。

想把这个例子跑起来,需要到http://connect.qq.com 注册获取到appkey和appscrect,填写到配置文件:

image

其中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

qoauth2windowsphone

用户登陆后,如果是首次登陆还需要授权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();
        }

在认证成功或者失败的时候引发认证成功或者失败的事件最终完成整个登陆过程。

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【设计经验】3、ISE中烧录QSPI Flash以及配置mcs文件的加载速度与传输位宽python爬虫(2)——urllib、get和post请求、异常处理、浏览器伪装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

redis实现二级缓存

Mybatis也会做缓存,也会有一级缓存和二级缓存:一级缓存:是SqlSession级别的缓存,使用HashMap数据结构来用于存储缓存数据的二级缓存:是mapper级别的缓存,其作用域是mapper的同一个namespace,不同的SqlSession执行两次相同namespace下的sql语句,并且传递的参数相同,返回的结果也相同时,第一次执行sql语句...

解决less 版本过高

执行npminstall--无保存加载器。安装less后,在样式中使用less时将报告错误。这是由于less loader版本过高造成的。您可以在package.json中查看less的当前版本。因此,在这种情况下,我们可以先卸载现有的less loader,然后安装less loader的较低版本npmuninstallless loader...

正负无穷float('inf')的一些用法

示例:输入:[-2,1,-3,4,-1,2,1,-5,4],输出:6解释:连续子数组[4],-1,2,1]的和最大,为6。...

解决xcode打开时loading假死的问题

出现这个问题就真得崩溃了,有些小伙伴甚至还重装了Xcode,这里给大家推荐一个行之有效的方法。...

Kafka监控工具——Kafka-Eagle

Kafka监控工具官网https://www.kafka-eagle.org/是什么KafkaEagle是一款用于监控和管理ApacheKafka的完全开源系统,目前托管在Github,由笔者和一些开源爱好者共同维护。而且,在使用消费者API时,尽量#客户端KafkaAPI版本和Kafka服务端的版本保持#一致性。...

PCL点云分割(2)

点云的分割是我想做的机器人手臂捕捉的一个非常重要的部分,因此首先要了解,如果我使用点云库来处理我用kinect获得的点云数据,这个例程也是由我自己慢慢修改程序并结合官方API的解释来实现的。如果我直接更改源程序,由于数据类型、头文件和其他原因,其中的许多细节可能无法编译,我们将很难找出错误。首先,让我们看看我自己设定的场景。然后我使用Kinect获取数据并观...