从无到有创建一个聊天App五-服务端验证QQ登录的合法性

意义

我在从无到有创建一个聊天App之一-创建项目,接入QQ登录中介绍了QQ登录的申请流程,又在从无到有创建一个聊天App之四-app实现QQ登录及其后台相关代码介绍了前后台相关代码的实现,但是留下了一个问题,这里解决一下。
我一直在思考这个问题:手机上使用QQ登录,获得的仅仅是标志用户身份的openid。那么,在服务端,对于提交上来的openid合法性如何验证呢?如果不做验证,只要知道你的接口,可以瞬间注册无数的账号,更为严重的是,万一撞到合法绑定的openid,服务端不做验证而返回token,那么,通过该token即可访问用户相关的所有资源,其危险性不言而喻。所以,必须验证openid是否合法。
那么仅仅凭一个openid,是无法知道其合法与否的。解铃还需记录人,从QQ那边获得的openid,仍然需要到QQ那边验证。腾讯开放平台除了提供SDK,方便开发者开发之外,还提供了原生的Http api,我们可以使用获取用户在QQ空间的个人资料这个api。这个api只需要传入手机端登录获得的access_token和openid以及我们申请的oauth_consumer_key,就可以获取用户的基本信息,若能获取成功,则说明用户提交的openid是合法的,这三个参数在这里都有详细说明。

实现

我们使用一个node.js库superagent来做http请求。运行如下命令安装该库。

npm install superagent

这个模块库提供了非常方便的http请求功能的封装,调用的这个获取用户基本信息接口使用的是get请求,因此我们可以这样写:

var superagentRequest = require('superagent');
superagentRequest.get('https://graph.qq.com/user/get_simple_userinfo')
    .query({
        access_token: requestQQAccessToken,
        oauth_consumer_key: OPEN_ID,
        openid: requestQQID
    })
    .then(function (res) {
        let result = JSON.parse(res.text);
        console.log("by " + requestQQID + " tx result:" + res.text);
        if (result.ret === 0) {
            let nickName = result.nickname;
            let gender = result.gender;
            let province = result.province;
            let city = result.city;
            let year = result.year;
            let avatar = result.figureurl_qq_2;
            console.log("qq check result:" + nickName + "" + gender + "" + province + city + year + avatar);
        }
    })
    .catch(function (err) {
        // err.message, err.response
    });

而且这个接口取得了用户的基本信息,正好为我们后面使用,真是一举两得。

接下来要做的事情

接下来是时候实现好友系统了。但是之前我们有一些工作要做。加好友需要对方的账号,我们现在并没有账号,只有一个userid,这个太长了,而且毫无意义,用户肯定不能记下来。我们可以让用户自己填一个账号,类似微信号,也是唯一的,也可以使用手机号或者邮箱,但是用户自己输入,万一用户想好的一个好名字被抢先注册了,肯定要恼火的。后面两个以后我们也会接入。这里,我们也先来模仿QQ,在用户注册成功后,为用户生成一个数字账号,类似QQ号。但是我们可以比QQ号短一点,只有5位,我们可没有那么多用户,也比较好记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值