侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

简单了解小程序+node梳理登陆流程

微信(小程序)  /  管理员 发布于 3年前   174

希望通过小程序+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, '登陆失败')}

整体流程图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,

您可能感兴趣的文章:

  • NodeJs模拟登陆正方教务
  • node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
  • nodejs个人博客开发第七步 后台登陆
  • 详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
  • node.js微信小程序配置消息推送的实现
  • node实现生成带参数的小程序二维码并保存到本地功能示例


  • 上一条:
    微信小程序入口场景的问题集合与相关解决方法
    下一条:
    js实现简单实用的AJAX完整实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 小程序开发之跳转微信直播示例api(0个评论)
    • 在uni_app中开发小程序之常用功能示例代码汇总(0个评论)
    • 小程序开发之多端框架:taro(0个评论)
    • 微信小程序前端使用七牛云官方SDK上传七牛云代码示例(0个评论)
    • 百度小程序审核未通过,真机审核存在点击返回键退出小程序...解决方式之一tabBar(0个评论)
    • 近期文章
    • 如何优雅处理async await错误推荐:await-to-js库(0个评论)
    • lodash工具库(0个评论)
    • 在Laravel项目中使用中间件方式统计用户在线时长功能代码示例(0个评论)
    • 在Laravel中构建业务流程模型(0个评论)
    • windows系统中安装FFMpeg及在phpstudy环境php7.3 + php-ffmpeg扩展的使用流程步骤(0个评论)
    • 在go语言中对浮点的数组、切片(slice)进行正向排序和反向排序(0个评论)
    • 在go语言中对整数数组、切片(slice)进行排序和反向排序(0个评论)
    • 在go语言中对字符串数组、切片(slice)进行排序和反向排序(0个评论)
    • 最新国内免注册ChatGPT体验站_ChatGPT镜像站访问链接地址2023/3/28持续更新(0个评论)
    • 在Laravel项目中的实现无密码认证之:发送邮箱链接授权(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客