博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
阅读量:5971 次
发布时间:2019-06-19

本文共 4441 字,大约阅读时间需要 14 分钟。

OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。

QQ登录OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。

QQ登录OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户授权,相对于之前的,其认证流程更简单和安全。具体参考文档 。

QQ互联网站已经提供了PHP,JS,Android和iOS的SDK,缺少.NET版本的SDK,春节假期期间利用一些空闲时间封装了一个具有完全功能的.NET SDK,后续将封装一个对应的Windows Phone的SDK,并开源放在 ,专门搭建了一个示例网站 和MSDN风格的在线帮助网站 。今天这篇文章主要介绍使用.NET SDK实施QQ登陆功能。

从这里 下载最新版本的SDK,最新版本是Beta, 完成SDK的封装,希望大家使用帮忙测试,SDK依赖于Newtonsoft.Json和RestSharp两个程序集,具体可以参考。 主要是两个类QzoneContext(QQ登陆的上下文数据)  和 QOpenClient (QQ互联API入口),其他类主要是模型,配置类。

1、你得去 申请一个账号,会得到一个APP ID和App Key,这两个东东会在生成请求的时候用到。你的去填一些资料,还要提交一些资料审核。

在配置文件web.config加入QQ登陆所需要的一些配置参数,如下图所示:

<configuration>

  <configSections>
    <sectionGroup name="QQSectionGroup">
      <section name="QzoneSection" type="System.Configuration.NameValueSectionHandler,System, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089" />
    </sectionGroup>
  </configSections>
   <QQSectionGroup>
    <QzoneSection>
      <add key="AppKey" value="" />
      <add key="AppSecret" value="" />
      <add key="CallBackURI" value="" />
      <add key="AuthorizeURL" value="" />
    </QzoneSection>
  </QQSectionGroup>

AppKey是申请QQ登录成功后,分配给应用的appid;AppSecret是申请QQ登录成功后,分配给网站的appkey;CallBackURI是QQ登陆成功后的回调地址:AuthorizeURL是QQ互联的OAth2认证地址:

2、在项目中添加三个引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在页面上放置按钮,打开qq登录的页面,然后登录成功之后回调您的网站的页面。此时如果用户在你的网站有账号,那就可以绑定现有账号,或者新注册一个账号。如果你是新建站,也可以完全使用qq登录来作为用户体系。

下面上代码:

        /// <summary>

        /// QQ登陆页面
        /// </summary>

       [HttpGet]

       public ActionResult Login(string returnUrl)
       {
           this.Session[RETURNURL] = returnUrl;
           var context = new QzoneContext();
           string state = Guid.NewGuid().ToString().Replace("-", "");
           Session["requeststate"] = state;
           string 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";
           var authenticationUrl = context.GetAuthorizationUrl(state, scope);
           return new RedirectResult(authenticationUrl);

       }   

        /// <summary>

        /// 回调页面
        /// </summary>

       public ActionResult QQConnect(LoginModel model)

       {
           if (Request.Params["code"] != null)
           {
               QOpenClient qzone = null;

               var verifier = Request.Params["code"];

               var state = Request.Params["state"];
               string requestState = Session["requeststate"].ToString();

               if (state == requestState)

               {
                   qzone = new QOpenClient(verifier, state);
                   var currentUser = qzone.GetCurrentUser();
                   if (this.Session["QzoneOauth"] == null)
                   {
                       this.Session["QzoneOauth"] = qzone;
                   }
                   var friendlyName = currentUser.Nickname;

                   var isPersistentCookie = true;

                   SetAuthCookie(qzone.OAuthToken.OpenId, isPersistentCookie, friendlyName);

                   return Redirect(Url.Action("Index", "Home"));

               }

           }

           return View();
       }

上面的代码是ASP.NET MVC的,项目示例运行在 ,下面贴个ASP.NET WebForm的代码示例:

QQ登陆页面

namespace OpenConnect.WebSample.Account

{
    public partial class LoginToQQ : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GetRequestToken();
        }

        private void GetRequestToken()

        {
            var context = new QzoneContext();
            string state = Guid.NewGuid().ToString().Replace("-", "");
            string 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";
            var authenticationUrl = context.GetAuthorizationUrl(state,scope);
            //request token, request token secret 需要保存起来
            //在demo演示中,直接保存在全局变量中.真实情况需要网站自己处理
            Session["requeststate"] = state;          
            Response.Redirect(authenticationUrl);

        }

    }
}

 

回调页面

namespace OpenConnect.WebSample.Account

{
    public partial class QQCallback : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Params["code"] != null)
            {
                QOpenClient qzone = null;
                User currentUser = null;

                var verifier = Request.Params["code"];

                string state = Session["requeststate"].ToString();
                qzone = new QOpenClient(verifier, state);
                currentUser = qzone.GetCurrentUser();
                if (null != currentUser)
                {
                    this.result.Text = "成功登陆";
                    this.Nickname.Text = currentUser.Nickname;
                    this.Figureurl.ImageUrl = currentUser.Figureurl;
                }
                Session["QzoneOauth"] = qzone;

            }

     }

}

这里说明一下使用QQ互联登陆是获取不到用户的QQ号的,只会获取到用户的OpenId,OpenID和QQ号是一一对应关系。

本地测试
  • 前提准备,了解本地Host文件的作用
  1. 找到C:\WINDOWS\system32\drivers\etc\hosts这个文件
  2. 用文本方式打开
  3. 增加一行:127.0.0.1 www.domain.com
  4. 启动本地服务器
  5. 启动浏览器访问
其他
  • 下载:
  • 项目示例: 
  • SDK 在线文档: 
  • QQ群:80767552
  • 注:众人拾柴火焰高,欢迎各位反馈使用中的bug。
  • 报告issue请来:
  • 站内信或者下面方式
  • 微博:
  • 邮箱:geffzhang#qq.com
  • 博客: 

转载地址:http://ylwox.baihongyu.com/

你可能感兴趣的文章
Linux 内核已支持苹果
查看>>
屏幕分辨率的问题
查看>>
web.xml中filter,servlet和listener区别
查看>>
c# 使用Autodesk design Review API
查看>>
Linux用户权限acl配置
查看>>
NSString 去掉前后空格或回车符
查看>>
ant扩展应用的安装
查看>>
CentOS上使用libtld
查看>>
idea报错集锦
查看>>
MongoDB的安装和使用
查看>>
fix不抖动ie6
查看>>
SVN提交代码时全选文件
查看>>
Frament填坑
查看>>
使用spark-sql-perf评测spark 2.0
查看>>
Android下 scrollview的滚动停止事件的监听方法
查看>>
数据结构与算法之KMP算法02
查看>>
×××安全协议之IPsec
查看>>
用Unity3D的50个技巧:Unity3D最佳实践
查看>>
记录:C#编程中的字符串
查看>>
NEO从源码分析看NEOVM
查看>>