django-微信小程序登录
小程序登录逻辑
前端通过调用wx.login()获取code, 将code和用户基本信息发送到后端,后端通过request.get向微信服务器发送get请求获取用户openid和session_key,手动添加jwt-token,利用jwt自动校验用户是否登录
小程序前端触发login事件
<button class="confirm-btn" open-type="getUserInfo" bindgetuserinfo="login" wx:if="{{regFlag==false}}">授权登录</button>
js代码:login事件接收的参数 e.detail.userInfo保存了用户基本信息,调用wxlogin方法获取用户的code,发送到后端
login:function( e ){
var that = this;
if( !e.detail.userInfo ){
app.alert( { 'content':'登录失败,请再次点击~~' } );
return;
}
var data = e.detail.userInfo;
wx.login({
success:function( res ){
if( !res.code ){
app.alert( { 'content':'登录失败,请再次点击~~' } );
return;
}
data['code'] = res.code;
wx.request({
url:app.buildUrl( '/member/login' ),
header:app.getRequestHeader(),
method:'POST',
data:data,
success:function( res ){
if( res.data.code != 200 ){
app.alert( { 'content':res.data.msg } );
return;
}
app.setCache( "token",res.data.data.token );
that.goToIndex();
}
});
}
});
}
后端代码:
用户模型类继承自django自带的用户模型,新增三个用户信息字段
class User(AbstractUser):
USER_GENDER_CHOICES = (
(0, '女'),
(1, '男'),
)
sex = models.SmallIntegerField(choices=USER_GENDER_CHOICES, default=1, verbose_name="性别")
avatar = models.CharField(max_length=50, default="", null=True, blank=True, verbose_name="头像")
openid = models.CharField(max_length=64, db_index=True, verbose_name='openid') class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
类视图:发送请求获取用户的openid,用openid来查询是否用户已经存在,不存在创建信的用户,统一手动签发jwt_token返回
class WechatLoginView(APIView):
"""
微信登录逻辑
""" def post(self, request):
# 前端发送code到后端,后端发送网络请求到微信服务器换取openid
code = request.data.get('code')
if not code:
return Response({'message': '缺少code'}, status=status.HTTP_400_BAD_REQUEST) url = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code" \
.format(settings.APP_ID, settings.APP_KEY, code)
r = requests.get(url)
res = json.loads(r.text)
openid = res['openid'] if 'openid' in res else None
# session_key = res['session_key'] if 'session_key' in res else None
if not openid:
return Response({'message': '微信调用失败'}, status=status.HTTP_503) # 判断用户是否第一次登录
try:
user = User.objects.get(openid=openid)
except Exception:
# 微信用户第一次登陆,新建用户
username = request.data.get('nickname')
sex = request.data.get('sex')
avatar = request.data.get('avatar')
user = User.objects.create(username=username, sex=sex, avatar=avatar)
user.set_password(openid) # 手动签发jwt
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) resp_data = {
"user_id": user.id
"username": user.username,
"avatar": user.avatar,
"token": token,
} return Response(resp_data)
补充:jwt的配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
JWT_AUTH = {
# 指明token的有效期
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
}
django-微信小程序登录的更多相关文章
- 微信小程序登录对接Django后端实现JWT方式验证登录
先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...
- Django微信小程序后台开发教程
本文链接:https://blog.csdn.net/qq_43467898/article/details/83187698Django微信小程序后台开发教程1 申请小程序,创建hello worl ...
- 微信小程序登录方案
微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...
- 微信小程序登录,获取code,获取openid,获取session_key
微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...
- 基于Shiro,JWT实现微信小程序登录完整例子
小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...
- 微信小程序登录JAVA后台
代码地址如下:http://www.demodashi.com/demo/12736.html 登录流程时序登录流程时序 具体的登录说明查看 小程序官方API 项目的结构图: springboot项目 ...
- 全栈项目|小书架|微信小程序-登录及token鉴权
小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...
- Flask与微信小程序登录(后端)
开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...
- Taro -- 微信小程序登录
Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...
- Spring Security 整合 微信小程序登录的思路探讨
1. 前言 原本打算把Spring Security中OAuth 2.0的机制讲完后,用小程序登录来实战一下,发现小程序登录流程和Spring Security中OAuth 2.0登录的流程有点不一样 ...
随机推荐
- AnnotationTransactionAttributeSource is only available on Java 1.5 and higher
前言: 在eclipse中用到spring2.0的web项目,启动elipse自带的tomcat7,tomcat7报错如下: AnnotationTransactionAttributeSource ...
- 关注Yumiot公众号,了解最新的物联网资讯
Yumiot,专注于物联网行业,每天不定期推送最新的物联网行业新闻.详情请用微信搜索关注 yumiot .
- ajax请求, 前后端, 代码示例
[博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] http ...
- Linux下数据库的启动和关闭
[oracle@*** ~]$ su - oracle --切换oracle用户[oracle@*** ~]$ sqlplus /nologSQL>connect /as sysdbaSQL&g ...
- 使用kermit通过串口升级uboot
在开发板的启动选项中看到如下两行: 7: Load Boot Loader code then write to Flash via Serial. 9: Load Boot Loader code ...
- MySQL父子节点查询
MySQL父子结点递归查询 表结构: CREATE TABLE `agency` ( `id` ) NOT NULL COMMENT '编号', `name` ) NOT NULL COMMENT ' ...
- soapui 测试 带hear 验证的写法
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web=& ...
- .net 服务因为GC时遇到的问题和解决办法
1.问题: .net单一服务中,大量的请求访问后台服务,多线程处理请求,但每个线程都可能出现超时的现象.记录超时日志显示,超时可能在序列化时,Socket异步发送AsyncSend数据时,普通业务处理 ...
- Vue中通过v-for动态添加图片地址
由于组件化问题,webpake在打包以后,src目录下的assets里面存放的img图片,路径已经更换.很多入坑的前端程序员在使用的时候,可能专破头也弄不清地址是什么个情况: 这里在使用vue-cli ...
- 解决Caused by: java.lang.IllegalArgumentException: A universal match pattern ('/**') is defined before other patterns in the filter chain, causing them to be ignored. Please check the ordering in your
写项目时应用了SpringSecurity框架来进行登陆验证,之前单独的写简单的SpringSecrity的Demo时并没有报错,但是当和SpringMVC一起整合时却发生了报错 报错如下: Caus ...