手机版

简单了解小程序结节梳理登陆流程

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

希望通过小程序结节来整体的了解下小程序登陆的流程。如有不对欢迎在评论区指出

1.客户端:wx.login()

wx。登录({成功:([代码])={//发送密码到后台换取openId,sessionKey,unionId}})2 .service:请求()

服务端请求,需要的参数(js_code:客户端传的代码;appid:小程序唯一标识申请账号时拿到;秘密:小程序密钥申请账号时拿到;grant_type:默认值为授权码)

//请求方法const request=require(' request ')const URL=https://api.weixin.qq.com/sns/jscode2session?appid=APPIDsecret=SECRETjs _ code=JSCODEgrant _ type=authorization _ codemodule。导出={ async getSession(代码){返回新的Promise((解析,拒绝)={request(url,{method: 'GET ',json: true },(error,res,body)={ if(Error){ reject(err)} else { if(body。错误代码){拒绝(新的错误(正文。errmsg))} else { resolve(body)} } })} } 3。服务333333。3 .加密解密处理

const crypto=require(' crypto ')const secret=' 2019 _ 06 ' const algorithm=' AES-256-CBC '函数编码器(id){ const encoder=crypto。createcipher(算法,秘密)const str=[id,Date.now(),' 2019'].join(' | ')让encrypted=encoder。update(str,' utf8 ',' hex ')加密=encoder。最终('十六进制')返回加密的}函数decode(str){ const decoder=crypto。createdecoder(算法,秘密)让decoded=decoder。update(str,' hex ',' utf8 ')已解码=解码器。final(' utf8 ')const arr=已解码。拆分(' | ')返回{ id 3: arr[0],timespan 3360 parsent(arr[1])返回登陆态

const { encode }=require(' ./lib/crypto)const JSonmine=' application/JSON ' const now=date。现在()函数句柄(ctx,数据,代码=0,消息='成功'){ CTX。type=jsonminectx。body={ code,data,message}}router.get('/login ',async (ctx,next)={ const { code }=CTX。请求。querycon ST session=等待登录(代码)if(session){ const { session _ key,openid }=session//查找数据库中是否已经存有openid,如果hasOpenid为空说明是新用户const hasOpenid=等待用户。findbypk(OpenID)if(!hasOpenid){//数据库存储openid,时间戳User.create({openid,timespan:Date.now()})句柄(ctx,{ token: encode(openid) })否则{抛出新错误('登陆失败)}})5.client:存储登陆态在仓库

从""导入{ LOGIN _ TOKEN }././utils/local STORAGE//拿到代币存储到客户端wx。setstorage ync(LOGING _ TOKEN,TOKEN)我在发起请求时将登陆态放在请求头中,相应的服务端可以从请求头中获取

标头: { ' x-session ' : wx。getstorage ync(log in _ TOKEN)},6.service:校验登陆态

module.exports=异步函数(ctx,next){ const会话密钥=CTX。get(' x-session ')const { id,timespan }=decode(sessionKey)//查找数据库中是否存在该openid,返回是一个数组,如果不存在则返回[]const TargetLiST=等待GetOpenID(id)if(TargetLiST。长度)0 {//如果超过设定的过期时间,标记isExpired字段为登陆过期const一小时=1000 * 60 * 60 * 24if(日期。现在()-时间跨度一小时){ CTX。国家。iseexpired=true//跟前台约定,如果代码=2说明登陆过期跳登陆页面句柄(ctx ' ',2 '登陆过期)} else {handle(ctx,",0,"登陆成功)}} else {//通过ctx.throw可以直接抛出错误ctx.throw(401 '登陆失败')}整体流程图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,

版权声明:简单了解小程序结节梳理登陆流程是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。