溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Django實現(xiàn)微信公眾號用戶openid登錄認證

發(fā)布時間:2021-11-10 18:24:45 來源:億速云 閱讀:443 作者:柒染 欄目:大數(shù)據(jù)

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

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

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

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

我們擴展了用戶的模型,并使用這個模型來作為用戶認證的模型,需要在setting.py文件里指定認證的模型(website是django應用的名稱,非項目名稱):

AUTH_USER_MODEL = 'website.Users'

這樣,我們就能夠使用上面定義的Users模型來進行用戶的登錄和注冊操作了。

一個常見默認的Django登錄認證,使用的是authenticate,在此引用Django文檔中的敘述:

認證一個給定用戶名和密碼,請使用authenticate()
它以關(guān)鍵字參數(shù)形式接收憑證,對于默認的配置它是username
和password,如果密碼對于給定的用戶名有效它將返回一個User對象。
如果密碼無效,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對象,我們再使用login()方法,對返回的User對象進行登錄:

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

這樣就完成了一個最基本的Django用戶認證。

如果我們要用其他的方式進行登錄認證呢,比如電子郵箱、手機號、或是本文所說的重點:微信openid,那就需要自定義認證方式。

在Django中進行自定義認證很是方便,完成一個自定義的認證只需要三步:

1、編寫一個認證后端:

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

from .models import Users'''
    微信openid認證登錄
'''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中指定認證后端:

在底層,Django 維護一個“認證后臺”的列表。
當調(diào)用django.contrib.auth.authenticate() 時,Django 會嘗試所有的認證后臺進行認證。
如果第一個認證方法失敗,Django 將嘗試第二個,以此類推,直至試完所有的認證后臺。
使用的認證后臺通過AUTHENTICATION_BACKENDS 設置指定。

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

第一個認證后端是Django默認的認證方式,因為在Web端還需要使用,所以保留,第二個就是基于openid的認證后端。

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

同樣的使用authenticate()方法和login()方法,但是我們只傳入一個參數(shù)進去,就是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)

這樣,一個基于openid的認證就完成了。

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

關(guān)于如何使用Django實現(xiàn)微信公眾號用戶openid登錄認證問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI