希望通过小程序+node来整体的了解下小程序登陆的流程。如有不对欢迎在评论区指出
1. client: wx.login()
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:加密解密处理
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
我在发起请求时将登陆态放在请求头中,相应的服务端可以从请求头中获取
6.service:校验登陆态
整体流程图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,