网站接入QQ登录功能的实现
来源 | https://github.com/Dream4ever/Knowledge-Base/issues/76
说明
注册开发者
创建网站应用
流程概述
按照要求访问指定网址,会显示QQ登录界面,选择QQ账号进行登录之后,会向之前所填写的 网站回调域 发起回调,回调URL中包含Authorization Code(授权码)。 网站回调域 用这个Authorization Code(授权码),结合其它数据,向指定的地址发送请求,接收到的响应中包含Access Token(访问令牌)。 网站回调域 再用Access Token(访问令牌) 向指定的地址发送请求,接收到的响应中包含所登录QQ账号的 OpenID(不涉及用户隐私)。 网站回调域 拿到用户的OpenID之后,结合前面获取到的Access Token以及其它数据,就可以调用QQ的接口,实现特定的功能了。比如可以调用get_user_info接口,获取登录用户的昵称、头像、性别,用来显示在前端页面中。
一、获取Authorization Code
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=${appId}&redirect_uri=${redirectUrl}&state=${state}&scope=${scope}
上面的地址中,appId为网站应用的APP ID,redirectUrl为网站应用的网站回调域,state为用户自定义的字符串,scope为向用户所请求的授权列表。
scope之外的参数均为必填项,scope如果不写,则默认只请求对接口get_user_info进行授权,获取用户最基本的几项信息:QQ昵称、QQ头像、性别。
发起请求之后,会将用户导向到QQ官方的登录页面,用户在这个页面上选择需要登录的QQ号,点击“登录”,网站回调域就会收到的腾讯服务器所发起的回调。
比如之前所填写的 网站回调域 为a.com/api/getauthcode 的话,腾讯服务器就会向 网站回调域 发送如下请求:
GET /getauthcode?code=F91C6110********
在上面接收到的这个请求中,URL查询字符串里,code= 后面的字符串,就是腾讯服务器发来的Authorization Code。
二、获取Access Token
拿到Authorization Code,结合其它数据,请求如下地址:
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=${appId}&client_secret=${appKey}&code=${authCode}&state=${state}&redirect_uri=${redirectUrl}
网站回调域 会收到如下响应:
access_token=FF3A****&expires_in=7776000&refresh_token=2516****
其中就包含了Access Token,并且这个Access Token有90天的有效期,但并不会按照官方文档所说的,用户再次登录时自动刷新,而是短时间(一天内)连续多次登录都不会刷新。
对于这个Access Token,官网建议开发者将其进行保存,以便后续调用OpenAPI访问和修改用户信息时使用。
三、获取OpenID
有了Access Token之后,就可以用它来获取当前所登录QQ账号的OpenID了。请求如下地址:
https://graph.qq.com/oauth2.0/me?access_token=${accessToken}
网站回调域 会收到如下响应:
callback( {"client_id":"appId","openid":"openId"} );
上面的响应中包含了 APP ID 和 OpenID,APP ID 可用来确认是否为合法的网站请求,OpenID 自然就是所登录QQ账号的 OpenID 了。
四、调用接口访问数据
有了第二步获取到的获取Access Token,和第三部获取到的 OpenID,就可以拿来访问QQ的接口,获取用户的相关信息了。
比如以下面的方式请求 get_user_info 接口,就能够获取到用户昵称、QQ头像等信息。
https://graph.qq.com/user/get_user_info?access_token=${accessToken}&oauth_consumer_key=${appId}&openid=${openId}
学习更多技能
请点击下方公众号