⼩程序session_key失效解决⽅案、后台解密个⼈数据信息
⽬录
⼀、登录会话密钥 session_key 有效性
开发者如果遇到因为 session_key 不正确⽽校验签名失败或解密失败,请关注下⾯⼏个与 session_key 有关的注意事项。
1. 调⽤时,⽤户的 session_key 可能会被更新⽽致使旧 session_key 失效(刷新机制存在最短周期,如果同⼀个⽤户短时间内多次调⽤
,并⾮每次调⽤都导致 session_key 刷新)。开发者应该在明确需要重新登录时才调⽤,及时通过接⼝更新服务器存储的
session_key。
2. 不会把 session_key 的有效期告知开发者。我们会根据⽤户使⽤⼩程序的⾏为对 session_key 进⾏续期。⽤户越频繁使⽤⼩程
序,session_key 有效期越长。
3. 开发者在 session_key 失效时,可以通过重新执⾏登录流程获取有效的 session_key。使⽤接⼝可以校验 session_key 是否有效,从
⽽避免⼩程序反复执⾏登录流程。
4. 当开发者在实现⾃定义登录态时,可以考虑以 session_key 有效期作为⾃⾝登录态有效期,也可以实现⾃定义的时效性策略。⼆、解决登录session_key 的问题
通过wx.checkSession判断是否过期。
第⼀步:在⽣命周期中onLaunch调⽤⼀次写的登录⽅法
第⼆步:在其他地⽅通过wx.checkSession判断是否过期,如果过期再次调⽤登录⽅法,更新session_key
案例:解决session_key 过期问题,发送个⼈信息后台解密
# app.js中:
//app.js
App({
/*
当⼩程序初始话完成,会触发onlaunch(全局只触发⼀次)
*/
onLaunch: function () {
// 登录
<_login()
},
my_login:function(){
let that = thissession数据错误是什么意思
wx.login({
success: res => {
// 发送 de 到后台换取 openId, sessionKey, unionId
console.de)
url: that.globalData.baseurl + "login/",
data: { "code": de },
method: "POST",
success(e) {
wx.setStorageSync('token', e.ken)
}
})
}
})
},
globalData: {
userInfo: null,
baseurl:"127.0.0.1:8000/"
}
})
# 页⾯js中:
// 先拿到app全局对象
const app = getApp()
user1:function (e) {
success(res) {
if (res.authSetting['scope.userInfo']) {
success: (res) => {
console.log("res",res) //这个res就是⽤户的信息
// 将数据发送后端
// 发送iv,encryptedData
url: app.globalData.baseurl + "getinfo/",
data:{
iv:res.iv,
encryptedData: ptedData,
StorageSync("token")
},
method:"POST",
success:(e) =>{
console.log('后台返回的数据',e)
}
})
},
})
// 判断是否过期
wx.checkSession({
success() {
//session_key 未过期,并且在本⽣命周期⼀直有效
},
fail() {
// session_key 已经失效,需要重新执⾏登录流程
<_login() // 重新登录,更新session_key
success: (res) => {
console.log("res啦啦啦", res) //这个res就是⽤户的信息
// 将数据发送后端
// 发送iv,encryptedData
url: 'url',
})
},
})
}
})
}
}
})
}
后端解密信息,存⼊数据库
# 登录:略
# urls.py
path('getinfo/', user.Info.as_view()),
# user.py
ache import cache
dels import Wxuser
from api.wx import WXBizDataCrypt
_ser import wx_user_ser
from sponse import Response
class Info(APIView):
def post(self, request):
param = request.data
if param['iv'] ("token") ("encryptedData"): iv = param['iv']
encryptedData = ("encryptedData")
session_key_openid = (("token"))
if session_key_openid:
sessionKey, openid = session_key_openid.split("&")
# 解密
user_info = _info(sessionKey, encryptedData, iv) print('user_info', user_info)
save_data = {
"name": user_info['nickName'],
"avatar": user_info['avatarUrl'],
"language": user_info['language'],
"province": user_info['province'],
"city": user_info['city'],
"country": user_info['country'],
}
# 把⽤户信息存⼊数据库
Wxuser.objects.filter(openid=openid).update(**save_data)
# 测试:把童虎信息返回给前台
user = Wxuser.objects.filter(openid=openid).first()
user = wx_user_ser(instance=user, many=False).data
return Response({
"status": 0,
"msg": "ok",
"data": user
})
else:
return Response({"code": 2, "msg": "⽆效的token"})
else:
return Response({"code": 1, "msg": "缺少参数"})
# 检测对字典排序
# WXBizDataCrypt⽂件,下载的解密,然后⼆次封装的
import base64
import json
from Crypto.Cipher import AES
from api.wx import settings
class WXBizDataCrypt:
def __init__(self, appId, sessionKey):
self.appId = appId
self.sessionKey = sessionKey
def decrypt(self, encryptedData, iv):
# base64 decode
sessionKey = base64.b64decode(self.sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv)
cipher = w(sessionKey, AES.MODE_CBC, iv)
decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))
if decrypted['watermark']['appid'] != self.appId:
raise Exception('Invalid Buffer')
return decrypted
def _unpad(self, s):
return s[:-ord(s[len(s)-1:])]
@classmethod
def get_info(cls,sessionKey,encryptedData,iv):
# appId = settings.AppId
# sessionKey = sessionKey
# encryptedData = encryptedData
# iv = iv
#
# # 实例化这个类 WXBizDataCrypt
# pc = cls(appId, sessionKey)
# return pc.decrypt(encryptedData, iv)
# 简化为:
return cls(settings.AppId, sessionKey).decrypt(encryptedData, iv)
mysql数据库存表情设置
2.配置:默认是utf8,3个字节。表情是4个字节,需要设置:'OPTIONS': {'charset': 'utf8mb4'}, import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.sql',
'NAME': 'python13',
'USER': 'root',
'PASSWORD': '123',
'HOST': 'localhost',
'PORT': 3306,
'OPTIONS': {'charset': 'utf8mb4'},
}
}
三、后端,如何解析wx.getUserInfor中的⽤户信息。
1 我们⽤encryptedData和iv,进⾏解密,必须要⽤到session_key,所以⽤必须是登⼊状态。
2 但是session_key是有有效期。⽽且session_key的有效期,不是⼀个固定值,他是通过⽤户⾏为来决定,session_key的有效期时间。
3 但是我们可以通过wx.checkSession来判断有没有过期。
4 保证session_key没有过期的情况下。我们将iv,encryptedData,token(登⼊凭证)发送到后端.
5 后端使⽤官⽅提供的sdk,进⾏解密。
6 解密成功以后保存到数据,数据库的字符集⼀定要是utf8mb4,才能保存表情包
如官⽅的sdk没有Crypto包⽤下⾯的⽅法解决:
pip install pycryptodome
⽤户信息官⽅⽂档
数据加密官⽅⽂档
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论