今天搞好了博客搁置已久的登录功能,目前仅支持第三方登录,这样有效减少了恶意的批量注册,我先来说下第三方登录的原理:
这里以QQ为例
首先,在QQ互联注册开发者并申请自己的博客应用(网上教程大把,这里不再赘述)
开发者审核通过之后,首先在django的setting.py文件中配置QQ登录参数
# QQ登录参数配置
QQ_CLIENT_ID = '' # appid
QQ_CLIENT_SECRET = '' # appkey
QQ_REDIRECT_URI = 'https://xxxx.com/login' # 回调url
新建一个应用用于管理用户,新建urls.py并在总路由中include
在urls.py中写入申请开发者时自己填的回调地址以及登录、注册路由
在models.py中新建用户信息模型
class UserProfile(models.Model):
UID = models.AutoField(primary_key=True)
passwd = models.CharField('密码',max_length=50,default=12345678)
head_img = models.CharField('头像',max_length=200,null=True)
nickname = models.CharField('昵称', max_length=20)
email = models.CharField('邮箱', max_length=50,unique=True)
class Meta:
verbose_name = '用户表'
verbose_name_plural = verbose_name
def __str__(self):
return "{}".format(self.UID)
class OAuthRelationship(models.Model):
UID = models.ForeignKey(UserProfile,verbose_name='用户UID', on_delete=models.CASCADE)
openid = models.CharField(max_length=128,unique=True)
OAUTH_TYPE_CHOICES = (
('0', 'QQ'),
('1', 'WeChat'),
('2', 'weibo'),
('3', 'Github'),
)
oauth_type = models.IntegerField(default=0, choices=OAUTH_TYPE_CHOICES)
class Meta:
verbose_name = '认证类型'
verbose_name_plural = verbose_name
在views.py中我们开始写QQ登录的方法
在此之前我们需要在页面中放置QQ登录按钮,点击按钮后跳转扫码登录页面,扫码或者输入信息登陆成功后会返回给我们一个code,我们用code来获取用户openid
按照QQ官方文档,我们首先需要用返回的code来获取access_token
import requests
from urllib.parse import parse_qs
code = request.GET.get('code')
state = request.GET.get('state')
if state != settings.QQ_STATE:
raise Exception('state error')
params = {
'grant_type':'authorization_code',
'client_id':settings.QQ_APP_ID,
'client_secret':settings.QQ_SECRECT_KEY,
'code':code,
'redirect_uri':settings.QQ_REDIRECT_URI
}
# 获取Access_token
res = requests.get('https://graph.qq.com/oauth2.0/token',params=params).content.decode()
access_token = parse_qs(res)['access_token'][0]
获取到了access_token后,我们接着用这个access_token去获取openid
res = requests.get('https://graph.qq.com/oauth2.0/me?access_token={}'.format(access_token)).content.decode()[10:-4]# 通过切片来将结果转为字典形式
openid = json.loads(res)['openid'] # 取出openid
拿到openid后就是初始化一个对象,然后将数据存入就可以了
如果需要昵称、头像的话可以接着请求
res = requests.get('https://graph.qq.com/user/get_user_info?access_token={}&oauth_consumer_key={}&openid={}'.format(access_token, settings.QQ_APP_ID, openid)).json()
返回结果是json,可以直接用字典的方式拿到所需要的数据
其实说来也不难,就是自己需要注意一些逻辑,比如QQ登录成功后应该干什么,已经绑定过的QQ登录用户使用QQ登录时应该怎么做等等
最后修改于2020年4月6日 20:49
©允许规范转载
Django Python版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.yangyingqi.com/32.html