惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
G
Google Developers Blog
H
Help Net Security
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
D
Docker
Hugging Face - Blog
Hugging Face - Blog
I
InfoQ
博客园 - 司徒正美
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
使用 QQ 互联实现 QQ 登录站点|OhYee 博客
2020-04-08 · via OhYee 博客

这是一篇最后编辑于 6 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

使用 QQ 互联实现QQ登录站点

QQ 互联相关的权限几年前就申请了,但是嫌麻烦没有去弄。
因为昨天的动森大头菜排队系统,群里有提到 QQ 机器人提醒登机,所以就去搜了下。结果发现,自从网页 QQ 挂掉后,QQ 机器人的实现只能靠模拟手机版 QQ,直接用 QQ 的协议进行数据交互。稍微搜了下几个比较常用的 QQ 机器人框架,感觉太繁琐了(毕竟相当于要实现一个没有前端的手机 QQ ),所以就弃坑了。

不过偶然又跳转到了 QQ 开放中心,然后想起了曾经申请的网页应用。于是就对着文档实现了基于 Go 的接口封装

根据文档的内容,基本上可以判定,这就是个半死的开放平台了:

  • QQ 互联官方文档工具的 QQ 互联都是不能用的
  • 有些接口数据返回的内容和文档写的不一样
  • 大部分接口都用于腾讯微博和QQ空间,QQ空间倒还好说,虽然充黄钻的少,但是用的人还挺多。但是腾讯微博……

尽管 QQ 互联问题很大,不过还是写了下模块,主要原因是今天代码没写,就开个坑,在 Github 上把今天绿了……

OAuth 2.0

QQ 互联使用的是 OAuth 2.0(之前在网易实习时,也实现过内部平台类似的登录方式),大概思路就是:

  1. 用户访问第三方站点,需要获取 QQ 的一些数据
  2. 第三方站点将用户跳转到 QQ 官方的页面
  3. 用户在 QQ 官方页面登录
  4. 登陆完成后,QQ 的页面把用户跳到第三方站点(并携带一个登录成功的证明——code
  5. 第三方站点拿着这个code以及自己的身份证明app idapp key去 QQ 的 API 申请令牌token
  6. 第三方站点拿着token去获取用户信息

搞得这么复杂主要是为了避免各种可能的攻击手段。

在这里,code是临时性的,并且申请到token后便作废了,真正用户授权给第三方站点的凭证是token
之所以多这么一步是为了避免往回跳转的时候由于一些奇怪的原因(劫持?)跳到不是用户想要授权的站点。因此还需要一个只有第三方站点才拥有的key来再次确认下身份。

实际上,很多 OAuth 2.0 的应用还需要在这一步进行加密,以增强安全性

文档

因为 QQ 互联目前用得上的接口就几个,基本上也就只能实现一个登录功能了

按照顺序调用各个函数即可

conn := qq.New("Your app id", "Your app key", "Your redirect uri")

token, err := conn.Auth(code)
if err != nil {
    return
}
output.Debug("%+v", token)

_, openID, unionID, err := conn.OpenID(token)
if err != nil {
    return
}
res, err := conn.Info(token, openID)
if err != nil {
    return
}

该模块要用到哪里

按照目前的思路,这个模块会更新到博客的用户系统里(目前实际上并没有用户系统)
当用户需要发布评论时,可以选择一键 QQ 登录(但是真的有意义么)
通过 QQ 互联,使用openIDunionID建立一个新的用户,并且设置昵称和头像,并要求其绑定邮箱(为了发送通知邮件用)

不过感觉把流程搞那么复杂会打消大家评论的积极性