QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码

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

QQ登录OAuth2.0:对于用户相关的OpenAPI(例如获取用户音信,动态同步,照片,日志,分享等),为了保障用户数据的安全和隐私,第三方网站访问用户数量前都需要显式的向用户征求授权。
QQ登录OAuth2.0利用OAuth2.0标准协议来进行用户身份验证和取得用户授权,相对于事先的OAuth1.0协议,其验明正身流程更简便易行和商洛。具体参考文档
:【QQ登录】OAuth2.0支出文档

QQ互联网站已经提供了PHP,JS,Android和iOS的SDK,缺乏.NET版本的SDK,春龙节假日期间使用部分空闲时间封装了一个享有完全意义的.NET
SDK,后续将打包一个相应的Windows
Phone的SDK,并开源放在http://opensns.codeplex.com
,专门搭建了一个示范网站http://www.win8charm.com/
和MSDN风格的在线协理网站http://help.win8charm.com/
。后日这篇著作重要介绍使用.NET SDK实施QQ登陆效率。

从这里http://opensns.codeplex.com/ 下载最新版本的SDK,最新版本是Beta,
完成SDK的包裹,希望我们使用帮助测试,SDK依赖于牛顿soft.Json和RestSharp五个程序集,具体可以参照使用RestSharp
库消费Restful
Service

紧尽管多少个类QzoneContext(QQ登陆的上下文数据)  和 QOpenClient
(QQ互联API入口),其他类紧虽然模型,配置类。

1、你得去http://connect.qq.com/ 申请一个账号,会收获一个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=”https://graph.qq.com/oauth2.0/authorize” />
    </QzoneSection>
  </QQSectionGroup>

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

2、在项目中添加两个引用牛顿(Newton)soft.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的,项目示范运行在http://www.win8charm.com/
,下边贴个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. 开行浏览器访问 http://www.domain.com/
其他

相关文章