django与小程序实现登录验证功能的示例代码
作者:叶袖清风 发布时间:2023-08-04 01:06:58
标签:django,小程序,登录验证
之前用小程序做项目,因为后台使用的java开发,一切顺利,但切换成django做RESTful API接口时,在登陆注册时一直出现问题,网上搜索,借助一个网友的回答,找到了一种可行的解决方案,现记录如下。
具体流程
用户点击小程序页面上的登录授权认证
通过微信自带的认证获取code
调取登录接口,将code传入后台
后台拿到code调用微信接口获取openid等用户信息
后台将openid作为用户名,若存在则去校验用户信息,否则以此用户名创建新用户,密码随机生成
将校验结果或者创建信息返回给微信小程序端
根据返回的信息完成用户登录校验
django的用户权限认证
django有一套自己的完善用户模型,由于Django Auth自带的User模型字段有限,我们需要对其进行拓展(直接使用也可以)
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'手机号', 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'个性签名',max_length=550, blank=True,null=True)
用户接口序列化
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
登陆接口设计
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:
#注册新用户
user = User.objects.create_user(username=userName,password=random_str(10))
#手动生成JWT
# 手动生成token验证
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'] = '授权成功'
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 # 前端传回的动态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
小程序的登陆验证
具体登录流程可以查阅官方文档。
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);
});
}
});
}
//登录接口验证
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);
}
}
})
}
来源:https://juejin.im/post/5c6b64bde51d457fa31e6a30
0
投稿
猜你喜欢
- 如下所示:加入代码:pd.set_option('display.width', 5000)补充知识:Python 实现不换
- 前言defer语句被用于预定对一个函数的调用。我们把这类被defer语句调用的函数称为延迟函数。而defer 延迟语句在其他编程语言里好像没
- 很多时候,设计师们都会通过各种渠道去了解用户的需求,然而从这些渠道反馈回来的信息大部分只是用户的期望并不是真正的用户需求,但是很多时候这些期
- 一、绘图命令操纵海龟绘图有很多命令,可以划分为三种:画笔运动命令、画笔控制命令、全局控制命令1、画笔运动命令命令说明turtle.forwa
- Django2.1 + Python3.6 + nginx + uwsgi 部署到Ubuntu18.04材料准备准备一个Django项目准备
- 分页的首页<meta http-equiv="Content-Type" content="text/h
- 一、介绍QQ空间相册的个性化利器,能对照片进行效果的优化、文字编辑等等。从设计上使用了创新的手法,尽量减少用户的思考。其中,通过界面的特殊表
- Python批量识别图片指定区域文字内容,供大家参考,具体内容如下简介对于一张图片,需求识别指定区域的内容1.截取原始图上的指定图片当做模板
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S
- 关于阻塞主线程join的错误用法Thread.join() 作用为阻塞主线程,即在子线程未返回的时候,主线程等待其返回然后再继续执行.joi
- 1、tensorflow(不定长)文本序列读取与解析tensorflow读取csv时需要指定各列的数据类型。但是对于RNN这种接受序列输入的
- ----------记录一下这两天做的一个小demo功能是要实现一个从前端传给后端一张图片,在后端完成目标检测后,传给前端,前端接收后并展示
- 前言随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付、银行身份验证、手机人脸解锁等等。识别废话少说,这里我们使用 ope
- 0、什么时候会用到virtualenv?假设系统中的两个应用,其中A应用对库LibFoo的版本要求为1,而B应用对同一个库LibFoo的版本
- 网页给人最直观的感受就是它的页面框架与构造,就像一座大楼的主体框架与形态,你可能记不起东方明珠塔和艾菲尔铁塔是用什么颜色或什么材料涂的外墙,
- 本文实例讲述了js+php实现静态页面实时调用用户登陆状态的方法。分享给大家供大家参考。具体分析如下:在程序开发中,经常会把页面做成html
- 这个例子可作为一个模式,在你需要的时候套用。<!DOCTYPE HTML PUBLIC &q
- 如何做一个可以让人家申请使用的计数器? 好了,我们来做一个与页面分离的计数器,是文本型的啦。这也很简单,
- 01、介绍在编程语言中,字符串是一种重要的数据结构。在 Golang 语言中,因为字符串只能被访问,不能被修改,所以,如果我们在 Golan
- 大家做网站,特别是自己写的代码,常常担心被一些黑客入侵服务器,从而导致网站代码被盗,给自己带来一些损失。那么我们怎么样做,就算黑客盗了你的代