您好,登錄后才能下訂單哦!
如何使用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)知識。
免責聲明:本站發(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)容。