如何使用Django實(shí)現(xiàn)微信公眾號(hào)用戶openid登錄認(rèn)證

如何使用Django實(shí)現(xiàn)微信公眾號(hào)用戶openid登錄認(rèn)證,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供頭屯河網(wǎng)站建設(shè)、頭屯河做網(wǎng)站、頭屯河網(wǎng)站設(shè)計(jì)、頭屯河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、頭屯河企業(yè)網(wǎng)站模板建站服務(wù),10年頭屯河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

最近在用Django做一個(gè)小項(xiàng)目,需要將微信的用戶與網(wǎng)站的用戶進(jìn)行關(guān)聯(lián),由于是微信的訂閱號(hào),沒(méi)有oauth網(wǎng)頁(yè)授權(quán)的權(quán)限,只能退而求其次,在響應(yīng)中獲取用戶的openid,來(lái)唯一的標(biāo)識(shí)用戶。

Django中用戶的模型繼承和擴(kuò)展于AbstractUser,在用戶模型中添加openid字段(models.py):

class Users(AbstractUser):
    openid = models.CharField(max_length=100,blank=True,null=True,verbose_name="openid",unique=True)

我們擴(kuò)展了用戶的模型,并使用這個(gè)模型來(lái)作為用戶認(rèn)證的模型,需要在setting.py文件里指定認(rèn)證的模型(website是django應(yīng)用的名稱(chēng),非項(xiàng)目名稱(chēng)):

AUTH_USER_MODEL = 'website.Users'

這樣,我們就能夠使用上面定義的Users模型來(lái)進(jìn)行用戶的登錄和注冊(cè)操作了。

一個(gè)常見(jiàn)默認(rèn)的Django登錄認(rèn)證,使用的是authenticate,在此引用Django文檔中的敘述:

認(rèn)證一個(gè)給定用戶名和密碼,請(qǐng)使用authenticate()
它以關(guān)鍵字參數(shù)形式接收憑證,對(duì)于默認(rèn)的配置它是username
和password,如果密碼對(duì)于給定的用戶名有效它將返回一個(gè)User對(duì)象。
如果密碼無(wú)效,authenticate()返回None。
例子:
from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None:  if user.is_active:    print("User is valid, active and authenticated") else:  print("The password is valid, but the account has been disabled!") else:  print("The username and password were incorrect.")

如果authenticate返回正確的User對(duì)象,我們?cè)偈褂胠ogin()方法,對(duì)返回的User對(duì)象進(jìn)行登錄:

from django.contrib.auth import login
login(request,user)

這樣就完成了一個(gè)最基本的Django用戶認(rèn)證。

如果我們要用其他的方式進(jìn)行登錄認(rèn)證呢,比如電子郵箱、手機(jī)號(hào)、或是本文所說(shuō)的重點(diǎn):微信openid,那就需要自定義認(rèn)證方式。

在Django中進(jìn)行自定義認(rèn)證很是方便,完成一個(gè)自定義的認(rèn)證只需要三步:

1、編寫(xiě)一個(gè)認(rèn)證后端:

一個(gè)認(rèn)證后端是個(gè)實(shí)現(xiàn)兩個(gè)方法的類(lèi): get_user(user_id)和authenticate(**credentials)
在此,我們新建一個(gè)py文件wechatAuth.py來(lái)寫(xiě)openid的認(rèn)證后端:

from .models import Users'''
    微信openid認(rèn)證登錄
'''class WechatOpenidAuth(object):
    def get_user(self,id_):
        try:            
           return Users.objects.get(pk=id_)        
       except Users.DoesNotExist:            
           return None     def authenticate(self,openid=None):         try:             user = Users.objects.get(openid=openid)            
           if user is not None:                
               return user            
           else:
               return None         except Users.DoesNotExist:            
               return None

2、在配置文件setting.py中指定認(rèn)證后端:

在底層,Django 維護(hù)一個(gè)“認(rèn)證后臺(tái)”的列表。
當(dāng)調(diào)用django.contrib.auth.authenticate() 時(shí),Django 會(huì)嘗試所有的認(rèn)證后臺(tái)進(jìn)行認(rèn)證。
如果第一個(gè)認(rèn)證方法失敗,Django 將嘗試第二個(gè),以此類(lèi)推,直至試完所有的認(rèn)證后臺(tái)。
使用的認(rèn)證后臺(tái)通過(guò)AUTHENTICATION_BACKENDS 設(shè)置指定。

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 
'website.wechat_auth.WechatOpenidAuth',)

第一個(gè)認(rèn)證后端是Django默認(rèn)的認(rèn)證方式,因?yàn)樵赪eb端還需要使用,所以保留,第二個(gè)就是基于openid的認(rèn)證后端。

3、使用自定義的認(rèn)證后端處理登錄授權(quán):

同樣的使用authenticate()方法和login()方法,但是我們只傳入一個(gè)參數(shù)進(jìn)去,就是openid

from django.contrib.auth import login,authenticatedef auth(request,openid):
  try:
        auth =authenticate(openid=openid)
        login(request,auth)
        print("登錄成功",auth)  
 except Exception as e:         print(e)

這樣,一個(gè)基于openid的認(rèn)證就完成了。

在微信的訂閱號(hào)中,我們可以利用click事件返回一個(gè)文本消息或圖文消息,在其鏈接之中帶上openid的參數(shù)。這樣,當(dāng)用戶點(diǎn)擊鏈接,就可以靜默地完成用戶的登錄了。

關(guān)于如何使用Django實(shí)現(xiàn)微信公眾號(hào)用戶openid登錄認(rèn)證問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

分享文章:如何使用Django實(shí)現(xiàn)微信公眾號(hào)用戶openid登錄認(rèn)證
分享地址:http://bm7419.com/article22/jdeejc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)品牌網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名