怎么在Django項目中實現(xiàn)第三方登錄功能?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、陳巴爾虎網(wǎng)站維護、網(wǎng)站推廣。1,建路由
# qq登錄 path('loginQq/',qq.loginQq,name='loginQq/'), path('returns/',qq.returns,name='returns/'),
2,前端頁面寫qq登錄的鏈接,本文沒有用圖標,暫時使用a鏈接請求。
<a data-wow-delay=".5s" href="/blog/loginQq/" rel="external nofollow" > » QQ登錄</a>
3,在項目的應用下創(chuàng)建utils文件夾并創(chuàng)建function.py用于封裝函數(shù),封裝的函數(shù)用于從返回數(shù)據(jù)中提取openid(騰訊公司數(shù)據(jù)庫里面的用戶id)
封裝的函數(shù)內(nèi)容如下;
import re def parse_jsonp(jsonp_str): try: return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1) except: raise ValueError('無效數(shù)據(jù)!')
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)) # 定義一個隨機狀態(tài)碼,防止跨域偽造攻擊。 request.session['state'] = state # 將隨機狀態(tài)碼存入Session,用于授權(quán)信息返回時驗證。 client_id = '101716344' # QQ互聯(lián)中網(wǎng)站應用的APP ID。 # 對回調(diào)地址進行編碼,用戶同意授權(quán)后將調(diào)用此鏈接。 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/oauth3.0/authorize?response_type=code&client_id=%s&%s&state=%s'%(client_id,callback,state) return HttpResponseRedirect(login_url) # 重定向到QQ第三方登錄授權(quán)頁面 def returns(request): if request.session['state'] == request.GET['state']: # 驗證狀態(tài)碼,防止跨域偽造攻擊。 code = request.GET['code'] # 獲取用戶授權(quán)碼 client_id = '101716344' # QQ互聯(lián)中網(wǎng)站應用的APP ID。 client_secret = '7f42aaac69f866750078fbe1edd9d2a4' # QQ互聯(lián)中網(wǎng)站應用的APP Key。 callback = parse.urlencode({'redirect_uri': 'http://127.0.0.1:8000/blog/returns'}) # 對回調(diào)地址進行編碼,用戶同意授權(quán)后將調(diào)用此鏈接。 login_url = 'https://graph.qq.com/oauth3.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/oauth3.0/me?' + access_token).read().decode() # 打開獲取openid的鏈接 openid = json.loads(function.parse_jsonp(res))['openid'] # 從返回數(shù)據(jù)中獲取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) # 將返回的用戶信息數(shù)據(jù)(JSON格式)讀取為字典。 user = Member.objects.filter(member_qq_id=openid) # 查詢是否已存在用戶 if not user: # 如果不存在用戶 # 創(chuàng)建新用戶 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() # 創(chuàng)建新用戶 # 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'] # 返回路徑至網(wǎng)站首頁 return redirect('/blog/index/') else: return HttpResponse('授權(quán)失敗!')
本文是在本地測試項目中的qq登錄功能,所以qq互聯(lián)官網(wǎng)中的回調(diào)地址需要修改為本地的地址,
5,啟動項目測試功能
6,查看數(shù)據(jù)庫會員表,會員信息已寫入。
看完上述內(nèi)容,你們掌握怎么在Django項目中實現(xiàn)第三方登錄功能的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁標題:怎么在Django項目中實現(xiàn)第三方登錄功能-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://vcdvsql.cn/article40/csiheo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制網(wǎng)站、網(wǎng)站營銷、Google、外貿(mào)建站、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容