简单了解小程序+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 相关文章推荐
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
js判断滚动条是否已到页面最底部或顶部实例
Nov 20 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
JavaScript中值类型和引用类型的区别
Feb 23 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
JS中FileReader类实现文件上传及时预览功能
Mar 27 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
图形数字验证代码
2006/10/09 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[48:00]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第二场 11.04
2020/11/04 DOTA
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python实现的端口扫描功能示例
2018/04/08 Python
Python递归函数实例讲解
2019/02/27 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
生产部主管岗位职责
2014/01/06 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
小学毕业寄语大全
2014/04/03 职场文书
机关搬迁方案
2014/05/18 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
Nginx报404错误的详细解决方法
2022/07/23 Servers