OAuth: OAuth(开放受权)是一个开放标准,容许用户受权第三方网站访问他们存储在另外的服务提供者上的信息,而不须要将用户名和密码提供给第三方网站或分享他们数据的全部内容。html
QQ登陆OAuth2.0:对于用户相关的OpenAPI(例如获取用户信息,动态同步,照片,日志,分享等),为了保护用户数据的安全和隐私,第三方网站访问用户数据前都须要显式的向用户征求受权。
QQ登陆OAuth2.0采用OAuth2.0标准协议来进行用户身份验证和获取用户受权,相对于以前的OAuth1.0协议,其认证流程更简单和安全。具体参考文档 :【QQ登陆】OAuth2.0开发文档。web
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依赖于Newtonsoft.Json和RestSharp两个程序集,具体能够参考使用RestSharp 库消费Restful Service。 主要是两个类QzoneContext(QQ登录的上下文数据) 和 QOpenClient (QQ互联API入口),其余类主要是模型,配置类。安全
一、你得去http://connect.qq.com/ 申请一个帐号,会获得一个APP ID和App Key,这两个东东会在生成请求的时候用到。你的去填一些资料,还要提交一些资料审核。服务器
在配置文件web.config加入QQ登录所须要的一些配置参数,以下图所示:app
<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认证地址:dom
二、在项目中添加三个引用Newtonsoft.Json.dll、RestSharp.dll和 QConnectSDK.dll, 在页面上放置按钮,打开qq登陆的页面,而后登陆成功以后回调您的网站的页面。此时若是用户在你的网站有帐号,那就能够绑定现有帐号,或者新注册一个帐号。若是你是新建站,也能够彻底使用qq登陆来做为用户体系。post
下面上代码:测试
/// <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号是一一对应关系。