Django网站实现第三方QQ登录

2020年4月6日 20:49 阅读 2.16k 评论 0

今天搞好了博客搁置已久的登录功能,目前仅支持第三方登录,这样有效减少了恶意的批量注册,我先来说下第三方登录的原理:

这里以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
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/32.html

Django Python
微信
支付宝
登录后即可进行评论/回复