QQ泡沫乐园 · 免费提供游戏辅助,破解软件,活动资讯,喜欢记得收藏哦!
综合软件_线报活动_游戏辅助_最新电影_最优质的的辅助分享平台

彩虹秒赞网源码 - 0.1元一万赞平台 - 刷赞平台推广免费QQ

网络 2022-06-11 08:02

蓝色字体,选择“明星公众号”

优质文章,第一时间送达

1. 前言

个人网站最近增加了评论功能。为方便用户无需注册即可发表评论,将常用的两个软件一键登录分别连接QQ和微博。其实挺简单的,可能有一点坑,但也不算太多,完全记录下来,方便后人快速连接。

2. 后台设计 在开始连接之前,我们先说一下后台设计。既然是第三方登录,难免会保存用户信息。首先需要明确的是,用户成功登录第三方后,我们能得到的只是一个代表用户唯一身份的ID,一个用来识别身份的accessToken,当然还有昵称等有限的信息, 头像, 性别等. 第三方登录的关键是如何判断用户是否合法登录, 如果确定本次登录的人和上次登录的人是同一个人而且不是假的。事实上,我们不必担心这一点。以微博登录为例。用户登录成功后,会回调一个code给我们,然后我们将code拿到微博换取accessToken。如果代码是用户随机填写的,那么这一关肯定过不了,所以之前的担心有点多余。另一个问题是如何与现有的用户系统连接。有的网站要求用户登录成功后输入手机号和验证码,或者要求用户重新注册账号和密码才能绑定第三方账号。用户体验非常差。遇到这种网站,一般都是直接关闭。我已经登录并让用户注册。我勒个去!由于我做的是评论功能,我不希望评论用户与现有的用户表连接,所以没有这样的事情。如果想打通,我想无非就是登录成功后,默认往旧用户表中插入一条数据。 ,然后将其与OpenUser表关联,在用户登录中加入OpenUser的认证即可。

本文背景以Java为例。

2.1. 数据库设计让我们来谈谈数据库设计。为了系统的可扩展性,我有一个专门的 OpenUser 表来存储第三方登录用户。主要字段如下:

这种设计理论上可以无限扩展。

2.2. 认证过程这里只说一下我的解决方案,将accessToken写入cookie肯定是不安全的,因为accessToken相当于第三方网站的临时密码,如果有人偷了,你可以随意用它做坏事。用户登录成功后,我们可以自己生成一个token。即使这样的token泄露了,最多也只能用于随机评论,损失不大,但是如果accessToken泄露了,以微博为例,人们可以用这个accessToken发微博是很危险的、删除微博、添加关注等随意。当然,如果不想token泄露,也可以通过绑定IP来限制。

认证是先判断cookie中是否有我们自己的token,然后判断是否合法,再判断第三方授权是否过期等。

QQ登录

3.1.实名认证

QQ登录我们连接QQ互联网,地址:qq.com,首先需要注册为开发者并实名认证。您需要持有您的身份证照片。我就不细说了。

3.2.创建应用程序

进入应用管理页面(qq.com/manage.html#/)创建应用,根据实际需要创建网站应用或者手机应用,我这里是网站应用:

第一步:

第 2 步:

提交后会自动提交审核,主要是检查你的数据与记录的数据是否一致。必须与备案材料完全一致,否则审核不通过:

当然,这些材料以后还是可以修改的。申请成功后会得到appId和appKey。

3.3.引导用户登录

你可以在这里下载一些视觉资料,在页面的适当位置放一个QQ登录按钮,引导用户点击页面进入授权:

代码:

function openWindow(url, width, height){ width = width || 600; height = height || 400; var left = (window.screen.width - width) / 2; var top = (window.screen.height - height) / 2; window.open(url, "_blank", "toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, left="+left+", top="+top+", width="+width+", height="+height);}
function qqLogin{ var qqAppId = '424323422'; // 上面申请得到的appid var qqAuthPath = 'http://www.test.com/auth'; // 前面设置的回调地址 var state = 'fjdslfjsdlkfd'; // 防止CSRF攻击的随机参数,必传,登录成功之后会回传,最好后台自己生成然后校验合法性 openWindow(`https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=${qqAppId}&redirect_uri=${encodeURIComponent(qqAuthPath)}&state=${state}`);}

然后会打开一个授权页面,这个页面大家应该都很熟悉了:

然后我这里遇到了一个问题,官方文档(qq.com)写道,登录成功后要做的第一件事就是返回一个code,然后用code transfer接口换取accessToken。然后试了很多次,换了2个账号,发现每次都是直接返回accessToken,省了我一步。我不知道发生了什么。郁闷。微信搜索Web项目聚集地,获取更多实用教程。

3.4. 获取accessToken 现在假设我们都是直接获取accessToken(因为我还没弄清楚为什么QQ直接返回,和文档说的不一样),但是accessToken会是放在授权回调中的#之后,并且URL地址中的hash值好像没有传到后台(好像是这样,如果不对请评论指正),所以只能写一个临时Page:

@RequestMapping("/authqq")public void authQQ(HttpServletRequest request, HttpServletResponse response) throws Exception{ // QQ登录有点特殊,参数放在#后面,后台无法获取#后面的参数,只能用JS做中间转换 String html = "" + "" + "" + " <i class="chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1">QQ</i>登录重定向页" + " " + "" + "" + " " + "" + ""; response.getWriter.print(html);}

3.5. 获取openId

根据accessToken调用接口获取用户的openId,特别注意这个openId对于QQ号+appId是唯一的,也就是说同一个QQ号登录两个不同的appId时得到的openId是不同的。顺便说一句,QQ登录的相关接口真的很“随便”,都是最简单的get请求,所以连接很流畅。微信搜索Web项目聚集地,获取更多实用教程。

直接看代码:

// 根据accessToken换取openId// 错误示例:callback( {"error":100016,"error_description":"access token check failed"} );// 正确示例:callback( {"client_id":"10XXXXX49","openid":"CF2XXXXXXXX9F4C"} );String result = HttpsUtil.get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken);Map resp = parseQQAuthResponse(result); // 这个方法就是把结果转Map// 欢迎关注 Web项目聚集地 获取更多实战教程Integer errorCode = (Integer)resp.get("error");String errorMsg = (String)resp.get("error_description");String openId = (String)resp.get("openid");if(errorCode != ) return new ErrorResult(errorCode, "获取QQ用户openId失败:"+errorMsg);

3.6.获取用户头像、昵称等信息

// 获取用户昵称、头像等信息,{ret: 0, msg: '', nickname: '', ...} ret不为0表示失败result = HttpsUtil.get("https://graph.qq.com/user/get_user_info?access_token="+accessToken+"&oauth_consumer_key="+appId+"&openid="+openId);resp = JsonUtil.parseJsonToMap(result);// 欢迎关注 Web项目聚集地 获取更多实战教程Integer ret = (Integer)resp.get("ret");String msg = (String)resp.get("msg");if(ret != 0) return new ErrorResult("获取用户QQ信息失败:"+msg);
// 用户昵称可能存在4个字节的utf-8字符,MySQL默认不支持,直接插入会报错,所以过滤掉String nickname = StringUtil.filterUtf8Mb4((String)resp.get("nickname")).trim; // 这个方法可以自行百度// figureurl_qq_2=QQ的100*100头像,figureurl_2=QQ 100&100空间头像,QQ头像不一定有,空间头像一定有String avatar = (String)resp.get("figureurl_qq_2");if(StringUtil.isBlank(avatar)) avatar = (String)resp.get("figureurl_2");String gender = (String)resp.get("gender");

3.7.注意事项

至此,第三方的介入基本结束了不是吗?简单的?后者无非就是怎么插入数据库,怎么保存token,写session等等。

有几点需要注意:

相关文档的官网已经写得很详细了,但是比较乱:http://wiki.connect.qq.com/

连接微博登录4.1.实名认证

我不会对此进行详细介绍。登录 http://open.weibo.com/ 即可轻松找到相关入口。 ,注册为开发者,实名认证,一模一样。

4.2.创建应用