简单了解小程序+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 相关文章推荐
jquery EasyUI的formatter格式化函数代码
Jan 12 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
Aug 02 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
详解javascript中原始数据类型Null和Undefined
Dec 17 Javascript
JS实现简单的天数计算器完整实例
Apr 28 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
vue实例的选项总结
Jun 09 Javascript
Vue性能优化的方法
Jul 30 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下封装较好的数字分页方法
2010/11/23 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
node-red File读取好保存实例讲解
2019/09/11 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python脚本设置超时机制系统时间的方法
2016/02/21 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python实现简单名片管理系统
2018/11/30 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
python里glob模块知识点总结
2021/01/05 Python
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
公积金转移接收函
2014/01/11 职场文书
运动会跳远加油稿
2014/02/20 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
给老师的保证书怎么写
2015/05/09 职场文书