简单了解小程序+node梳理登陆流程


Posted in Javascript onJune 24, 2019

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

1. client: wx.login()

wx.login({
success: ([code]) => {
// 发送 code 到后台换取 openId, sessionKey, unionId
}
})

2. service: request()

服务端请求,需要的参数(js_code:client传的code;appid:小程序唯一标识申请账号时拿到;secret:小程序密钥申请账号时拿到;grant_type:默认值为 authorization_code)

// 请求方法
const request = require('request')
const url = https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
module.exports = {
async getSession(code) {
return new Promise((resolve, reject) => {
request(url,{
method: 'GET',
json: true
},
(error, res, body) => {
if (error) {
reject(error)
} else {
if (body.errcode) {
reject(new Error(body.errmsg))
} else {
resolve(body)
}
}
}
)
})
}
}

3.service:加密解密处理

const crypto = require('crypto')
const secret = '2019_06'
const algorithm = 'aes-256-cbc'
function encode(id) {
const encoder = crypto.createCipher(algorithm, secret)
const str = [id, Date.now(), '2019'].join('|')
let encrypted = encoder.update(str, 'utf8', 'hex')
encrypted += encoder.final('hex')
return encrypted
}
function decode(str) {
const decoder = crypto.createDecipher(algorithm, secret)
let decoded = decoder.update(str, 'hex', 'utf8')
decoded += decoder.final('utf8')
const arr = decoded.split('|')
return {
id: arr[0],
timespan: parseInt(arr[1])
}
}
module.exports = {
encode,
decode
}

4.service:返回登陆态

const { encode } = require('./lib/crypto')
const jsonMine = 'application/json'
const now = Date.now()
function handle(ctx, data, code = 0, message = 'success') {
ctx.type = jsonMine
ctx.body = {
code,
data,
message
}
}
router.get('/login', async (ctx, next) => {
const { code } = ctx.request.query
const session = await login(code)
if (session) {
const { session_key, openid } = session
// 查找数据库中是否已经存有openid,如果 hasOpenid 为null说明是新用户
const hasOpenid = await User.findByPk(openid)
if(!hasOpenid){
// 数据库存储openid,时间戳
User.create({openid,timespan:Date.now()})
}
handle(ctx, { token: encode(openid) })
} else {
throw new Error('登陆失败')
}
})

5.client:存储登陆态在storage

import { LOGIN_TOKEN } from '../../utils/localStorage'
// 拿到token存储到客户端
wx.setStorageSync(LOGIN_TOKEN, token)

我在发起请求时将登陆态放在请求头中,相应的服务端可以从请求头中获取

header: {
'x-session': wx.getStorageSync(LOGIN_TOKEN)
},

6.service:校验登陆态

module.exports = async function(ctx, next) {
const sessionKey = ctx.get('x-session')
const { id, timespan } = decode(sessionKey)
// 查找数据库中是否存在该 openid,返回是一个数组,如果不存在则返回[]
const targetList = await getOpenid(id)
if (targetList.length > 0) {
// 如果超过设定的过期时间,标记isExpired字段为登陆过期
const oneHour = 1000 * 60 * 60 * 24
if (Date.now() - timespan > oneHour) {
ctx.state.isExpired = true
// 跟前台约定,如果code=2说明登陆过期跳登陆页面
handle(ctx, '', 2, '登陆过期')
} else {
handle(ctx, '', 0, '登陆成功')
}
} else {
// 通过ctx.throw可以直接抛出错误
ctx.throw(401, '登陆失败')
}

整体流程图

简单了解小程序+node梳理登陆流程

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

Javascript 相关文章推荐
JavaScript 版本自动生成文章摘要
Jul 23 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
javascript实例--教你实现扑克牌洗牌功能
May 15 Javascript
scrollWidth,clientWidth,offsetWidth的区别
Jan 13 Javascript
获取IE浏览器Cookie信息的方法
Jan 23 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
Oct 22 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
JavaScript内置对象math,global功能与用法实例分析
Jun 10 Javascript
vue使用i18n实现国际化的方法详解
Sep 05 Javascript
vue 微信扫码登录(自定义样式)
Jan 06 Javascript
jQuery实现移动端扭蛋机抽奖
Nov 08 jQuery
js闭包的9个使用场景
Dec 29 Javascript
JS数组扁平化(flat)方法总结详解
Jun 24 #Javascript
深入了解query和params的使用区别
Jun 24 #Javascript
如何使用JavaScript实现栈与队列
Jun 24 #Javascript
简单了解JavaScript中的执行上下文和堆栈
Jun 24 #Javascript
一次让你了解全部JavaScript的作用域
Jun 24 #Javascript
通过循环优化 JavaScript 程序
Jun 24 #Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 #Javascript
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python清除指定目录内所有文件中script的方法
2015/06/30 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python交互模式基础知识点学习
2020/06/18 Python
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
大学生交通专业求职信
2014/09/01 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
节约用电通知
2015/04/25 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
python和anaconda的区别
2022/05/06 Python