一步步教会你微信小程序的登录鉴权

一步步教会你微信小程序的登录鉴权

2023年6月28日发(作者:)

⼀步步教会你微信⼩程序的登录鉴权前⾔为了⽅便⼩程序应⽤使⽤微信登录态进⾏授权登录,微信⼩程序提供了登录授权的开放接⼝。乍⼀看⽂档,感觉⽂档上讲的⾮常有道理,但是实现起来⼜真的是摸不着头脑,不知道如何管理和维护登录态。本⽂就来⼿把⼿的教会⼤家在业务⾥如何接⼊和维护微信登录态,下⾯话不多说了,来⼀起看看详细的介绍吧。接⼊流程这⾥官⽅⽂档上的流程图已经⾜够清晰,我们直接就该图展开详述和补充。

⾸先⼤家看到这张图,肯定会注意到⼩程序进⾏通信交互的不⽌是⼩程序前端和我们⾃⼰的服务端,微信第三⽅服务端也参与其中,那么微信服务端在其中扮演着怎样的⾓⾊呢?我们⼀起来串⼀遍登录鉴权的流程就明⽩了。1. 调⽤⽣成()这个API的作⽤就是为当前⽤户⽣成⼀个临时的登录凭证,这个临时登录凭证的有效期只有五分钟。我们拿到这个登录凭证后就可以进⾏下⼀步操作:获取 openid 和 session_({ success: function(loginRes) { if () { // example: 081LXytJ1Xq1Y40sg3uJ1FWntJ1LXyth } }});2. 获取openid和session_key我们先来介绍下openid,⽤过公众号的童鞋应该对这个标识都不陌⽣了,在公众平台⾥,⽤来标识每个⽤户在订阅号、服务号、⼩程序这三种不同应⽤的唯⼀标识,也就是说每个⽤户在每个应⽤的openid都是不⼀致的,所以在⼩程序⾥,我们可以⽤openid来标识⽤户的唯⼀性。参数appidsecretjs_code值⼩程序的appid⼩程序的secret前⾯调⽤派发的codegrant_type'authorization_code'从这⼏个参数,我们可以看出,要请求这个接⼝必须先调⽤()来获取到⽤户当前会话的code。那么为什么我们要在服务端来请求这个接⼝呢?其实是出于安全性的考量,如果我们在前端通过request调⽤此接⼝,就不可避免的需要将我们⼩程序的appid和⼩程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有⼼之⼈”,这就给我们的业务安全带来极⼤的风险。除了需要在服务端进⾏session_key的获取,我们还需要注意两点:1. session_key和微信派发的code是⼀⼀对应的,同⼀code只能换取⼀次session_key。每次调⽤() ,都会下发⼀个新的code和对应的session_key,为了保证⽤户体验和登录态的有效性,开发者需要清楚⽤户需要重新登录时才去调⽤()2. session_key是有失效性的,即便是不调⽤,session_key也会过期,过期时间跟⽤户使⽤⼩程序的频率成正相关,但具体的时间长短开发者和⽤户都是获取不到的function getSessionKey (code, appid, appSecret) { var opt = { method: 'GET', url: '/sns/jscode2session', params: { appid: appid, secret: appSecret, js_code: code, grant_type: 'authorization_code' } }; return http(opt).then(function (response) { var data = ; if (! || !n_key || e) { return { result: -2, errmsg: || '返回数据字段不完整' } } else { return data } });}3. ⽣成3rd_session前⾯说过通过 session_key 来“间接”地维护登录态,所谓间接,也就是我们需要 ⾃⼰维护⽤户的登录态信息 ,这⾥也是考虑到安全性因素,如果直接使⽤微信服务端派发的session_key来作为业务⽅的登录态使⽤,会被“有⼼之⼈”⽤来获取⽤户的敏感信息,⽐如rInfo()这个接⼝呢,就需要session_key来配合解密微信⽤户的敏感信息。那么我们如果⽣成⾃⼰的登录态标识呢,这⾥可以使⽤⼏种常见的不可逆的哈希算法,⽐如md5、sha1等,将⽣成后的登录态标识(这⾥我们统称为'skey')返回给前端,并在前端维护这份登录态标识(⼀般是存⼊storage)。⽽在服务端呢,我们会把⽣成的skey存在⽤户对应的数据表中,前端通过传递skey来存取⽤户的信息。可以看到这⾥我们使⽤了sha1算法来⽣成了⼀个skey:const crypto = require('crypto');return getSessionKey(code, appid, secret) .then(resData => { // 选择加密算法⽣成⾃⼰的登录态标识 const { session_key } = resData; const skey = encryptSha1(session_key); });

function encryptSha1(data) { return Hash('sha1').update(data, 'utf8').digest('hex')}4. checkSession前⾯我们将skey存⼊前端的storage⾥,每次进⾏⽤户数据请求时会带上skey,那么如果此时session_key过期呢?所以我们需要调⽤到ession()这个API来校验当前session_key是否已经过期,这个API并不需要传⼊任何有关session_key的信息参数,⽽是微信⼩程序⾃⼰去调⾃⼰的服务来查询⽤户最近⼀次⽣成的session_key是否过期。如果当前session_key过期,就让⽤户来重新登录,更新session_key,并将最新的skey存⼊⽤户数据表中。checkSession这个步骤呢,我们⼀般是放在⼩程序启动时就校验登录态的逻辑处,这⾥贴个校验登录态的流程图:

下⾯代码即校验登录态的简单流程:let loginFlag = rageSync('skey');if (loginFlag) { // 检查 session_key 是否过期 ession({ // session_key 有效(未过期) success: function() { // 业务逻辑处理 },

// session_key 过期 fail: function() { // session_key过期,重新登录 doLogin(); } });) else { // ⽆skey,作为⾸次登录 doLogin();}5. ⽀持emoji表情存储如果需要将⽤户微信名存⼊数据表中,那么就确认数据表及数据列的编码格式。因为⽤户微信名可能会包含emoji图标,⽽常⽤的UTF8编码只⽀持1-3个字节,emoji图标刚好是4个字节的编码进⾏存储。这⾥有两种⽅式(以mysql为例):1.设置存储字符集在mysql5.5.3版本后,⽀持将数据库及数据表和数据列的字符集设置为 utf8mb4 ,因此可在 /etc/ 设置默认字符集编码及服务端编码格式// [client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]character-set-client-handshake = FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_unicode_ci设置完默认字符集编码及服务端字符集编码,如果是对已经存在的表和字段进⾏编码转换,需要执⾏下⾯⼏个步骤:设置数据库字符集为 utf8mb4ALTER DATABASE 数据库名称 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;设置数据表字符集为 utf8mb4ALTER TABLE 数据表名称 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;设置数据列字段字符集为 utf8mb4ALTER TABLE 数据表名称 CHANGE 字段列名称 VARCHAR(n) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这⾥的 COLLATE 指的是排序字符集,也就是⽤来对存储的字符进⾏排序和⽐较的, utf8mb4 常⽤的collation有两种:utf8mb4_unicode_ci 和 utf8mb4_general_ci ,⼀般建议使⽤ utf8mb4_unicode_ci ,因为它是基于标准的 Unicode CollationAlgorithm(UCA) 来排序的,可以在各种语⾔进⾏精确排序。这两种排序⽅式的具体区别可以参考:2.通过使⽤sequelize对emoji字符进⾏编码⼊库,使⽤时再进⾏解码这⾥是sequelize的配置,可参考{ dialect: 'mysql', // 数据库类型 dialectOptions: {

charset: 'utf8mb4', collate: "utf8mb4_unicode_ci" },}最后前⾯讲了微信⼩程序如何接⼊微信登录态标识的详细流程,那么如何获取⼩程序中的⽤户数据以及对⽤户敏感数据进⾏解密,并保证⽤户数据的完整性,我将在下⼀篇⽂章给⼤家做⼀个详细地介绍。好了,以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687894168a54630.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信