开放平台-web实现QQ第三方登录 --------肖宏伟
应用场景
web应用通过QQ登录授权实现第三方登录。
操作步骤
1 注册成为QQ互联平台开发者,https://www.doczj.com/doc/c05945875.html,/
2 准备一个可访问的域名,如https://www.doczj.com/doc/c05945875.html,
3 创建网页应用,配置必要信息,其中包括域名以及回调地址;
其中域名需要验证,需确保对域名主机有足够的控制权限
4 获取应用appID、appKey进行开发
登录流程
开发平台的登录授权采取oauth2.0机制,这也是目前几乎所有互联网开放平台所采取的方式。
需更多了解oauth2.0可参考阮老师的文
章:https://www.doczj.com/doc/c05945875.html,/blog/2014/05/oauth_2_0.html
实现方式
client-side
流程:
前端页面通过Implict方式登录授权 -> 回调获得accessToken -> 获取openid -> 同步用户信息并登录
为了保证数据安全,在获取用户信息并登录这一步必须由服务端实现。
这种方式的开发相对便捷,也是后面的实战案例将要采取的方式。
server-side
流程:
由server端页面跳转到登录授权页面(Authorization code方式) -> 回调获得code -> 置换accessToken -> 获取openid -> 同步用户信息并登录
可参考:
https://www.doczj.com/doc/c05945875.html,/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_serve r-side
SDK使用
JSSDK 可快捷实现前端登录授权的功能,可自定制登录按钮
使用文档:
https://www.doczj.com/doc/c05945875.html,/js_sdk%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E 缺点:存在浏览器兼容风险,此外登录按钮UI的定制也存在受限
JavaSDK 屏蔽了oauth授权的复杂度,方便后端实现授权及api操作缺点:增加依赖jar包,项目容易变得臃肿,尤其是当前项目已经存在oauth功能实现时可不必采用。
案例实战
功能描述
clientside + server-side 通过QQ网页授权登录,并获取用户信息
1 本地开发环境准备
修改hosts文件将https://www.doczj.com/doc/c05945875.html,映射到127.0.0.1;
本地服务器以80端口启动,windows下可能会出现80端口被系统进程占用的情况,解决方法可参
考https://www.doczj.com/doc/c05945875.html,/littleatp/p/4414578.html
本地服务器启动后,以https://www.doczj.com/doc/c05945875.html,的域名进行访问,在QQ登录授权时可通过域名验证这一步
2 登录跳转页面
//切割字符串转换参数表
function toParamMap(str){
var map = {};
var segs = str.split("&");
for(var i in segs){
var seg = segs[i];
var idx = seg.indexOf('=');
if(idx < 0){
continue;
}
var name = seg.substring(0, idx);
var value = seg.substring(idx+1);
map[name] = value;
}
return map;
}
//隐式获取url响应内容(JSONP)
function openImplict(url){
var script = document.createElement('script');
script.src = url;
document.body.appendChild(script);
}
//获得openid的回调
function callback(obj)
{
var openid = obj.openid;
$("#openid").text(openid);
//跳转服务端登录url
var resulturl = "@{openapi.QQs.login_result()}";
var accessToken = $("#accessToken").text();
//向服务端传输access_token及openid参数
document.location.href=resulturl + "?access_token=" + accessToken + "&openid=" + openid;
}
AccessToken:--ExpireIn id="expire">
OpenID:
//应用的APPID
var appID = "101207268";
//登录授权后的回调地址,设置为当前url
var redirectURI = "@@{openapi.QQs.login()}";
//初始构造请求
if (window.location.hash.length == 0)
{
var path = 'https://https://www.doczj.com/doc/c05945875.html,/oauth2.0/authorize?';
var queryParams = ['client_id=' + appID,
'redirect_uri=' + redirectURI,
'scope=' +
'get_user_info,list_album,upload_pic,add_feeds,do_like','response_typ e=token'];
var query = queryParams.join('&');
var url = path + query;
window.location.href= url;
}
//在成功授权后回调时location.hash将带有access_token信息,开始获取openid
else
{
//获取access token
var accessToken = window.location.hash.substring(1);
var map = toParamMap(accessToken);
//记录accessToken
$("#accessToken").text(map.access_token);
$("#expire").text(map.expires_in);
//使用Access Token来获取用户的OpenID
var path = "https://https://www.doczj.com/doc/c05945875.html,/oauth2.0/me?";
var queryParams = ['access_token='+map.access_token,
'callback=callback'];
var query = queryParams.join('&');
var url = path + query;
openImplict(url);
}
功能描述
页面在第一次打开时跳转到QQ登录授权页面;
授权成功之后回到当前页面通过url参数(hash串)获得accessToken;
此后可通过jsonp方式获取用户的openid,url如:https://https://www.doczj.com/doc/c05945875.html,/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN 获取到用户OpenID,返回包如下(JSONP方式获取):callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} ) 将access_token及openid传到服务端进行处理
3 server端获取用户信息
接收openid的页面方法
/**
* 登录结果
*
* @param access_token
* @param openid
*/
public static void login_result(String access_token, String openid) {
//调用api获取qq用户信息
QQUserInfo user = QQApi.getUserInfo(access_token, openid);
//此时若取得user信息,则可以进行保存,并执行用户登录操作
....
//登录成功后跳转
redirect(xxx);
}
QQApi的实现
/**
* QQ互联API
*
*
* 登录流程:
*
* 1 前端跳转qq授权页面
* 2 js获得access_token
* 3 通过jsonp方式获得openid
* 4 server端根据上传的access_token及openid获取用户信息,如昵称、头像
*
* 参考文档:
*
https://www.doczj.com/doc/c05945875.html,/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_clien t-side#Step2.EF.BC.9A.E8.8E.B7.E5.8F.96AccessToken
*
*
* @author xxx
* @createDate 2015年3月10日
*
*/
public class QQApi {
public static String appId = "xxx";
public static String appSecret = "xxx";
public static String baseUrl = "https://https://www.doczj.com/doc/c05945875.html,";
protected static final String URL_GET_USERINFO = baseUrl
+
"/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s" ;
protected static final long ACCESS_TIMEOUT = 15;
protected static final String DEF_APP_TOKEN_EXPIRE = "3h";
/**
* 获取用户信息
*
*
* https://www.doczj.com/doc/c05945875.html,/get_user_info
*
*
* 调用地址:
* https://https://www.doczj.com/doc/c05945875.html,/user/get_user_info
* 参数
* access_token=*************&
* oauth_consumer_key=12345&
* openid
*
* 返回结果如下:
* {
* "ret": 0,
* "msg": "",
* "is_lost": 0,
* "nickname": "小吞",
* "gender": "女",
* "province": "广东",
* "city": "广州",
* "year": "1993",
* "figureurl":
"https://www.doczj.com/doc/c05945875.html,/qzapp/101207268/982C9FEADAF7B242C5069B8F390784 BF/30",
* "figureurl_1":
"https://www.doczj.com/doc/c05945875.html,/qzapp/101207268/982C9FEADAF7B242C5069B8F390784 BF/50",
* "figureurl_2":
"https://www.doczj.com/doc/c05945875.html,/qzapp/101207268/982C9FEADAF7B242C5069B8F390784 BF/100",
* "figureurl_qq_1":
"https://www.doczj.com/doc/c05945875.html,/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/4 0",
* "figureurl_qq_2":
"https://www.doczj.com/doc/c05945875.html,/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/1 00",
* "is_yellow_vip": "0",
* "vip": "0",
* "yellow_vip_level": "0",
* "level": "0",
* "is_yellow_year_vip": "0"
* }
*
*
* @param accessToken
* @return
*/
public static QQUserInfo getUserInfo(String accessToken, String openid) {
if (StringUtils.isEmpty(accessToken) ||
StringUtils.isEmpty(openid)) {
return null;
}
String url = String.format(URL_GET_USERINFO, accessToken, appId, openid);
String resultString = DefaultHttp.get(url, ACCESS_TIMEOUT, GlobalConstants.UTF_8);
Logger.debug("[sso-qq]get userinfo. use url '%s'", url);
QQUserInfo userinfo = JsonUtil.fromJson(resultString, QQUserInfo.class);
if (userinfo == null || !userinfo.hasGot()) {
Logger.debug("[sso-qq]get userinfo failed, with result of '%s'", resultString);
return null;
}
Logger.debug("[sso-qq]get userinfo success, with result of '%s'", resultString);
return userinfo;
}
网络程序设计课程设计报告 专业网络工程 学号09102125 姓名赵旭阳 2012 年12月日
一、课程设计目的与任务 1.目的 (1)加深对计算机网络的基本概念和原理,以及网络编程接口Socket概念及编程原理的理解; (2)提高学生网络应用与编程、分析与解决实际问题的能力,为大型网络编程打下坚实基础; (3)通过撰写课程设计报告,锻炼学生的逻辑组织和语言表达能力; (4)培养学生理论运用于实践的综合应用和设计创新能力。 通过本次课程设计,使学生进一步理解、领会C#语言和网络编程技术,把所学的知识运用到具体的程序设计当中去,编写一个接近实际的应用程序。 本课程设计是一门综合性实验。 通过本次课程设计,掌握.net应用程序设计;加深对TCP/IP协议的理解;掌握C/S编程模式;掌握Socket机制、传输控制协议;用户数据报协议;掌握网络抓包的原理;掌握网络编程应用程序分析、设计、编程和调试的整个过程。 2.任务 (1)设计完成与网络应用相关题目的网络应用软件; (2)调试运行之后,要求边演示边解释设计的思想、过程及采用的方法; (3)完成课程设计报告。 二、课程设计的基本要求 1.熟练掌握网络的基本概念和原理; 2.熟练掌握网络编程接口Socket概念及编程原理; 3.掌握基于TCP/IP的Internet编程技术; 4.掌握各种软件开发工具的使用过程及方法。 三、设备及工具 硬件:微机120台以上,I3以上处理器,1024M以上内存、Ethernet网卡,交换机软件:Windows2000/XP操作系统,VS2010编程环境。 6.主要参考资料(文献) 1. 《TCP/IP—协议分析与应用编程》人民邮电出版社李峰 2. 《TCP/IP协议与网络编程》西安电子科技大学出版社任泰明 3. 《TCP/IP协议及网络编程技术》清华大学出版社罗军舟 4. 《C#网络编程技术教程》人民邮电出版社金华
C#程序设计 设计说明书 简易IE浏览器的设计与实现 学生姓名:郭成成 学号:1103380106 班级:计算机(一)班 专业:计算机应用技术 指导教师:胡老师
课程设计任务书 2011—2012 学年第二学期 课程设计名称:C#课程设计 设计题目:简易IE浏览器的设计与实现 完成期限:自 2012 年 11 月 8 日至 2011 年 11 月 29 日共 3 周 设计依据、要求及主要内容: 根据程序设计所学知识,设计与实现一个简单浏览器,该简单浏览器设计的内容和功能要求如下: (1)有合理的首页页面设计,背景柔和。 (2)有多个按钮,比如说前进、后退、刷新删除等。 (3) 输入地址栏,支持所有的网址,并有转到功能。 (4)设计登陆页面。 (5) 可以存储网址,进行网内连接。 (6)是利用 C#编写程序,该浏览器简单但功能齐全。 (7) 使用时同样可以最大化最小化。 (8)按钮是利用画图工具进行拷贝下来的。 (9) 地址默认为百度。 要求:系统功能设计基本完善,并写出详细的设计说明书。
摘要 关键词:关键词:前进、后退、刷新、输入合法地址、运行程序,在网内搜索,使用 vs2005 中的 C#编写程序,利用画图工具。拷贝前进、后退按钮。 1 课题描述 利用C#编写简单的程序,创建一个简易IE浏览器,包含基本的功能,培养编写程序的兴趣。实践中了解浏览器的一些特性 2 程序设计流程图 2.1 系统说明 使用 win7 系统,vs2005 中的控制台应用程序,设计主界面,并拖放按钮。具有一 般浏览器的基本功能,前进、后退、刷新、地址等。在输入地址栏。设默认地址为百度,便于使用,刷新功能,在网速不是太好,有一点卡时,刷新一下,主界面可以最 大化和最小化。使用绿色为边框颜色,用画图工具拷贝文件按钮,设有六个小按钮, 包括前进、后退、删除、刷新、转到等按钮。 2.1 主界面的设计主界面用纯白色背景,界面以中等大小为宜。使用绿色为边框颜色,用画图工具拷贝文件按钮,设有六个小按钮,包括前进、后退、删除、刷新、转到等 按钮。主界面用纯白色背景,界面以中等大小为宜。 3 功能的设计 3.1 主界面功能的设计 主界面功能的设计主界面打开时,显示空白背景。地址为默认的百度 3.2 后退功能的设计 后退功能的设计当打开网页时,想浏览之前的网页,不需要重新打开,只需按倒退按钮,就可以浏览之前的网页,这是退后按钮的功能 3.3 浏览功能的设计 浏览功能的设计浏览基本的网页视频、文本文件等,浏览新闻杂志,打开别的网页 4 测试 4.1 系统测试
目录 目录 (1) 一、课程设计的目的与要求 (2) 二、题目说明 (2) 2.1程序开发背景................................................................... 错误!未定义书签。 2.2开发工具介绍 (2) 三、总体设计 (2) 3.1.系统开发平台: (2) 这个简易浏览器由Java语言编写,用Eclipse编译执行 (2) 3.2.系统流程图: (3) 3.3功能结构图: (3) 四、详细说明 (4) 4.1 系统实施 (4) 五、遇到的问题和解决方法 (9) 六、课程设计总结 (10)
一、课程设计的目的与要求 加深学生对面向对象概念以及JAVA面向对象程序设计思想的理解和掌握;使学生熟悉开发一个项目的基本过程,培养学生分析问题和解决问题的能力,增强学生的动手能力。为后续学习和应用打下一定的基础。 二、题目说明 本程序实现一个简单的浏览器。用户通过在URL输入框中输入要下载的网络页面的网址,并点击浏览器界面上相应的按钮,或直接按回车键,就能完成网络页面下载的功能。同时,它还支持浏览本地HTML文件,用户在输入框中输入文件所在盘符及具体路径,并按回车键,或者点击界面上相应按钮,实现浏览本地文件的功能。它能够实现页面的文本链接,能够显示网页图片,并能够通过相应按钮的操作返回上一次访问的页面,还可以通过相应按钮返回后退之前访问的页面。该简易浏览器能帮助用户实现基本的网页浏览功能。 2.2开发工具介绍 三、总体设计 3.1.系统开发平台: 这个简易浏览器由Java语言编写,用Eclipse编译执行
C#程序设计 设计说明书简易IE浏览器的设计与实现 学生姓名:郭成成 学号:1103380106 班级:计算机(一)班 专业:计算机应用技术
指导教师:胡老师 课程设计任务书 2011—2012 学年第二学期 课程设计名称:C#课程设计 设计题目:简易IE浏览器的设计与实现 完成期限:自 2012 年 11 月 8 日至 2011 年 11 月 29 日共 3 周 设计依据、要求及主要内容: 根据程序设计所学知识,设计与实现一个简单浏览器,该简单浏览器设计的内容和功能要求如下: (1)有合理的首页页面设计,背景柔和。 (2)有多个按钮,比如说前进、后退、刷新删除等。 (3) 输入地址栏,支持所有的网址,并有转到功能。 (4)设计登陆页面。 (5) 可以存储网址,进行网内连接。 (6)是利用 C#编写程序,该浏览器简单但功能齐全。
(7) 使用时同样可以最大化最小化。 (8)按钮是利用画图工具进行拷贝下来的。 (9) 地址默认为百度。 要求:系统功能设计基本完善,并写出详细的设计说明书。 摘要 关键词:关键词:前进、后退、刷新、输入合法地址、运行程序,在网内搜索,使用vs2005 中的 C#编写程序,利用画图工具。拷贝前进、后退按钮。 1 课题描述 利用C#编写简单的程序,创建一个简易IE浏览器,包含基本的功能,培养编写程序 的兴趣。实践中了解浏览器的一些特性 2 程序设计流程图 2.1 系统说明 使用 win7 系统,vs2005 中的控制台应用程序,设计主界面,并拖放按钮。具有一 般浏览器的基本功能,前进、后退、刷新、地址等。在输入地址栏。设默认地址为百度,便于使用,刷新功能,在网速不是太好,有一点卡时,刷新一下,主界面可以最 大化和最小化。使用绿色为边框颜色,用画图工具拷贝文件按钮,设有六个小按钮,包括前进、后退、删除、刷新、转到等按钮。 2.1 主界面的设计主界面用纯白色背景,界面以中等大小为宜。使用绿色为边框颜色,用画图工具拷贝文件按钮,设有六个小按钮,包括前进、后退、删除、刷新、转到等按钮。主界面用纯白色背景,界面以中等大小为宜。
基于Web浏览器的桌面虚拟化系统 华中科技大学 硕士学位 基于Web浏览器的桌面虚拟化系统 姓名:梁小锋 申请学位级别:硕士 专业:计算机软件与理论 指导教师:廖小飞 20XX-01-16 华中科技大学硕士学位
摘要 近年来,随着计算机性能的日益提升,网络带宽越来越大,绿色节能的呼声越 来越大,虚拟化技术在资源整合以及安全隔离等方面的优势日渐突出,成为学术界 和工业界关注的热点。桌面虚拟化技术是目前虚拟化领域的研究热点。围绕着桌面 虚拟化的用户体验,学术界和工业界都做了相当多的研究工作。但目前,桌面虚拟 化系统中的关键技术仍然面临着诸多挑战:如何以随处执行的理念提高系统易用性; 如何设计高效的图形压缩与多窗口集成机制以提高用户体验等。 基于 Web 浏览器的桌面虚拟化系统(WebDesk )有效地解决了上述问题。其核
心设计思想是:把网络应用程序和本地的桌面应用程序集成到一个虚拟的工作环境 中,并以浏览器为载体提供登录与使用的方式。用户在该平台上不仅可以使用互联 网上第三方服务商提供的应用服务,还可以使用原生的桌面应用程序。WebDesk 主 要技术如下:通过部署用户请求中心来处理用户请求,建立客户端与应用程序服务 器的连接;使用 JavaScript 构建一个用户界面框架,把多个应用整合到一个页面中; 在后台截获应用程序窗口的图像更新,并通过远程传输协议传输到应用传输单元, 在客户端显示;通过窗口同步技术来同步用户端和服务端的应用窗口;通过把数据 传输通道迁移到物理机中,直接读取虚拟机显示缓存的方式来优化图像传输
性能。 为了验证 WebDesk 的功能并测试其性能,设计了一个真实的集群硬件环境,并 通过部署桌面虚拟化系统建立了一个实验性的安全办公环境。功能测试表明, WebDesk 可以实现的窗口图像的传输和窗口控制操作,整合网络应用服务和原生的 桌面应用程序的功能。性能测试表明,在 WebDesk 中,用户打字平均延时约 52 毫 秒,图像传输平均延时约为 190 毫秒,而视频传输质量为 82.7%。 关键字:桌面虚拟化,瘦客户端,图像传输 I 华中科技大学硕士学位
效果演示: https://www.doczj.com/doc/c05945875.html,/slideshow/ 难点:响应鼠标事件实现滑动效果 项目目录: files文件夹下的几个文件夹都是放的图片,fullsize里面是大图,thumbs里面是小图。其中那个.png文件是测试用的图片 页面部分: