Django实现微信小程序的登录验证功能并维护登录态实现微信小程序的登录验证功能并维护登录态
这次自己做了一个小程序来玩,在登录方面一直有些模糊,网上看了很多文档后,得出以下一种解决方案。
环境说明:环境说明:
1、小程序只需要拿到openid,其他信息不存储。
2、Django自带的User类不适合。
具体操作流程:具体操作流程:
1、用户点进小程序,就调用wx.login()获取临时登录凭证code, wx.login()用户是无感知的,
2、通过wx.request()将code传到开发者服务器的后台程序,
3、后台拿到code之后,调用微信提供的接口,获取openid和session_key,
4、后台自定义User表,将openid作为用户名,不设置用户密码,如果用户不存在,则创建新用户,接着根据openid和
session_key生成新的自定义登录态3rd_session(这里使用skey表示)返回给小程序,
5、后台将skey存入缓存中(Redis),设置为2小时过期,
6、小程序接收到skey,说明登录成功,将skey保存到本地Storage中,下次请求时,在请求头中携带skey,
7、后台接收到请求,从请求头中拿到skey,判断缓存中是否还有此skey,如果有,说明还在登录态,允许执行请求相关操
作,如果没有,说明需要重新登录,给小程序返回401.
第三方库: Django、Djando rest framework、Django-redis
用户信息用户信息
自定义User类
models.py
from django.db import models
from django.utils import timezone
class User(models.Model):
openid = models.CharField(max_length=50, unique=True)
created_date = models.DateTimeField(auto_now_add=True)
User接口序列化
serializers.py
from rest_framework import serializers
from django.utils import timezone
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
登录接口设计
views.py
import hashlib
import json
import requests
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django_redis import get_redis_connection
from .models import User
from .serializers import UserSerializer
@api_view(['POST'])
def code2Session(request):
appid = ''
secret = ''
js_code = request.data['code'] url = 'https://api.weixin.qq.com/sns/jscode2session' + '?appid=' + appid + '&secret=' + secret + '&js_code=' + js_code +
'&grant_type=authorization_code'