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依赖于Newtonsoft.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、在项目中添加三个引用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的,项目示例运行在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号是一一对应关系。
参考网站:http://www.dandanxiaoshuo.com/
关注下面的微信公众账号进行测试: 扫描一下
本地测试
- 前提准备,了解本地Host文件的作用
- 找到C:\WINDOWS\system32\drivers\etc\hosts这个文件
- 用文本方式打开
- 增加一行:127.0.0.1 www.domain.com
- 启动本地服务器
- 启动浏览器访问 http://www.domain.com/
其他
- 下载: http://opensns.codeplex.com/
- 项目示例:http://www.win8charm.com/
- SDK 在线文档:http://help.win8charm.com/
- QQ群:80767552
- 注:众人拾柴火焰高,欢迎各位反馈使用中的bug。
- 报告issue请来:http://opensns.codeplex.com/workitem/list/basic
- 站内信或者下面方式
- 微博:http://t.qq.com/geffzhang
- 邮箱:geffzhang#qq.com
- 博客:http://www.cnblogs.com/shanyou
QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码的更多相关文章
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- 什么是“QQ登录OAuth2.0”
1. 什么是“QQ登录OAuth2.0 OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他 ...
- PHP 接入(第三方登录)QQ 登录 OAuth2.0 过程中遇到的坑
前言 绝大多数网站都集成了第三方登录,降低了注册门槛,增强了用户体验.最近看了看 QQ 互联上 QQ 登录的接口文档.接入 QQ 登录的一般流程是这样的:先申请开发者 -> 然后创建应用(拿到一 ...
- 腾讯微博OAuth2.0 .NET4.0 SDK 发布以及网站腾讯微博登陆示例代码(原创)
1.使用简单方便,包含详细注释: 2.暂时只支持xml格式字符串的转换,建议接口使用xml参数:3.QweiboSDK.Controllers命名空间下已包含所有API接口:4.只需调用到Qweibo ...
- oauth2.0实现sso单点登录的方式和相关代码
SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...
- OAuth2.0理解和用法
现在网络的资料到处都是,很容易搜索到自己想要的答案.但答案通常只能解决自己一部分的问题.如果自己想要有一套自己的解决方案,还得重新撸一遍靠谱. 我需要学下OAuth2.0吗? 没看之前以为OAuth2 ...
- Oauth2.0 QQ&微信&微博实现第三方登陆
一.写在前面 目前对于大多数的App或Web网站都支持有第三方登陆这个功能,用户可使用 QQ/ 微信/ 微博 帐号快速登录你的网站,降低注册门槛,为你的网站带来海量新用户.最近在新项目上刚好用到了,在 ...
- QQ登录整合/oauth2.0认证-02-跳转到QQ互联页
---------------------------目录---------------------------------- QQ登录整合/oauth2.0认证-01-申请appkey和appid ...
- 第三方登录:QQ登录实现(OAuth2.0)
一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 ...
随机推荐
- mysql 数据库查询与实例。
资料是从教材弄下来的,加上了我的理解.主要内容是练习实例,在写博文中学习命令行,当然也希望这篇博文能帮助其他人学习mysq数据库命令 SELECT 语句可以从一个或多个表中选取特定的行和列 SELEC ...
- Spring+SpringMVC+Mybatis+MAVEN+Eclipse+项目完整环境搭建
1.新建一个Maven项目,创建父项目. 2.创建子项目模块 3.创建javaWeb项目 4.创建后的项目目录结构 5.Maven文件配置 parent父项目pom.xml文件配置 <?xml ...
- excel设置单元格不可编辑
把允许编辑的单元格选定,右键-设置单元格格式-保护,把锁定前的对钩去掉.再点工具-保护工作表.这样就可以只让你刚才设定的单元格允许编辑,其他不允许.
- oracle操作字符串:拼接、替换、截取、查找
1.拼接字符串 1)可以使用“||”来拼接字符串 select '拼接'||'字符串' as str from dual 2)通过concat()函数实现 select concat('拼接', '字 ...
- JavaScript错误处理
JavaScript 错误 - Throw.Try 和 Catch JavaScript 测试和捕捉 try 语句允许我们定义在执行时进行错误测试的代码块. catch 语句允许我们定义当 try 代 ...
- jquery获取元素方式
1 从集合中通过指定的序号获取元素 html: <div> <p>0</p> <p>1</p> <p>2</p> & ...
- php中抽象类和接口的特点、区别和选择
一.特点: 1.抽象类特点 (1) 用 abstract 来修饰一个类,那么这个类就是抽象类:抽象类绝对不能被实例化,即$abc = new 抽象类名();会报错. (2) 用abstract 来修饰 ...
- win7 IIS7.0 【IIS 管理器无法验证此内置帐户是否有访问权】
异常信息: 服务器配置为将传递身份验证和内置帐户一起使用,以访问指定的物理路径.但是,IIS 管理器无法验证此内置帐户是否有访问权.请确保应用程序池标识具有该物理路径的读取访问权.如果此服务器加入到域 ...
- 「30天自制操作系统」 Stop & 「OS67 」 Start
废话 整个十月都没有再写一点什么, 其实没什么好写的, 把书里的东西码出来贴在博客里实在没什么意思, 况且书里已经写得够详细了. 这本书给我最深刻的感觉是, 作者通过简化一些细节, 一步一步地模拟整个 ...
- Detours简介 (拦截x86机器上的任意的win32 API函数)
Detours 当然是用detours,微软明显高腾讯一筹,同上,至今没失败过.写这种HOOK一定要再写个测试程序,不要直接HOOK你的目的程序,例如QQ,因为这样不方面更灵活的测试.说明一下:Det ...