简单了解小程序+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 相关文章推荐
对于this和$(this)的个人理解
Sep 08 Javascript
JS随机漂浮广告代码具体实例
Nov 19 Javascript
js脚本实现数据去重
Nov 27 Javascript
分享10个原生JavaScript技巧
Apr 20 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
移动端界面的适配
Jan 11 Javascript
浅谈vue父子组件怎么传值
Jul 21 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
php制作简单模版引擎
2016/04/07 PHP
javascript json 新手入门文档
2009/12/03 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
JavaScript实现区块链
2018/03/14 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
python BeautifulSoup使用方法详解
2013/11/21 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python3实现简单飞机大战
2020/11/29 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
自荐信怎么写好
2013/11/11 职场文书
抄作业检讨书
2014/02/17 职场文书
四下基层实施方案
2014/03/28 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫