微信小程序python token验证_微信小程序登录对接Django后端实现JWT方式验证登录

先上效果图

b_0_201905180732491167.jpg

b_0_201905180732493395.jpg

点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料。

流程

1.使用微信小程序登录和获取用户信息api接口

2.把api获取的用户资料和code发送给django后端

3.通过微信接口把code换取成openid

4.后端将openid作为用户名和密码

5.后端通过json web token方式登录,把token和用户id传回小程序

6.小程序将token和用户id保存在storage中

下次请求需要验证用户身份的页面时,在header中加入token这个字段

微信小程序代码

获取用户信息的方法这里不展示,可以在微信小程序文档中看到

登录方法

login: function(event) {

wx.login({

success: res => {

console.log(res)

//请求后端换取openid的接口

http.request({

url: '/get-openid/',

method: 'post',

data: {

//将code传到后端

jscode: res.code

},

success: res => {

//获取到openid作为账号密码

console.log(res)

console.log(app.globaldata.userinfo)

http.request({

url: '/wx-login/',

method: 'post',

data: {

openid: res.openid,

session_key: res.session_key,

nickname: app.globaldata.userinfo.nickname,

avatar_url: app.globaldata.userinfo.avatarurl,

gender: app.globaldata.userinfo.gender

},

//登录成功后返回token保存在storage中

success: res => {

console.log(res)

//token存入storage

wx.setstoragesync('jwt_token', res.token)

wx.setstoragesync('user_id', res.user_id)

this.refreshuserprofile()

//登录状态置为true

this.setdata({

islogin: true,

hasuserinfo: true

})

app.globaldata.islogin = true

}

})

}

})

}

})

}

注销方法

logout: function(res) {

this.setdata({

islogin:false,

hasuserinfo:false

})

app.globaldata.islogin = false

wx.removestoragesync('jwt_token')

wx.removestoragesync('user_id')

},

django后端的实现

首先安装djangorestframework-jwt

这里不使用他默认的登录接口,如下所示

b_0_201905180732497879.jpg

它提供了手动签发token和解密token的功能,因此最好自己实现

手动签发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)

手动解密token

jwt_decode_handler = api_settings.jwt_decode_handler

user_dict = jwt_decode_handler(token)

user_id = user_dict['user_id']

后端换取openid

class openid:

def __init__(self, jscode):

self.url = 'https://api.weixin.qq.com/sns/jscode2session'

self.app_id = env.str('appid')

self.app_secret = env.str('appsecret')

self.jscode = jscode

def get_openid(self):

url = self.url + "?appid=" + self.app_id + "&secret=" + self.app_secret + "&js_code=" + self.jscode + "&grant_type=authorization_code"

res = requests.get(url)

try:

openid = res.json()['openid']

session_key = res.json()['session_key']

except keyerror:

return 'fail'

else:

return openid, session_key

后端返回openid接口实现

这里只使用简单的fbv视图

注:前端传来的值无法从request.post中接收到,只能使用如下方法

@require_http_methods(['post'])

@csrf_exempt

def getopenidview(request):

data = json.loads(request.body)

jscode = data['jscode']

openid, session_key = openid(jscode).get_openid()

return jsonresponse({

'openid': openid,

'session_key': session_key

})

后端登录接口实现

如果不存在用户则自动创建

为了简单,用户名和密码都是openid

@require_http_methods(['post'])

@csrf_exempt

def login_or_create_account(request):

data = json.loads(request.body)

print(data)

openid = data['openid']

nickname = data['nickname']

avatar_url = data['avatar_url']

gender = data['gender']

try:

user = user.objects.get(username=openid)

except user.doesnotexist:

user = none

if user:

user = user.objects.get(username=openid)

else:

user = user.objects.create(

username=openid,

password=openid,

nickname=nickname,

avatar_url=avatar_url,

gender=gender

)

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)

res = {

'status': 'success',

'nickname': user.nickname,

'user_id': user.id,

'token': token

}

return jsonresponse(res)

以上就是简单的微信小程序登录对接django的思路,很多地方不严谨,仅供参考

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值