Express实战个人订阅号实现网站登录

今天我们来实现一个使用个人订阅号实现网站的功能,后端使用的是 express 。其它框架原理基本一致,只是定义路由或返回响应数据部分代码跟 express 有所出入。先来一波效果图:

发送登录关键字,获取验证码

输入验证码,进行验证

1. 前言

20 年 3 月在掘金写过一篇文章,介绍了使用 express 开发微信公众号的案例: 原文地址。当时使用的 nodejs 版本还是 v8.x,现如今,nodejs 的最新长期稳定版已经来到了 v18.16.0, 新特性尝鲜版更是已经到了 v20.1.0

nodejs版本

不得不感慨时间之飞逝,nodejs 的版本升级之路见证了技术的飞速进步,也见证了我发际线的飞速退后。

2. 为何要用订阅号去登录

看了看掘金,发现掘金的登录注册分为两种:

  • 手机号验证码注册
  • 第三方登录(支持微信扫码、微博、Github)

企业站来说,这种方式固然好,给了用户提供了更多的选择。

但是对于个人站点,这种方式就不太友好了,因为:

手机号接收验证码注册:1 条短信 1 毛钱,10 条就是 1 块,100 条就能吃个豪华早餐了

接入微信开放平台是需要企业资质的。我一个打工人,上哪儿去搞企业资质?这就是一道坎,更别说后续接入的繁琐流程了。

Github 倒是不需要,不过接入也麻烦,弃之!

微博?用户没有微博账号是不是还得去注册个微博账号?弃!

那就普通的注册吧?填写用户名、密码、确认密码、输入邮箱,邮箱验证码确认?弃!

那么,它来了!订阅号注册免费,花极少的时间去接入

用户只需关注公众号,反手输入个登录,回车!Ctrl + CV。欸,很快啊,登录成功!

相对于传统的注册填一大堆资料 + 确认密码 + 验证码,孰好孰坏,熟快熟慢,一试便知。

而且,且看下图,它对于保护用户隐私来说,是极好的,因为开发者只能拿到用户的 OpenID,头像和昵称都不给你!

用户信息只能拿到OpenID

不过, 有 OpenID 就足够了,毕竟它对于当前公众号来说,是 唯一的

唯一的OpenID

3. 公众号后台配置

完整的接入指南详见: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

进入微信公众平台

设置与开发 -> 基本配置 -> 公众号开发信息 -> IP 白名单中配置你的服务器 IP

设置与开发 -> 基本配置 -> 服务器配置(未开启的需要先开启)

image.png

  • URL 是你的后端服务对应验证授权的接口地址,也就是你后端服务部署后绑定了域名的接口地址。举例: https://www.xxx.com/wechat

  • Token 这块的 Token 按照平台提示的规则自定义即可,注意,需要和上面代码中的 Token 相对应,不然会验证不成功。

  • EncodingAESKey 是消息加解密密钥,这个可以随机生成,也可以自定义

  • 消息加解密方式 选择明文模式即可

填写好上面这些内容之后,我们先不必急着点击提交,因为这个时候服务还没部署,服务器是无法正常响应微信服务器的验证请求,必然会提交失败。

且看下文

4. 登录流程梳理

我们简单的梳理一下登录流程:

  1. 首先是需要在网站需要登录的地方,放置一个公众号的二维码,并用醒目的文字给用户提示:关注公众号后发送 “登录” ,获取登录所需要的验证码

  2. 后台接收到用户请求,判断用户发送的内容的确是 “登录” 关键字,返回一个验证码给用户,并将当前验证码存起来

  3. 用户输入验证码,后台根据存起来的验证码进行验证,验证成功,返回登录成功,否则,登录失败

5. 定义服务端路由,处理验证逻辑及服务端部署

5.1 定义授权验证接口

主要是验证消息的确来自微信服务器

import express from "express";
import jsSHA from "jssha";
const router = express.Router();
router.get("/wechat_mp", (req, res, next) => {const token = "这里是自定义Token,可自定义,内容规则详见下文";//1.获取微信服务器Get请求的参数 signature、timestamp、nonce、echostrconst { signature, timestamp, nonce, echostr } = req.query;//2.将token、timestamp、nonce三个参数进行字典序排序const array = [token, timestamp, nonce].sort();//3.将三个参数字符串拼接成一个字符串进行sha1加密const tempStr = array.join("");const shaObj = new jsSHA("SHA-1", "TEXT");shaObj.update(tempStr);const scyptoString = shaObj.getHash("HEX");//4.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if (signature === scyptoString) {console.log("验证成功");res.send(echostr);} else {console.log("验证失败");res.send("验证失败");}
});

5.2 处理用户 “登录” 消息

接下来我们定义用户发送消息的逻辑:

image.png

当用户发送文本消息给公众号的时候,微信服务器会将用户发送的消息以 XML格式 的参数去请求这个接口,只不过这个时候,我们需要通过 POST 请求来接收参数。

先上代码:

定义POST接口

import { parseString } from "xml2js";
import myCache from "../store";
/*** 随机6位验证码*/
function randomCode() {return Math.random().toString().slice(-6);
}
/*** 回复文字消息封装*/
function sendTextMsg(toUser, fromUser, content) {let resultXml = "<xml><ToUserName><![CDATA[" + fromUser + "]]></ToUserName>";resultXml += "<FromUserName><![CDATA[" + toUser + "]]></FromUserName>";resultXml += "<CreateTime>" + new Date().getTime() + "</CreateTime>";resultXml += "<MsgType><![CDATA[text]]></MsgType>";resultXml += "<Content><![CDATA[" + content + "]]></Content></xml>";return resultXml;
}
router.post("/wechat_mp", function (req, res) {var buffer = [];req.on("data", function (data) {buffer.push(data);});// 内容接收完毕req.on("end", function () {var msgXml = Buffer.concat(buffer).toString("utf-8");parseString(msgXml, { explicitArray: false }, function (err, result) {if (err) throw err;result = result.xml;const { ToUserName, FromUserName, MsgType, Content } = result;if (MsgType === "text" && Content === "登录") {const code = randomCode();// 这里的FromUserName就是用户的OpenIDmyCache.set(code, FromUserName, 1 * 60 * 5);const sendXml = sendTextMsg(ToUserName,FromUserName,`您的登录验证码是:${code}  ,  有效期为5分钟`);res.send(sendXml);}});});
});

store/index.js

import NodeCache from "node-cache";
const myCache = new NodeCache();
export default myCache;

代码解释:

  • XML 解析:可以通过安装 xml2js 这个库来解析 XML 格式的参数

  • 接化发:检测到用户发送 消息类型text 且内容为 登录 关键字的时候,我们去生成一个 6位随机验证码 ,再将验证码和用户的 OpenIDkey(code)、value(OpenId) 的格式存入 存入 node-cache 中,并设置有效期为 5分钟,同时将随机验证码发送给用户。

发送登录关键字,获取验证码

5.3 处理网站登录逻辑

上一步,用户已经在微信公众号上获取到了随机验证码,现在只需要在网站需要登录的地方输入验证码,调用验证码校验接口即可进行校验。

输入验证码,进行验证

定义验证码校验接口

import myCache from "../store";
router.get("/verify", async function (req, res) {const { code } = req.query;const OpenID = myCache.get(code);if (OpenID) {const token = "使用OpenID进行jwt鉴权颁发Token";res.json({code: 200,data: { token },});} else {res.json({code: 400,msg: "您输入的验证码有误或已过期,请重新输入!-_-",});}
});

代码解释:

根据用户输入的验证码,去 node-cache 中获取 OpenID,如果存在,则说明验证码正确,jwt 鉴权颁发 Token。反之,校验失败。

验证码校验成功后,通过唯一的 OpenID 和自定义的 secret 给用户颁发 Token,用户再次访问网站的时候,只需要携带 Token 即可进行鉴权。

关于 jwt 鉴权概念、流程及使用,大家可以参考这条 AI 问答分享:


我在ChatGPTer(https://ai.iiter.cn)网站上创建了一个AI对话分享,快来看看吧!「jwt鉴权概念、流程」链接:https://ai.iiter.cn/#/share/6465c5a2e82a696c417bbfa9

同时,也欢迎大家自己进行 AI 问答: https://ai.iiter.cn

5.4 部署服务

服务部署这块大家可以参考我之前写的一篇傻瓜式部署文章:宝塔面板结合 pm2 进程管理工具部署前端项目

当然,您也可以使用自己顺手的部署方式

5.5 提交公众号配置

服务部署成功后,回到我们的 公众号后台配置 部分,点击提交即可

结语

至此,我们的个人订阅号登录功能就已经完成了,相信基于以上,大家都可以很快的去做出一个网站登录功能出来

而且在给用户提供服务的同时,可以直接将用户引导至自己的公众号上。不管是后面对网站的更新记录,还是一些重要的通知,都可以通过公众号进行消息推送,一举两得

好了,今天的文章分享就到这里了,如果对大家有所帮助的话,希望您不要吝啬手中的赞呦~

正式给大家介绍一下:

基于 OpenAIAPI 开发的一款 ChatGPT 网站,模型是gpt-3.5-turbo,使用的是本篇文章的同款登录方式,欢迎大家体验

免费!免费!免费!https://ai.iiter.cn

image.png

image.png

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36428.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐四个phpstorm酷炫实用插件 让你写代码的时候不在孤单!

程序员写代码很孤独&#xff0c;每天只能和电脑屏幕交流&#xff0c;想要一个程序员鼓励师妹子&#xff0c;老板又不给配&#xff0c;如何让自己写代码的时候不再孤单呢&#xff1f;今天给大家分享的这四个插件&#xff0c;既实用又好玩&#xff0c;还能提高开发效率&#xff0…

风控业务中的信用与欺诈的定义区别

风险控制是指风险管理者采取各种措施和方法&#xff0c;消灭或减少风险事件发生的各种可能性&#xff0c;或者减少风险事件发生时造成的损失。 小额现金贷的风控为弱风控&#xff0c;主要包括欺诈风险和信用风险2方面&#xff1a; 欺诈风险的识别&#xff0c;核心手段是信息核…

风控数据分析-反欺诈

python信用评分卡&#xff08;附代码&#xff0c;博主录制&#xff09; https://study.163.com/course/introduction.htm?courseId1005214003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 目前贷款的风控因为每一个样本的收集都需要放款…

Facebook第三方登录对接

一、背景调研 1、什么是第三方登录&#xff1f; 第三方登录是基于用户在第三方平台上已有的账号和密码来快速完成己方应用的登录或者注册的功能。而这里的第三方平台&#xff0c;一般是已经拥有大量用户的平台&#xff0c;国外的比如Facebook&#xff0c;Twitter等&#xff0…

原来支付宝、财付通每天都是这样对账、风控的!

为了可以更好地解释支付结算系统对账过程&#xff0c;我们先把业务从头到尾串起来描述一下场景&#xff0c;帮助大家理解&#xff1a;一个可能得不能再可能的场景&#xff0c;请大家深刻理解里面每个角色做了什么&#xff0c;获取了哪些信息&#xff1a; 某日阳光灿烂&#xff…

虚拟机网络发生错误,需要运行NetworkManager

虚拟机网络发生错误&#xff0c;需要运行NetworkManager 你只需要在root用户中输入systemctl start NetworkManager.service这一条简单的指令就行

VCSA7.0访问提示no healthy upstream故障解决方案

打开vCenter网页显示no healthy upstream报错&#xff0c;报错如图 解决办法&#xff1a; 1、使用SSH访问VSCA主机。 2、输入如下命令&#xff0c;检查证书有效期&#xff0c;发现__MACHINE_CERT证书到期。 for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do …

PG数据库提示: FATAL: sorry, too many clients already

目录 场景&#xff1a; idea启动提示如下错误 翻译&#xff1a; 连接数相关查询&#xff1a; 原因分析&#xff1a; 解决方法&#xff1a; 场景&#xff1a; idea启动提示如下错误 org.postgresql.util.PSQLException: FATAL: sorry, too many clients alreadyat org.pos…

vCenter Server出现no healthy upstream的解决方法

一天&#xff0c;访问vCenter&#xff0c;浏览器报&#xff1a;no healthy upstream&#xff0c;其他什么也没有 该 网上找了一些故障原因&#xff0c;诸如&#xff1a;vCenter Server部分服务没有运行&#xff0c;或者运行出现错误&#xff1b;vCenter Server设置的DNS服务器出…

GPT-4 太香了!

4月30日&#xff0c;OpenAI官方悄悄发布了联网版GPT-3.5。虽然名字变了&#xff0c;但使用体验却是换汤不换药&#xff0c;还是那套。 然而&#xff0c;万万没想到的是&#xff0c;刚过去没几天&#xff0c;昨天5月4日&#xff0c;鱼哥发现自己的Plus账号竟然多了一些能力&…

该为 GPT-4 降温了

文 / 韩彬&#xff08;微信公众号&#xff1a;量子论&#xff09; 昨天&#xff0c;微信里讨论GPT-4发布会内容的信息此起彼伏&#xff0c;我的心头又温暖又难过&#xff0c;感觉像是回到了乔布斯还在世的时候&#xff0c;大家激动讨论苹果发布会的那些日子。 同时&#xff0c;…

太炸了!GPT-4 Plus又推出新功能了!

最近Open AI 在GPT-4 Plus又更新了新功能。 支持Web Browsing with GPT-4 & Code Interpreter 新功能是按照plugin的方式集成的。如果有plus账号的朋友&#xff0c;可以去官方https://openai.com/blog/chatgpt-plugins&#xff0c;申请&#xff0c;也可以第一时间体验上面的…

Android开发之智能聊天机器人

Android开发之智能聊天机器人 一&#xff1a;效果图二:注册图灵机器人,获取api1.进入图灵机器人官网注册,已有账号的可直接登录2.点击创建机器人3.创建好机器人之后会得到一个ApiKey(如图所示)4.下面就要拼接Api地址了(拼接方法如图所示) 三.下面就是具体实现的代码了1.首先是布…

■ Android集成百度语音识别

实现这个功能的目的,是我看见我公司硬件工程师给客户回答问题的时候用公司研发的APP,每次都是手动输入打字,看着他带着老花镜的样子,于心不忍,毕竟咱就是干这个的. 实现效果 集成 百度语音实时识别 https://ai.baidu.com/sdk#asr AndroidManifest.xml 文件 <uses-permis…

百度云助力微信小程序图文识别,让你的应用更加高效智能

前言 如今人们对于信息的获取需求越来越高&#xff0c;而图像识别技术的发展为我们带来了更加便捷高效的信息获取方式。微信小程序作为一种新型的应用形态&#xff0c;越来越受到用户的青睐。而本文将为大家介绍微信小程序基于百度云的图文识别技术。让我们一起来看看微信小程序…

chatGPT 和AlphaGo下围棋,谁赢?垂域大模型有戏么?

这边来的少&#xff0c;但发个文章通报下近况&#xff0c;长期做AI产研、投融资工作后&#xff0c;后续主要在企业数字化与大模型结合的方向上&#xff0c;后续进展还是请关注&#xff1a;琢磨事。 上一篇提到最终大模型的格局很可能是有一个偏通用大模型&#xff0c;比如chatG…

chatgpt赋能python:用Python实现高效搜索文献

用Python实现高效搜索文献 作为研究学者&#xff0c;面对日益增多的文献量&#xff0c;如何高效地搜索文献成为了一大难题。然而&#xff0c;Python的强大功能和丰富的科学计算库为我们提供了一种新的解决方案。本文将介绍如何使用Python进行文献搜索&#xff0c;帮助广大学者…

浅浅了解一下SSM框架,全网最新

一.SSM框架初体验 作为当下流行的企业开发MVC开源框架&#xff0c;SSM框架是我们Java程序猿必须熟练掌握的知识点, SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合. SSM框架是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#x…

浅浅的分享一下2022年ISCC

WEB 冬奥会&#xff1a;你来参加2022届冬奥会&#xff0c;想知道冬奥会的主办方想告诉你什么吗&#xff1f;题目入口&#xff1a;59.110.159.206:7060 我们根据审计可知需要我们构造 josn 然后 get 传参&#xff0c;需要绕过的地方&#xff1a; 1.is_numeric()对 year 的过滤…

冷热数据浅浅见

冷热数据浅浅见 一、前言二、冷热数据的标准&#xff08;判断&#xff09;三、判断冷热数据的算法3.1 基于数据结构特点的判断算法3.1.1 传统的方法3.1.2 改进的方法 3.2 基于统计学上的判断算法3.3 基于机器学习的判断算法 四、总结五、参考 一、前言 这个星期看了关于目前数…