django2.0+py3.0+实现QQ登陆自己的网站


发布时间:2019-02-15 13:08    作者: 晖哥哥   已过去:2 年,9 月   阅读总量:840 已被赞:0


为了方便快捷的登陆网站,我们可以使用QQ来登录自己的网站,这样使用体验更方便,更好。

实现过程:

第一步:先去QQ互联注册一个账号,提交各项材料,审核通过后,新建一个网站应用。

申请网站应用的时候,网站名字,类别等一定要和备案的信息一致,审核通过后可修改。回调地址也可以随便填,后面再修改,也可以先想好,所谓回调地址,就是连接你的网站后台处理QQ返回的各项信息的URL

注册成功后,我们可以拿到:

APP ID:101552***
APP Key:034bad5465076***********************

第二步:

新建一个app 来专项处理QQ登陆(非必要)

在这个APP下views.py:

from django.shortcuts import HttpResponseRedirect
import urllib
from django.contrib.auth.models import User
from django.contrib.auth import login
from django.shortcuts import redirect,reverse
import json
#点QQ登陆图标跳转到授权页面的处理视图
def qqlogin(req):
    APPID= 10155*** #QQ互联注册里给的ID
    params = {'client_id': APPID,
              'response_type': 'code',
              'redirect_uri': "http://www.hui2017.top/qq/qqcheck",#QQ互联里填的回调地址
              'scope': 'get_user_info',#QQ互联通过审核后给的获取API的方法
              'state': 1}
    #拼接成一条URL
    url = 'https://graph.qq.com/oauth2.0/authorize?%s' % urllib.parse.urlencode(params)
    #重定向到这个URL,发送过去后,QQ返回一个含有code的一个url
    return HttpResponseRedirect(url)

第三步:为这个视图做好URL连接

总路由:

path('qq/', include('qq_login.urls')),

分路由

path('qqlogin/', qqlogin, name='qqlogin'),

第四步:

在登陆页面,添加一个QQ登陆的图标,并做好路由映射

<span><td><a href="{% url 'qqlogin' %}"><img src="http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_4.png" alt="Connect_logo_1.png">
</a></td></span>

第五步:点击测试,看看能否跳到QQ授权页面

成功后,下一步:

第六步:

写一个获取用户open_id的方法

#处理OPEN_ID的方法
def get_open_id(access_token):
    """获取QQ的OpenID"""
    params = {'access_token': access_token}
    url = 'https://graph.qq.com/oauth2.0/me?%s' % urllib.parse.urlencode(params)
    response = urllib.request.urlopen(url).read()
    response = str(response)
    #b'callback( {"client_id":"101552***","openid":"391C5B6ED5A99BB3F558C*****447"} );\n'
    response = response.split(",")[1].split("}")[0].split(":")[1]
    return response

第7步:

新建接收处理qq回调信息的视图

#建立check回调获取处理视图
def qqcheck(request):
    #获取回调的code=后的值
    getcode = request.GET.get('code',None)
    params = {'grant_type': 'authorization_code',
              'client_id': 10155*****,#QQ互联注册里给的ID
              'client_secret': "034bad5465076d98b6613*******1",#QQ互联给的KEY
              'code': getcode,#URL上获取的内容
              'redirect_uri': "http://www.hui2017.top/qq/qqcheck"} #回调地址
    url = 'https://graph.qq.com/oauth2.0/token?%s' % urllib.parse.urlencode(params)
    response = urllib.request.urlopen(url).read()
    #获取ACC_token处理一下
    acc_token =str(response).split("&")[0].split("=")[1]
    #传给get_open_id函数,去处理,获取Opend_id
    open_id = get_open_id(acc_token)
    open_id = open_id[1:]
    open_id = open_id[:-1]

第7.2步:为这个视图写个路由

path('qqcheck/', qqcheck, name='qqcheck'),

第8步:在第7步这个视图的上面,写一个获取用户回调信息的方法

#获取用户信息的处理函数
def get_qq_info(access_token,client_id,openid):
    """获取QQ用户的资料信息"""
    params = {'access_token': access_token,
              'oauth_consumer_key': client_id,
              'openid': openid}
    url = 'https://graph.qq.com/user/get_user_info?%s' % urllib.parse.urlencode(params)

    response = urllib.request.urlopen(url).read()
    return response

第9步:在第7步的函数里,接着写:

def qqcheck(request):
    #获取回调的code=后的值
    getcode = request.GET.get('code',None)
    params = {'grant_type': 'authorization_code',
              'client_id': 101552096,#QQ互联注册里给的ID
              'client_secret': "034bad5465076d98b661359a7481bc31",#QQ互联给的KEY
              'code': getcode,#URL上获取的内容
              'redirect_uri': "http://www.hui2017.top/qq/qqcheck"} #回调地址
    url = 'https://graph.qq.com/oauth2.0/token?%s' % urllib.parse.urlencode(params)
    response = urllib.request.urlopen(url).read()
    #获取ACC-token处理一下
    acc_token =str(response).split("&")[0].split("=")[1]
    #传给get_open_id函数,去处理,获取Opend_id
    open_id = get_open_id(acc_token)
    open_id = open_id[1:]
    open_id = open_id[:-1]
    #处理好后,交给用户表查询,是否已经存在,
    get_user_openid = User.objects.filter(username=open_id).exists()
    if get_user_openid:
        user = User.objects.get(username=open_id)
    else:
        #通过get_qq_info方法,获取用户信息 101552***为自己的APPID
        user_xinxi = get_qq_info(acc_token, 101552***, open_id)
        user_xinxi_name = json.loads(user_xinxi)["nickname"]
        user = User()
        user.last_name = user_xinxi_name
        user.set_password("222222222wwwewewfsf11sdfsdfsf123123") #随便给点密码,反正不需要用户自己来登录。
        #这里可以自己建表优化。
        user.username = open_id
        user.save()
    login(request, user)
    return redirect(reverse('index'))

 

附:

 

user_xinxi * 返回结果如下:
     * {
     *     "ret": 0,
     *     "msg": "",
     *     "is_lost": 0,
     *     "nickname": "小吞",
     *     "gender": "女",
     *     "province": "广东",
     *     "city": "广州",
     *     "year": "1993",
     *     "figureurl": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/30",
     *     "figureurl_1": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/50",
     *     "figureurl_2": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/100",
     *     "figureurl_qq_1": "http://q.qlogo.cn/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/40",
     *     "figureurl_qq_2": "http://q.qlogo.cn/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/100",
     *     "is_yellow_vip": "0",
     *     "vip": "0",
     *     "yellow_vip_level": "0",
     *     "level": "0",
     *     "is_yellow_year_vip": "0"
     * }

点赞

0




登陆后方可评论