简单了解小程序+node梳理登陆流程
微信(小程序)  /  管理员 发布于 4年前   298
希望通过小程序+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_codemodule.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 = jsonMinectx.body = {code,data,message}}router.get('/login', async (ctx, next) => {const { code } = ctx.request.queryconst 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 * 24if (Date.now() - timespan > oneHour) {ctx.state.isExpired = true// 跟前台约定,如果code=2说明登陆过期跳登陆页面handle(ctx, '', 2, '登陆过期')} else {handle(ctx, '', 0, '登陆成功')}} else {// 通过ctx.throw可以直接抛出错误ctx.throw(401, '登陆失败')}
整体流程图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号