微信小程序登陆验证机制理解及实现

椰汁笔记,欢迎指正

微信小程序的登录(python flask实现后端),实现的核心是

  1. 让服务器得到用户的openid。
  2. 服务器生成sessionId发送给客户端,sessionId即是客户端和服务器的会话密钥。
    微信小程序登陆验证机制理解及实现_第1张图片

第一步:客户端发送code给服务端(code调用微信api获得)

  1. 通过调用wx.login()获得,code的值在返回结果的code字段。
  2. 再使用wx.request()将code发送给服务器,注意要使用GET方法请求服务器,将code放在data字段。
wx.login({
	sucess: function(res){
		if(res.code) {
			wx.request({
				url: 'http://192.168.26.190.5000/',
				data:{
					code: res.code
				},
			)}
		}
	}
})


第二步:服务器获取请求中的code,用code请求微信api获取openid

  • 注意GET方法上传的参数的获取方式是 request.agrs[],(注意这个request来自flask中的request)

然后就是请求微信提供的api换取openid,微信服务器提供的接口地址是:

https://api.weixin.qq.com/sns/jscode2session?appid=&secret=&js_code=&grant_type=authorization_code

URL的query部分的参数中, , 就是前文所提到的三个信息,请求参数合法的话,接口会返回以下字段。

注意的是:AppId和AppSecret都在微信的开发公众平台上,

微信小程序登陆验证机制理解及实现_第2张图片
微信小程序登陆验证机制理解及实现_第3张图片

  • 在创建小程序时,你使用的appId可能只是一个测试号,需要在开发者工具中查看,更换为上面页面的appid,这样的AppId和AppSecret请求api才能获得openid。
  • 然后请求api获取openid,注意这里使用的requests来自与flask无关的python
    requests库,请求到的结果json解析后便可以在openid字段拿到用户的openid。
r = requests.get('https://api.weixin.qq.com/sns/jscode2session?'
			'appid=%s&secret=%s&js_code=%s'
			'&grant_type=authorization_code'
			%('你的appid','对应的appsecret','小程序端得到的code'))
openid = r.json()['openid']

第三步:生成用户的sessionId,返回给用户。

  • 其实用openid已经可以标识用户,可以将openid直接返回给客户端,以后的访问服务器操作带上openid参数即可,但是openid是一个非常隐私的用户数据,微信小程序推荐服务器自己根据openid生成sessionId,利用sessionId来标识用户,因此我们可以随便使用一个加密算法去实现,sessionId的生成(因为使用加密算法的明文和密文是一一对应的,openid不同自然生成的sessionId也不同,因此可以标识用户),这里我采用的是md5(在hashlib库中)。
sessionId = hashlib,md5(openid.encode(encoding='utf-8')).hexdigest()
  • 然后将sessionId返回给微信客户端,采用json格式发送返回数据,不直接使用flask中的自动包装response,而是自己生成response对象。若要返回json格式的数据,要在返回的headers中设置content-type为application/json。再利用make_response生成返回对象,注意参数无法直接通过字符串写出json格式数据,需要使用jsonify方法(这个方法来自flask中的jsonify库)
headers = {
	'content-type': 'application/json',
	}
response = make_response(jsonify({'sessionId: sessionId'}),200)

到这,登陆验证的基本流程就结束了。


  • 获取到sessionId后,我们每次访问服务器时都要将访问用户进行标识,所以每次访问服务器都要带上sessionId。因此我们需要将sessionId注册到整个微信小程序的全局变量中。实现的方法是整个小程序的app.js中去设置全局变量。
globalData: {
	userInfo: null,
	sessionId: null,
	}
  • globalData的作用是声明全局变量,其中的sessionId就是每次访问服务器需要带上用以标识用户。(我们的标识用户采用的是加密后的openid因此这个与服务器会话的密钥不会改变,因此不会过期)
    在实现上如果每次使用小程序都去访问服务器获取sessionId显然是很浪费资源的,因此我们可以利用微信小程序中的缓存功能,将请求到的sessionId缓存到本地。在app.js中OnLaunch()生命周期中写入获取sessionId并设置全局变量的代码。

小程序端的js代码如下:

微信小程序登陆验证机制理解及实现_第4张图片
微信小程序登陆验证机制理解及实现_第5张图片

你可能感兴趣的:(微信小程序登陆验证机制理解及实现)