The secret to happiness is freedom. And the secret to freedom is courage.
幸福的秘诀就是自由。 自由的秘诀就是勇气。
1.客户端请求获取QQ登录网址。
2.我们自己服务器返回QQ登录网址和参数给客户端。
3.客户端请求QQ登录网址。
4.QQ服务器最终返回QQ授权登录页面。
5.用户授权登录QQ。
6.QQ服务器响应时让客户端重定向访问callback回调网址,并携带code和state参数。
7.浏览访问callback回调网址。客户端还向我们自己的服务器发起一个页面请求,获取QQ登录用户openid并处理,传递code。
8.我们自己的服务器凭code请求QQ服务器获取access_token。
9.qq服务器返回access_token。
10.我们自己的服务器凭access_token请求访问QQ服务器获取openid。
11.QQ服务器返回openid。
12.我们的服务器根据openid判断是否绑定过本网站用户(查一下我们数据库中的表)。
13.如果绑定过,我们的服务器直接签发jwt token并返回给客户端。
14.如果未绑定过,我们自己的服务器将openid加密并返回给客户端。
15.客户端请求绑定QQ登录用户。
16.我们自己的服务器保存绑定的数据。
17.我们自己的服务器签发jwt token并返回给客户端。
根据上述的流程我们进行分析,我们自己的服务器需要实现三个接口:
API: GET /oauth/qq/authorization/?next=<登录之后访问页面地址>
参数:
通过查询字符串传递登录之后访问页面地址
响应:
{
"qq_login_url":"QQ登录网址"
}
业务逻辑:
a.获取next
b.组织QQ登录网址和参数
c.返回QQ登录的网址。
API: GET /oauth/qq/user/?code=<code>
参数:
通过查询字符串传递code
响应:
1)如果openid已经绑定过网站用户,直接生产jwt token并返回
{
"user_id":"用户的id",
"username":"用户名",
"token":"jwt token"
}
2)如果openid还未绑定过网站用户,将openid加密并返回
{
"access_token":"加密的openid内容"
}
业务逻辑:
a.获取code并校验(code必须要传递)
b.获取QQ登录用户的openid
b.1通过code请求QQ服务器获取access_token
b.2通过access_token请求QQ服务器获取openid
c.根据openid判断是否绑定过本网站的用户
c.1如果已经绑定,直接生产jwt token并返回
c.2如果未绑定,将openid加密并返回
API: POST /oauth/qq/user/
参数:
{
"mobile":"手机号",
"password":"密码",
"sms_code":"短信验证码",
"access_token":"加密openid"
}
响应
{
"id":"用户id",
"username":"用户名",
"token":"jwt token"
}
业务逻辑:
a.获取参数并进行校验(参数完整性,手机号格式,短信验证码是否正确access_token是否有效)
b.保存QQ绑定的数据
c.返回应答,绑定成功
在后端接口中,我们需要向QQ服务器发送请求,查询用户的QQ信息,Python提供了标准模块urllib可以帮助我们发送http请求。
itsdangerous模块的参考资料连接http://itsdangerous.readthedocs.io/en/latest/
pip install itsdangerous
TimedJSONWebSignatureSerializer
的使用使用TimedJSONWebSignatureSerializer可以生成带有有效期的token
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings
# serializer = Serializer(秘钥, 有效期秒)
serializer = Serializer(settings.SECRET_KEY, 300)
# serializer.dumps(数据), 返回bytes类型
token = serializer.dumps({'mobile': '18512345678'})
token = token.decode()
# 检验token
# 验证失败,会抛出itsdangerous.BadData异常
serializer = Serializer(settings.SECRET_KEY, 300)
try:
data = serializer.loads(token)
except BadData:
return None
APPI: GET /user/
参数:
通过请求头传递jwt token
响应:
{
"id":"用户ID",
"username":"用户名",
"mobile":"手机号",
"email":"邮箱",
"email_active":"邮箱验证"
}
业务逻辑:
a.设置只有经过认证的用户才可以进入
b.获取登录用户
c.将登录用户对象序列化并返回
a.如果用户已经认证, request.user
就是登录用户对象。
b.如果用户未认证, request.user
就是一个匿名用户类的对象。
1.自定义Django认证系统用户模型类
2.跨域请求
3.celery异步任务发短信
4.JWT认证机制
5.自定义jwt扩展登录视图响应数据函数
6.自定义Django认证后端类(登录账户支持用户名和手机号)
7.QQ登录开发流程(流程图,可以自己画一下)
优质文章推荐:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有