QQ登录开发文档
- QQ互联开发者申请步骤
若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现。
相关链接:
http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%85
- QQ互联开发者申请步骤
成为QQ互联开发者后,还需创建应用,即获取本项目对应与QQ互联的应用ID
相关连接:http://wiki.connect.qq.com/__trashed-2
- 网站对接QQ登录步骤
QQ互联提供有开发文档,帮助开发者实现QQ登录。
相关链接
http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0
QQ登录流程分析
定义QQ登录模型类
- 定义模型基类
因为在很多应用中都可能用到模型基类, 所以对模型基类进行封装, 其他的模型类继承自模型基类,
在utils.py文件中创建模型类的基类
用户增加数据新建时间和更新时间
from django.db import models
class BaseModel(models.Model):
"""为模型类补充字段"""
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
abstract = True # 说明是抽象模型类, 用于继承使用,数据库迁移时不会创建BaseModel的表
- 定义QQ登录模型类
创建新的应用
oauth
, 用来实现QQ第三方认证登录
# oauth
url('^', include('oauth.urls')),
在oauth/models.py中定义QQ身份(openid)与用户模型类User的关联关系
from django.db import models
from meiduo_mall.utils.models import BaseModel
class OAuthQQUser(BaseModel):
"""QQ登录用户数据"""
user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name='用户')
openid = models.CharField(max_length=64, verbose_name='openid', db_index=True)
class Meta:
db_table = 'tb_oauth_qq'
verbose_name = 'QQ登录用户数据'
verbose_name_plural = verbose_name
- 迁移QQ登录模型
$ python manage.py makemigrations
$ python manage.py migrate
QQLoginTool类的封装
from django.conf import settings
from urllib.parse import urlencode, parse_qs
import json
import requests
class OAuthQQ(object):
"""
QQ认证辅助工具类
"""
def __init__(self, client_id=None, client_secret=None, redirect_uri=None, state=None):
self.client_id = client_id
self.client_secret = client_secret
self.redirect_uri = redirect_uri
self.state = state # 用于保存登录成功后的跳转页面路径
def get_qq_url(self):
# QQ登录url参数组建
data_dict = {
'response_type': 'code',
'client_id': self.client_id,
'redirect_uri': self.redirect_uri,
'state': self.state
}
# 构建url
qq_url = 'https://graph.qq.com/oauth2.0/authorize?' + urlencode(data_dict)
return qq_url
# 获取access_token值
def get_access_token(self, code):
# 构建参数数据
data_dict =