简单了解小程序+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 相关文章推荐
字符串的replace方法应用浅析
Dec 06 Javascript
jquery清空textarea等输入框实现代码
Apr 22 Javascript
jquery事件与函数的使用介绍
Sep 29 Javascript
javacript使用break内层跳出外层循环分析
Jan 12 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
seajs学习教程之基础篇
Oct 20 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
vue渲染时闪烁{{}}的问题及解决方法
Mar 28 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
js中console在一行内打印字符串和对象的方法
Sep 10 Javascript
js实现tab栏切换效果
Aug 02 Javascript
js基于canvas实现时钟组件
Feb 07 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
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jQuery插件实现带圆点的焦点图片轮播切换
2016/01/18 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
jQuery实现在新增加的元素上添加事件方法案例分析
2017/02/09 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
给Python入门者的一些编程建议
2015/06/15 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python帮你识破双11的套路
2019/11/11 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
生日主持词
2014/03/20 职场文书
股东合作协议书
2014/04/14 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
新党章心得体会
2014/09/04 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL