一种微信小程序用户登陆方法、设备及存储设备与流程

文档序号:17443376发布日期:2019-04-17 05:07阅读:391来源:国知局
一种微信小程序用户登陆方法、设备及存储设备与流程
本发明涉及微信小程序
技术领域
,尤其涉及一种微信小程序用户登陆方法、设备及存储设备。
背景技术
:为了方便小程序应用使用微信登陆态进行授权登陆,微信小程序提供了登陆授权的开放接口。小程序的文档比较复杂,涉及服务器端请求,加密信息解密,管理和维护用户标识,session_key过期处理等等技术细节,实现起来较为繁琐。依托于koa,eggjs等的中间件机制,可以实现微信小程序登陆授权中间件,方便接入使用,快速实现小程序登陆授权功能。技术实现要素:为了解决上述问题,本发明提供了一种微信小程序用户登陆方法、设备及存储设备,一种微信小程序用户登陆方法,主要包括以下步骤:s101:用户进入小程序登陆界面,启动小程序登陆流程;s102:小程序端发送第一请求指令至己方服务器以请求登陆己方服务器,所述第一请求指令中包含用户登陆标识,己方服务器提取接收到的请求指令中的用户登陆标识,检查己方服务器内存中是否存在与用户登陆标识相对应的己方服务器登陆凭证skey;若是,则到步骤s103;若否,则到步骤s104;所述用户登陆标识根据用户登陆微信时的微信账号获得;s103:己方服务器利用checksession函数检查所述己方服务器登陆凭证skey是否过期;若是,则到步骤s104;若否,则到步骤s108;s104:己方服务器发送第二请求指令至小程序端;s105:小程序端根据第二请求指令,利用wx.login函数,请求微信服务器生成用户登陆凭证code并返回至对应的小程序端,小程序端利用wx.request函数将code和小程序的相关参数发送给己方服务器;s106:己方服务器利用code和小程序的相关参数,通过微信服务器提供的第三方接口,向微信服务器发出请求,从而从微信服务器中获取用户操作有效性标识session_key和用户唯一性标识openid;s107:己方服务器根据获取的openid和session_key,生成登陆小程序所需的己方服务器登陆凭证skey;s108:根据己方服务器登陆凭证skey,登陆小程序。进一步地,在步骤s106中,用户操作有效性标识session_key和微信服务器派发的用户登陆凭证code一一对应,同一code只能获取一次session_key,每次使用wx.login函数,都会获取一个新的code和对应的session_key。进一步地,在步骤s106中,用户操作有效性标识session_key有时效性,session_key的过期时间跟用户使用小程序的频率成正相关。一种存储设备,所述存储设备存储指令及数据用于实现一种微信小程序用户登陆方法。一种微信小程序用户登陆设备,包括:处理器及所述存储设备:所述处理器加载并执行所述存储设备中的指令及数据用于实现一种微信小程序用户登陆方法。本发明提供的技术方案带来的有益效果是:本发明的技术方案提供了一种完善可靠且易于使用的微信小程序用户登陆方法,用户可以通过此中间件快速安全的登陆微信小程序,快速建立小程序内的用户体系,方便快捷,实用性强。附图说明下面将结合附图及实施例对本发明作进一步说明,附图中:图1是本发明实施例中一种微信小程序用户登陆方法的流程图;图2是本发明实施例中基于redis的具体实施方案的示意图;图3是本发明实施例中硬件设备工作的示意图。具体实施方式为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图详细说明本发明的具体实施方式。本发明的实施例提供了一种微信小程序用户登陆方法、设备及存储设备。请参考图1,图1是本发明实施例中一种微信小程序用户登陆方法的流程图,具体包括如下步骤:s101:用户进入小程序登陆界面,启动小程序登陆流程;s102:小程序端发送第一请求指令至己方服务器以请求登陆己方服务器,所述第一请求指令中包含用户登陆标识,己方服务器提取接收到的请求指令中的用户登陆标识,检查己方服务器内存中是否存在与用户登陆标识相对应的己方服务器登陆凭证skey;若是,则到步骤s103;若否,则到步骤s104;所述用户登陆标识根据用户登陆微信时的微信账号获得;s103:己方服务器利用checksession函数检查所述己方服务器登陆凭证skey是否过期;若是,则到步骤s104;若否,则到步骤s108;s104:己方服务器发送第二请求指令至小程序端;s105:小程序端根据第二请求指令,利用wx.login函数,请求微信服务器生成用户登陆凭证code并返回至对应的小程序端,小程序端利用wx.request函数将code和小程序的相关参数发送给己方服务器;s106:己方服务器利用code和小程序的相关参数,通过微信服务器提供的第三方接口,向微信服务器发出请求,从而从微信服务器中获取用户操作有效性标识session_key和用户唯一性标识openid;所述第三方接口为微信服务器和己方服务器之间的接口;s107:己方服务器根据获取的openid和session_key,生成登陆小程序所需的己方服务器登陆凭证skey;s108:根据己方服务器登陆凭证skey,登陆小程序。在步骤s106中,用户操作有效性标识session_key和微信服务器派发的用户登陆凭证code一一对应,同一code只能获取一次session_key,每次使用wx.login函数,都会获取一个新的code和对应的session_key。在步骤s106中,用户操作有效性标识session_key有时效性,session_key的过期时间跟用户使用小程序的频率成正相关,且session_key的时效性与skey的时效性一致,当session_key失效时,skey也会失效。请参考图2,图2是本发明实施例中基于redis的具体实施方案的示意图,所以下面介绍的细节全部基于redis;总结为以下四个步骤:步骤一:调用wx.login生成codewx.login()这个api的作用就是为当前用户生成一个临时的登陆凭证,这个临时登陆凭证的有效期只有五分钟。拿到这个登陆凭证后就可以进行下一步操作:获取openid和session_key。具体代码如下:步骤二:获取openid和session_key在公众平台里,openid用来标识每个用户在订阅号、服务号、小程序这三种不同应用的唯一标识,也就是说每个用户在每个应用的openid都是不一致的,所以在小程序里,用openid来标识用户的唯一性。有了用户标识,就需要让该用户进行登陆,那么session_key就保证了当前用户进行会话操作的有效性,这个session_key是微信服务器端派发的。可以用这个标识来间接地维护小程序用户的登陆太,那么这个session_key是怎么拿到的呢?需要在己方服务器端请求微信提供的第三方接口https://api.weixin.qq.com/sns/jscode2session,这个接口需要带上四个参数字段,如下表所示:参数值appid小程序的appidsecret小程序的secretjs_code前面调用wx.login派发的codegrant_type'authorization_code'从上表中这几个参数,可以看出,要请求这个接口必须先调用wx.login()来获取到用户当前会话的code。那么为什么要在服务端来请求这个接口呢?其实是出于安全性的考量,如果在前端通过request调用此接口,就不可避免的需要将小程序的appid和小程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有心之人”,这就给业务安全带来极大的风险。除了需要在服务端进行session_key的获取,还需要注意两点:1、session_key和微信派发的code是一一对应的,同一code只能换取一次session_key。每次调用wx.login(),都会下发一个新的code和对应的session_key,为了保证用户体验和登陆态的有效性,开发者需要清楚用户需要重新登陆时才去调用wx.login();2、session_key是有时效性的,即便是不调用wx.login,session_key也会过期,过期时间跟用户使用小程序的频率成正相关,但具体的时间长短开发者和用户都是获取不到的。具体代码如下:步骤三:生成3rd_session前面说过通过session_key来“间接”地维护登陆态,所谓间接,也就是需要自己维护用户的登陆态信息,这里也是考虑到安全性因素,如果直接使用微信服务端派发的session_key来作为业务方的登陆态使用,会被“有心之人”用来获取用户的敏感信息,比如wx.getuserinfo()这个接口,就需要session_key来配合解密微信用户的敏感信息。那么如何生成己方服务器的登陆态标识呢,这里可以使用sha1(session_key+openid)生成标识,将生成后的登陆态标识(这里我们统称为'skey')返回给前端,并在前端维护这份登陆态标识(一般是存入storage)。而服务端以skey为key,{skey,session_key,openid}为value,存储于redis中,前端发送请求时,需在请求header中携带'x-wx-flag','x-wx-skey'字段,服务端根据请起头中的flag和skey从redis中取出对应的用户信息。下面代码是获取session_key,生成skey,redis存储的简易流程:constcode=getrequiredheader(ctx,consts.wx_header_code);const{session_key,openid}=awaitwxlogin(ctx,appid,appsecret,code);constskey=sha1(session_key+openid);letsession={skey,session_key,openid};awaitstore.set(skey,session,maxage);ctx.$wxinfo=session;ctx.body={code:0,data:{skey}};步骤四:checksession将skey存入前端的storage里,每次进行用户数据请求时会带上skey,那么如果此时skey过期呢?所以需要调用到wx.checksession()这个api来校验当前skey是否已经过期,这个api并不需要传入任何有关skey的信息参数,而是微信小程序自己去调自己的服务来查询用户最近一次生成的skey是否过期。如果当前skey过期,就让用户来重新登陆,更新skey,并将最新的skey存入用户数据表中。checksession这个步骤一般是放在小程序启动时就校验登陆态的逻辑处。下面代码即校验登陆态的简单流程:请参考图3,图3是本发明实施例的硬件设备工作示意图,所述硬件设备具体包括:一种微信小程序用户登陆设备301、处理器302及存储设备303。一种微信小程序用户登陆设备301:所述一种微信小程序用户登陆设备301实现所述一种微信小程序用户登陆方法。处理器302:所述处理器302加载并执行所述存储设备303中的指令及数据用于实现所述一种微信小程序用户登陆方法。存储设备303:所述存储设备303存储指令及数据;所述存储设备303用于实现所述一种微信小程序用户登陆方法。本发明的有益效果是:本发明的技术方案提供了一种完善可靠且易于使用的微信小程序用户登陆方法,用户可以通过此中间件快速安全的登陆微信小程序,快速建立小程序内的用户体系,方便快捷,实用性强。以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1