微信小程序登录流程

简介: 微信小程序登录流程

1. 前言

  1. 登录很简单,基本都做过,但是进行总结的可能不多
  2. 今天闲来无事就总结一波

2.  登录方式

  1. 微信小程序的登录流程分为两种情况
  2. 一种是使用微信开放平台登录
  3. 一种是使用自定义登录方式

3. 使用微信开放平台登录

  1. 用户在小程序中点击登录按钮,触发登录事件。
  2. 小程序调用wx.login()方法获取临时登录凭证code。
  3. 小程序调用 wx.getUserInfo()方法获取用户的基本信息(头像、昵称等)。
  4. 小程序将code和用户信息发送给开发者的后台服务器
  5. 开发者的后台服务器使用 AppIDAppSecret 调用微信接口获取 session_key 和 openid
  6. 开发者的后台服务器使用session_key对用户信息进行解密,获取用户的真实信息。
  7. 开发者的后台服务器将用户的信息存储到数据库中,并生成一个自定义登录态token并返回给小程序。
  8. 小程序保存该自定义登录态token,并在以后的请求中带上该token

4. 相关代码

  1. 客户端授权登录

// 点击按钮触发登录事件
wx.login({
  success: res => {
    // 获取临时登录凭证
    const code = res.code;
    // 获取用户信息
    wx.getUserInfo({
      success: res => {
        const userInfo = res.userInfo;
        // 将 code 和 userInfo 发送给后台服务器
        wx.request({
          url: 'https://xx.xx.com/api/login',
          data: {
            code: code,
            userInfo: userInfo
          },
          success: res => {
            // 将服务器返回的自定义登录态 token 存储到本地
            wx.setStorageSync('token', res.data.token);
          }
        });
      }
    });
  }
});
  1. 后台服务器处理登录逻辑

const request = require('request');
const crypto = require('crypto');
const APP_ID = '你的 app id';
const APP_SECRET = '你的 app secret';
// 处理小程序端登录请求
function login(req, res) {
  const code = req.body.code;
  const userInfo = req.body.userInfo;
  // 获取 session_key 和 openid
  request(`https://api.weixin.qq.com/sns/jscode2session?appid=${APP_ID}&secret=${APP_SECRET}&js_code=${code}&grant_type=authorization_code`, function(error, response, body) {
    const result = JSON.parse(body);
    const session_key = result.session_key;
    const openid = result.openid;
    // 使用 session_key 对用户信息进行解密
    const encryptedData = userInfo.encryptedData;
    const iv = userInfo.iv;
    const decipher = crypto.createDecipheriv('aes-128-cbc', new Buffer(session_key, 'base64'), new Buffer(iv, 'base64'));
    let decoded = decipher.update(encryptedData, 'base64', 'utf8');
    decoded += decipher.final('utf8');
    const userInfoObj = JSON.parse(decoded);
    // 将用户信息存储到数据库中,生成自定义登录态 token 并返回
    const token = generateToken(userInfoObj);
    res.json({ token: token });
  });
}
// 生成自定义登录态 token
function generateToken(userInfo) {
  const secret = 'your secret key';
  const expireTime = new Date().getTime() + 24 * 3600 * 1000;
  const data = JSON.stringify({
    userInfo: userInfo,
    expireTime: expireTime
  });
  const hash = crypto.createHmac('sha256', secret).update(data).digest('hex');
  const token = `${data}.${hash}`;
  return token;
}

只是大概流程 没有考虑用户退出登录、token 过期等其他情况的处理。


5. 自定义登录方式

  1. 用户在小程序中输入账号密码,点击“登录”按钮,触发登录事件。
  2. 小程序将用户输入的账号密码发送给开发者的后台服务器。
  3. 开发者的后台服务器根据账号密码验证用户的身份,并生成一个自定义登录态token并返回给小程序。
  4. 小程序保存该自定义登录态 token,并在以后的请求中带上该token
  5. 需要注意的是,在使用自定义登录方式时,为了保障用户数据的安全,需要使用 HTTPS 协议,并对用户密码进行加密传输和存储

6. 相关代码

  1. 客户端登录逻辑

// 自定义登录函数,使用用户名和密码登录
const login = (username, password) => {
  return new Promise((resolve, reject) => {
    wx.request({
      url: 'https://xx.yzs.com/api/login',
      method: 'POST',
      data: {
        username: username,
        password: password
      },
      success: res => {
        // 将服务器返回的自定义登录态 token 存储到本地
        wx.setStorageSync('token', res.data.token);
        resolve(res.data);
      },
      fail: err => {
        reject(err);
      }
    });
  });
};
// 在登录页面中调用 login 函数进行登录
const handleLogin = () => {
  const username = '密码';
  const password = '用户名';
  login(username, password).then(res => {
    // 登录成功,跳转到首页
    wx.redirectTo({
      url: '/pages/home/index',
    });
  }).catch(err => {
    // 登录失败,提示错误信息
    wx.showToast({
      title: '登录失败,请重试!',
      icon: 'none'
    });
  });
};
  1. 后台相关逻辑

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const crypto = require('crypto');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 处理自定义登录请求
app.post('/api/login', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;
  // 根据用户名和密码查询用户信息
  const user = getUserByUsernameAndPassword(username, password);
  if (!user) {
    res.status(401).json({ message: '用户名或密码错误!' });
    return;
  }
  // 将用户信息存储到数据库中,生成自定义登录态 token 并返回
  const token = generateToken(user);
  res.json({ token: token });
});
// 生成自定义登录态 token
const generateToken = user => {
  const secret = '自己的secret key';
  const expireTime = new Date().getTime() + 24 * 3600 * 1000;
  const data = JSON.stringify({
    userId: user.id,
    expireTime: expireTime
  });
  const hash = crypto.createHmac('sha256', secret).update(data).digest('hex');
  const token = `${data}.${hash}`;
  return token;
};
// 根据用户名和密码查询用户信息
const getUserByUsernameAndPassword = (username, password) => {
  // TODO: 实现根据用户名和密码查询用户信息的逻辑
  return {
    id: 123,
    username: 'testuser',
    nickname: 'Test User'
  };
};
app.listen(3000, () => {
  console.log('Server started on port 3000.');
});

7. 请求配置 token

  1. 核心代码

// 假设 token 存在于本地缓存中,缓存的键名为 'token'
const token = wx.getStorageSync('token')
wx.request({
  url: 'https://xx.com/api/some-resource',
  header: {
    'Authorization': `Bearer ${token}`
  },
  success(res) {
    console.log(res.data)
  },
  fail(err) {
    console.error(err)
  }
})
  1. 通过 wx.getStorageSync() 方法获取本地缓存中存储的 token,
  2. 然后将其添加到header对象中的 Authorization 属性中,值为 Bearer ${token},
  3. 其中 Bearer 为固定字符串,${token}是变量,表示真正的 token 值。
  4. 最终发送的请求头会包含Authorization: Bearer ${token},其中 ${token} 会被替换为真实的 token 值。

参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
2月前
|
小程序 前端开发 持续交付
小程序全栈开发中的CI/CD流程与自动化部署是一种高效的开发模式。
本文探讨小程序全栈开发中的CI/CD流程与自动化部署,介绍持续集成与部署的概念,包括自动化构建、测试、代码审查及部署实践。通过提高代码质量、迭代速度及团队协作效率,确保小程序稳定运行与良好用户体验。
60 2
|
2月前
|
存储 前端开发 安全
|
2月前
|
存储 小程序 JavaScript
|
2月前
|
开发工具 Android开发
|
2月前
|
小程序 前端开发 安全
|
2月前
|
存储 前端开发 Java
|
2月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
62 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
2月前
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
61 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
下一篇
无影云桌面