Django項目中使用qq第三方登錄

使用qq登錄的前提是已經在qq互聯官網創建網站應用並獲取到QQ互聯中網站應用的APP ID和APP KEY

1,建路由


如果你對python感興趣,我這有個學習Python基地,裏面有很多學習資料,感興趣的+Q羣:688244617

#     qq登錄
    path('loginQq/',qq.loginQq,name='loginQq/'),
    path('returns/',qq.returns,name='returns/'),

2,前端頁面寫qq登錄的鏈接,本文沒有用圖標,暫時使用a鏈接請求。

<a data-wow-delay=".5s" href="/blog/loginQq/"> »  QQ登錄</a>

3,在項目的應用下創建utils文件夾並創建function.py用於封裝函數,封裝的函數用於從返回數據中提取openid(騰訊公司數據庫裏面的用戶id)

封裝的函數內容如下;
在這裏插入圖片描述

import re

def parse_jsonp(jsonp_str):
    try:
        return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1)
    except:
        raise ValueError('無效數據!')

4,後臺代碼

from django.shortcuts import render,redirect,HttpResponse,HttpResponseRedirect
from blog.models import Member
from urllib import parse
from urllib import request as req
import re
import json
import random
from blog.utils import function
def loginQq(request):
    state = str(random.randrange(100000,999999)) # 定義一個隨機狀態碼,防止跨域僞造攻擊。
    request.session['state'] = state  # 將隨機狀態碼存入Session,用於授權信息返回時驗證。
    client_id = '101716344'  # QQ互聯中網站應用的APP ID。
    # 對回調地址進行編碼,用戶同意授權後將調用此鏈接。
    callback = parse.urlencode({'redirect_uri':'http://127.0.0.1:8000/blog/returns'})   #redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Fblog%2Freturns
    # 組織QQ第三方登錄鏈接
    login_url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&%s&state=%s'%(client_id,callback,state)
    return HttpResponseRedirect(login_url)  # 重定向到QQ第三方登錄授權頁面
def returns(request):
    if request.session['state'] == request.GET['state']:  # 驗證狀態碼,防止跨域僞造攻擊。
        code = request.GET['code']  # 獲取用戶授權碼
        client_id = '101716344'  # QQ互聯中網站應用的APP ID。
        client_secret = '7f42aaac69f866750078fbe1edd9d2a4'  # QQ互聯中網站應用的APP Key。
        callback = parse.urlencode({'redirect_uri': 'http://127.0.0.1:8000/blog/returns'})
        # 對回調地址進行編碼,用戶同意授權後將調用此鏈接。
        login_url = 'https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&code=%s&client_id=%s&client_secret=%s&%s' % (code, client_id, client_secret, callback)  # 組織獲取訪問令牌的鏈接
        # return HttpResponse(login_url)
        response = req.urlopen(login_url).read().decode()  # 打開獲取訪問令牌的鏈接   access_token:123456789&

        access_token = re.split('&', response)[0]  # 獲取訪問令牌  access_token:123456789

        res = req.urlopen('https://graph.qq.com/oauth2.0/me?' + access_token).read().decode()  # 打開獲取openid的鏈接

        openid = json.loads(function.parse_jsonp(res))['openid']  # 從返回數據中獲取openid  410225632333335556566

        userinfo = req.urlopen('https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s&%s' % (
            client_id, openid, access_token)).read().decode()  # 打開獲取用戶信息的鏈接
        # 打印查看獲取到的用戶信息
        print(userinfo)
        userinfo = json.loads(userinfo)  # 將返回的用戶信息數據(JSON格式)讀取爲字典。
        user = Member.objects.filter(member_qq_id=openid)  # 查詢是否已存在用戶
        if not user:  # 如果不存在用戶
            # 創建新用戶
            member_obj = Member.objects.create(member_qq_id=openid,member_nickname=userinfo['nickname'],member_name=userinfo['nickname'],member_photo = userinfo['figureurl_qq_1'])
            # user = Member()  # 創建新用戶
            # user.member_qq_id = openid  # 寫入用戶信息
            # user.member_nickname = userinfo['nickname']  # 寫入用戶信息
            # user.member_name = userinfo['nickname']  # 寫入用戶信息
            # # user.gender = userinfo['gender']  # 寫入用戶信息
            # user.member_photo = userinfo['figureurl_qq_1']  # 寫入用戶信息
            # user.save()  # 保存或更新用戶
            request.session['member_id'] = member_obj.member_id  # 將已登錄的用戶openid寫入Session
            request.session['member_name'] = userinfo['nickname']
        #  返回路徑至網站首頁
        return redirect('/blog/index/')
    else:
        return HttpResponse('授權失敗!')

本文是在本地測試項目中的qq登錄功能,所以qq互聯官網中的回調地址需要修改爲本地的地址,
5,啓動項目測試功能
在這裏插入圖片描述
在這裏插入圖片描述

6,查看數據庫會員表,會員信息已寫入。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章