django與小程序?qū)崿F(xiàn)登錄驗(yàn)證功能的示例代碼
之前用小程序做項(xiàng)目,因?yàn)楹笈_(tái)使用的java開發(fā),一切順利,但切換成django做RESTful API接口時(shí),在登陸注冊(cè)時(shí)一直出現(xiàn)問題,網(wǎng)上搜索,借助一個(gè)網(wǎng)友的回答,找到了一種可行的解決方案,現(xiàn)記錄如下。
具體流程
- 用戶點(diǎn)擊小程序頁面上的登錄授權(quán)認(rèn)證
- 通過微信自帶的認(rèn)證獲取code
- 調(diào)取登錄接口,將code傳入后臺(tái)
- 后臺(tái)拿到code調(diào)用微信接口獲取openid等用戶信息
- 后臺(tái)將openid作為用戶名,若存在則去校驗(yàn)用戶信息,否則以此用戶名創(chuàng)建新用戶,密碼隨機(jī)生成
- 將校驗(yàn)結(jié)果或者創(chuàng)建信息返回給微信小程序端
- 根據(jù)返回的信息完成用戶登錄校驗(yàn)
django的用戶權(quán)限認(rèn)證
django有一套自己的完善用戶模型,由于Django Auth自帶的User模型字段有限,我們需要對(duì)其進(jìn)行拓展(直接使用也可以)
nickname = models.CharField(verbose_name=u'昵稱',max_length=50, blank=True) user_avatar = models.ImageField(verbose_name=u'用戶頭像', upload_to='image/%Y/%m/%d', default=u'image/default.png', max_length=500) user_email = models.EmailField(verbose_name=u'用戶郵箱',max_length=254) user_phone = models.BigIntegerField(verbose_name=u'手機(jī)號(hào)', null=True,blank=True) user_birthday = models.DateField(verbose_name=u'出生日期', default = timezone.now) user_sex = models.CharField(verbose_name=u'性別',max_length=6,choices=(('male','男'),('female','女')),default='male') user_address = models.CharField(verbose_name=u'地址',max_length=550, blank=True,null=True) signature = models.CharField(verbose_name=u'個(gè)性簽名',max_length=550, blank=True,null=True)
用戶接口序列化
from rest_framework import serializers class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = "__all__"
登陸接口設(shè)計(jì)
class UserLogin(APIView): def post(self,request): params = request.data userName = get_openid(params.get('code')) userInfo = params.get('userinfo') try: user = User.objects.get(username = userName) except Exception as e: user = None if user: # 更新用戶信息 user = User.objects.get(username = userName) else: #注冊(cè)新用戶 user = User.objects.create_user(username=userName,password=random_str(10)) #手動(dòng)生成JWT # 手動(dòng)生成token驗(yàn)證 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) ret = {'code': '00000', 'msg': None,'data':{}} ret['msg'] = '授權(quán)成功' ret['data'] = { 'token': token, 'user_id': user.id, 'nickname': user.nickname } return JsonResponse(ret)
解析code獲取openid
class OpenidUtils(object): def __init__(self, jscode): self.url = "https://api.weixin.qq.com/sns/jscode2session" self.appid = APPID self.secret = SECRET self.jscode = jscode # 前端傳回的動(dòng)態(tài)jscode def get_openid(self): url = self.url + "?appid=" + self.appid + "&secret=" + self.secret + "&js_code=" + self.jscode + "&grant_type=authorization_code" r = requests.get(url) openid = r.json()['openid'] return openid
小程序的登陸驗(yàn)證
具體登錄流程可以查閱官方文檔。
function getWXUserInfo() { const login = promisify(wx.login); const getUserInfo = promisify(wx.getUserInfo); return new Promise(function (resolve, reject) { _wxLogin(); function _wxLogin() { login().then(function (res) { getUserInfo().then(function (r) { let userInfo = r; userInfo.code = res.code; try { wx.setStorageSync('userInfo', userInfo); } catch (e) { console.log(e) } if (userInfo && userInfo.code && userInfo.iv) { resolve(userInfo); } else { reject('wx login fail'); } }).catch(function (error) { reject(error); }); }).catch(function (error) { reject(error); }); } }); } //登錄接口驗(yàn)證 getWXUserInfo().then(function (data) { var result = { code: 0, data: {} }; var params = { 'code':data.code, 'userinfo':data.userInfo } wx.request({ url: '/api/login', data: params, dataType: 'json', method: 'POST', success: function (response) { // 返回成功 if (response.data && response.data.code == '00000') { try { var resData = { custNo: data.user_id, nickname: data.nickname }; result.code = 0; result.data = resData; resolve(result); } catch (e) { console.warn(result) // 登錄失敗 result.code = 2; resolve(result); } } else { // 獲取 customNum 失敗 console.warn(result) result.code = 1; result.data = 'get customNum fail'; resolve(result); } } }) }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
原理解析為什么pydantic可變對(duì)象沒有隨著修改而變化
這篇文章主要介紹了為什么pydantic可變對(duì)象沒有隨著修改而變化的原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Python中Numpy與TensorFlow版本兼容問題完美解決辦法
這篇文章主要給大家介紹了關(guān)于Python中Numpy與TensorFlow版本兼容問題的完美解決辦法,確保Python版本與TensorFlow版本兼容是首要任務(wù),因?yàn)椴患嫒莸慕M合可能導(dǎo)致導(dǎo)入錯(cuò)誤或其他運(yùn)行時(shí)問題,需要的朋友可以參考下2024-07-07Python制作數(shù)據(jù)預(yù)測(cè)集成工具(值得收藏)
這篇文章主要介紹了Python如何制作數(shù)據(jù)預(yù)測(cè)集成工具,幫助大家進(jìn)行大數(shù)據(jù)預(yù)測(cè),感興趣的朋友可以了解下2020-08-08詳解Python的整數(shù)是如何實(shí)現(xiàn)的
本文我們來聊一聊Python的整數(shù),我們知道Python的整數(shù)是不會(huì)溢出的,換句話說,它可以計(jì)算無窮大的數(shù),只要你的內(nèi)存足夠,它就能計(jì)算。但問題是,Python底層又是C實(shí)現(xiàn)的,那么它是怎么做到整數(shù)不溢出的呢?本文就來詳細(xì)說說2022-11-11python中l(wèi)ogging庫的使用總結(jié)
Python的logging模塊提供了通用的日志系統(tǒng),可以方便第三方模塊或者是應(yīng)用使用,下面這篇文章主要給大家介紹了關(guān)于python中l(wèi)ogging庫使用的一些知識(shí)總結(jié),文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10Python實(shí)現(xiàn)語音識(shí)別Whisper的使用示例
Whisper是由OpenAI基于Python開發(fā)的能夠識(shí)別多國語言的語音識(shí)別模型,本文主要介紹了Python實(shí)現(xiàn)語音識(shí)別Whisper的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12基于python解線性矩陣方程(numpy中的matrix類)
這篇文章主要介紹了基于python解線性矩陣方程(numpy中的matrix類),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10