微信小程序登录授权流程

网友投稿 1125 2022-11-15

微信小程序登录授权流程

微信小程序登录授权流程

openid:用户的唯一标识 session_key:本次登录的会话密钥(保证当前用户进行会话操作的有效性)

1. 调用wx.login生成code

​​wx.login()​​ 这个API的作用就是为当前用户生成一个临时的登录凭证,这个临时登录凭证的有效期只有五分钟。

wx.login({ success: res => { if (res.code) { app.globalData.code = res.code; // 获得code 存入全局 } else { console.log('获取用户登录态失败!' + res.errMsg); that.onLogin(); // 重新登录 } },});

2. 获取openid和session_key(后台服务器)

这个接口需要带上四个请求参数

function getSessionKey(code, appid, appSecret) { wx.request({ url: ' data: { appid: appid, secret: appSecret, js_code: code, grant_type: 'authorization_code', }, method: 'GET', success: function (res) { var obj = { openid: res.data.openid, // 用户唯一标识 session_key: res.data.session_key, // 会话密钥 unionid: res.data.unionid, // 用户在开放平台的唯一标识符 }; wx.setStorageSync('user', obj); }, });}

3. 生成3rd_session

那么我们如果生成自己的登录态标识呢,这里可以使用几种常见的不可逆的哈希算法,比如md5、sha1等,将生成后的登录态标识(这里我们统称为’skey’)返回给前端,并在前端维护这份登录态标识(一般是存入storage)。而在服务端呢,我们会把生成的skey存在用户对应的数据表中,前端通过传递skey来存取用户的信息。

可以看到这里我们使用了sha1算法来生成了一个skey:

const crypto = require('crypto');function encryptSha1(data) { return crypto.createHash('sha1').update(data, 'utf8').digest('hex');}const skey = encryptSha1(session_key);wx.setStorageSync(skey, skey);

4. 调用wx.checkSession()校验当前session_key是否已经过期

let loginFlag = wx.getStorageSync('skey');if (loginFlag) { wx.checkSession({ // 检查 session_key 是否过期 success: function () { //session_key 未过期,并且在本生命周期一直有效 // 业务逻辑处理 }, // session_key 过期 fail: function () { // session_key过期,重新登录 that.onLogin(); }, });} else { // 无skey,作为首次登录 that.onLogin();}

登录授权流程

function onLogin() { const that = this; wx.login({ success: res => { if (res.code) { app.globalData.code = res.code; // 获得code 存入全局 try { canIUseFlag = wx.canIUse('getSetting'); } catch (canIuseEX) {} if (canIUseFlag) { wx.getSetting({ // 获取用户的当前设置 判断是否授权 success: res => { // 表示scope.userInfo这个权限已经授权。 if (res.authSetting['scope.userInfo']) { // 调用wx.getUserInfo 获取用户信息 that.getUserInfo(); } else { // 表示scope.userInfo这个权限未授权。 // 向用户发起 scope.userInfo 授权请求 wx.authorize({ scope: 'scope.userInfo', success(rs) { // 调用wx.getUserInfo 获取用户信息 that.getUserInfo(); }, fail(rs) { console.log(rs); }, }); util.hideLoading(); return; } }, fail(rs) { console.log('用户暂未授权'); }, }); } } else { that.onLogin(); } }, fail(rs) { that.onLogin(); }, }); util.hideLoading();}// 获取用户信息function getUserInfo() { // 必须是在用户已经授权的情况下调用 wx.getUserInfo({ success: function (res) { let userInfo = res.userInfo; let wx_user_info = { nickName: userInfo.nickName, avatarUrl: userInfo.avatarUrl, gender: userInfo.gender, //性别 0:未知、1:男、2:女 province: userInfo.province, city: userInfo.city, country: userInfo.country, }; wx.setStorageSync('wx_user_info', wx_user_info); }, });}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Nodejs使用robot操作鼠标键盘
下一篇:TypeScript 简单入门
相关文章

 发表评论

暂时没有评论,来抢沙发吧~