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

 更新时间:2019年06月24日 10:27:32   作者:三只萌新  
这篇文章主要介绍了简单了解小程序+node梳理登陆流程,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下

希望通过小程序+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.js包管理器npm的具体使用

    Node.js包管理器npm的具体使用

    Node.js安装包中都带有一个重要的工具 包管理器npm,本文主要介绍了Node.js包管理器npm的具体使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 开箱即用的Node.js+Mysql模块封装实现详解

    开箱即用的Node.js+Mysql模块封装实现详解

    这篇文章主要为大家介绍了开箱即用的Node.js+Mysql模块封装实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Nodejs读取文件时相对路径的正确写法(使用fs模块)

    Nodejs读取文件时相对路径的正确写法(使用fs模块)

    本篇文章主要介绍了linux 环境 mysql写入中文报错的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • nodejs如何将多个目录文件合并成一个

    nodejs如何将多个目录文件合并成一个

    这篇文章主要介绍了nodejs如何将多个目录文件合并成一个问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 浅谈Node.js 中间件模式

    浅谈Node.js 中间件模式

    中间件在 Node.js 中被广泛使用,它泛指一种特定的设计模式、一系列的处理单元、过滤器和处理程序,以函数的形式存在,这篇文章主要介绍了浅谈Node.js 中间件模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Node中解决接口跨域问题详解

    Node中解决接口跨域问题详解

    在 Node 中编写接口时,我们常常会遇到跨域问题,通过本篇文章,我们来聊聊如何解决 Node 中接口的跨域问题,文中代码示例介绍了非常详细,需要的朋友可以借鉴一下
    2023-04-04
  • nodejs使用Express框架写后端接口的全过程

    nodejs使用Express框架写后端接口的全过程

    最近学习了基于前后端分离的开发模式,我前端使用Vue框架,后端使用nodejs开发API接口,下面这篇文章主要给大家介绍了关于nodejs使用Express框架写后端接口的相关资料,需要的朋友可以参考下
    2022-05-05
  • Node.js获取本机Mac地址的两种方案

    Node.js获取本机Mac地址的两种方案

    有时候我们的项目中可能会有日志记录的功能或者其他需要ip的功能,于是这时我们需要获取用户的ip地址或mac地址,下面这篇文章主要给大家介绍了关于Node.js获取本机Mac地址的两种方案,需要的朋友可以参考下
    2022-09-09
  • Node.js 模块的加载逻辑你了解嘛

    Node.js 模块的加载逻辑你了解嘛

    这篇文章主要为大家介绍了Node.js 模块的加载逻辑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Node.js中Request模块处理HTTP协议请求的基本使用教程

    Node.js中Request模块处理HTTP协议请求的基本使用教程

    这篇文章主要介绍了Node.js中Request模块处理HTTP请求的基本使用教程,request也支持OAuth的签名请求,很好很强大,需要的朋友可以参考下
    2016-03-03

最新评论