宝哥软件园

关于微信小程序登录的那些事

编辑:宝哥软件园 来源:互联网 时间:2021-08-27

前言

最近团队在开发一个小程序,都是新手,一边看文档,一边开发。发展中会出现各种问题。今天整理一下小程序登录的流程,做个记录。

小程序的登录和平时自己APP的登录验证不太一样,多了一个角色,就是微信服务器。

根据微信官方提供的登录流程序列图,我们可以清楚的了解小程序登录需要多少个步骤。我们总结如下:

小程序启动,通过wx.login()获取代码的开发者服务器需要提供一个登录界面。参数是小程序获取代码的登录界面收到代码后,调用微信提供的界面对代码进行验证,得到验证结果。成功后,它可以获得一个session_key和openid来生成一个用户定义的密钥。Session_key和openid与用户定义的密钥相关联,并且每次发出请求时,用户定义的密钥都会与密钥一起返回给applet。后端根据密钥获取openid,识别当前用户身份。第一,代码是微信给的。如果随机生成代码验证,肯定是无效的,只有微信给出的代码才有效。代码传到开发者自己的服务后,问微信:

嗨,伙计,我的代码有效还是无效?

微信会告诉你是有效还是无效。如果它有效,它还会给你一个用户标识,也就是openid,和一个会话密钥,也就是会话的密钥。Sessionkey默认2小时有效,当用户一直使用微信维护的小程序时,会自动刷新。

注意:

会话密钥session_key是用于加密和签名用户数据的密钥。为了应用程序本身的数据安全,开发者服务器不应该向小程序发布会话密钥,也不应该向外部提供这个密钥。临时登录证书代码只能使用一次,所以我们要为session_key创建一个别名,这个别名关联了哪个用户只有我们知道,唯一需要做的工作就在这里。

我推荐两种建立联系的方法:

第一种:随机生成密钥,将其与openid相关联,并将其存储在redis中。当请求引入密钥时,直接从redis获取openid,得到当前用户信息。事实上,我们自己维护会话信息

第二,使用JWT生成token,将openid绑定到token,将token返回给applet,请求时携带token,通过解析token获取用户信息。

让我们用第二种方式来解释,我们将粘贴一些代码:

在小程序中,将get code方法添加到app.js中的onLaunch方法中,调用后端的登录界面获取token:

wx . log in({ success : function(RES){ var code=RES . code;If (code) {console.log('app开始获取用户登录凭据:' code ');让params={ ' code ' : code };let result=config . request http(config . URL . user log in,' POST ',params)result . then(RES={ let data=RES . data if(data . code==200){ wx . setstorageync(' log in _ token ',data . data . token);} }).catch(err={ console . log(err)});} else {console.log('未能获取用户登录状态:' RES . errmsg ');}}})用户登录界面根据小程序的代码调用微信界面进行验证:

//小程序获取SessionKey接口地址字符串logi nurl=' https://API . weixin . QQ.com/SNS/jscode 2 session ';字符串url=loginUrl '?appid=% s secret=% s grant _ type=% sjs _ code=% s ';url=String.format(url、appid、appSecret、grantType、param . getcode());字符串结果=restTemplate.getForObject(url,String . class);MapString,Object map=jsonutils . toban(map . class,result);//请求成功的条件是(map . contains key(' session _ key '){ string OpenID=map . get(' OpenID ')。tostring();//第一次保存到用户表,生成JWT TOKEN返回}小程序需要封装wx.request()作为通用方法,与后台的所有交互都使用这个方法调用接口,在这个接口中我们可以设置登录后获得的TOKEN。这样,每个请求都会将Token插入请求头,我们可以在网关中获取这个Token进行解析和验证。

//请求封装函数requestHttp(url ),方法、数据){ //请求头设置var header={ authorization : wx。getstoragesync(' log in _ token ')}返回新的承诺(解析,拒绝)={ wx。请求({ URL : config。主页_配置网址,数据:数据,header:标头,method:方法,成功:(RES={ if(RES . data。代码===200){ resolve(RES)} else { reject(RES)} }),fail :(RES=)中进行验证:

请求上下文CTX=请求上下文。getcurrentcontext();httpersvletrequest请求=CTX。getrequest();字符串标记=请求。getheader('授权');if(stringutils。CTX。setsendzulresponse(false);CTX。set(' issuescess ',false);CTX。setresponsebody(jsonutils。转到JSON(响应。失败('非法请求【缺少【授权】',响应代码NO _ AUTH _ CODE)));ctx.getResponse().setContentType(' application/JSON;charset=utf-8 ');返回null} //验证代币是否有效JWTResult jwResult=jwtutils。检查令牌(token);if(!jwresult。伊施塔图斯()){ CTX。setsendzulresponse(false);CTX。set(' issuescess ',false);CTX。setresponsebody(jsonutils。转到JSON(响应。失败(jwresult。getmsg()、jwresult。getcode())));ctx.getResponse().setContentType(' application/JSON;charset=utf-8 ');返回null} CTX。addzuulrequestheader(' loginUserId ',jwresult。getuid());返回空验证成功后将用户身份设置到请求头中,传递给后端服务使用。

使用JWT必然有一个问题是代币的失效问题,我这边失效时间设置的为2个小时,正常的话用户打开小程序,使用不可能连续超过2个小时,登录的逻辑是在app.js中做的,只要下次进去代币就会重新申请。不过这个也可以调整,比如稍微长一点。

核心就是用户的认证交给了微信,只要微信告诉我们认证成功了,我们就可以自己接管会话信息了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

更多资讯
游戏推荐
更多+