希望通过小程序+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"color: #ff0000">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, '登陆失败') }整体流程图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
风云阁资源网 Design By www.bgabc.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
风云阁资源网 Design By www.bgabc.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 2019明达发烧碟MasterSuperiorAudiophile[WAV+CUE]
- 蔡幸娟.1993-相爱容易相处难【飞碟】【WAV+CUE】
- 陆虎.2024-是否愿意成为我的全世界【Hikoon】【FLAC分轨】
- 关淑怡.2009-ERA【星娱乐】【WAV+CUE】
- 林忆莲《关于她的爱情故事》2022新世纪MQA 24K金碟限量版[WAV+CUE]
- 张雨生1993《一天到晚游泳的鱼》台湾G字首版[WAV+CUE][1G]
- 群星《试音五大女声》[WAV+CUE][1G]
- 魔兽世界wlk武器战一键输出宏是什么 wlk武器战一键输出宏介绍
- 魔兽世界wlk狂暴战一键输出宏是什么 wlk狂暴战一键输出宏介绍
- 魔兽世界wlk恶魔术士一键输出宏是什么 wlk恶魔术士一键输出宏介绍
- 医学爱好者狂喜:UP主把医学史做成了格斗游戏!
- PS5 Pro评分解禁!准备升级入手吗?
- 我们盘点了近期火热的国产单机游戏!《琉隐神渡》等 你期待哪款?
- 2019年第12届广州影音展双碟纪念版ADMS2CD[MP3/WAV]
- 黄安《救姻缘》台首版[WAV+CUE]