现在的网站开发,都绕不开微信登录(毕竟微信已经成为国民工具)。虽然文档已经写得很详细,但是对于没有经验的开发者还是容易踩坑。
所以,专门记录一下微信网页认证的交互逻辑,也方便自己日后回查:
在多人团队协作中,加载资源的代码需要格外小心。因为可能会有多个开发者在同一业务逻辑下调用,这会造成资源的重复加载。
处理方法有两种,第一种是对外暴露多余接口,专门check是否重复加载。但是考虑到调用者每次在加载前,都需要显式调用check()方法进行检查,难免会有遗漏。
所以采用第二种方法--设计模式中的缓存模式,代码如下:
// 备忘录模式: 防止重复加载
export const loadWeChatJs = (() => {
let exists = false; // 打点
const src = '//res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'; // 微信sdk网址
return () => new Promise((resolve, reject) => {
// 防止重复加载
if(exists) return resolve(window.WxLogin);
let script = document.createElement('script');
script.src = src;
script.type = 'text/javascript';
script.onerror = reject; // TODO: 失败时候, 可以移除script标签
script.onload = () => {
exists = true;
resolve(window.WxLogin);
};
document.body.appendChild(script);
});
})();
根据《微信登陆开发指南》,将参数传递给window.WxLogin()即可。
// 微信默认配置
const baseoption = {
self_redirect: true, // true: 页内iframe跳转; false: 新标签页打开
id: 'wechat-container',
appid: 'wechat-appid',
scope: 'snsapi_login',
redirect_uri: encodeURIComponent('//1.1.1.1/'),
state: '',
};
export const loadQRCode = (option, intl = false, width, height) => {
const _option = {...baseOption, ...option};
return new Promise((resolve, reject) => {
try {
window.WxLogin(_option);
const ele = document.getElementById(_option['id']);
const iframe = ele.querySelector('iframe');
iframe.width = width? width : '300';
iframe.height = height? height : '420';
// 处理国际化
intl && (iframe.src = iframe.src + '&lang=en');
resolve(true);
} catch(error) {
reject(error);
}
});
};
在需要使用的业务组件中,可以在周期函数componentDidMount调用,下面是demo代码:
componentDidMount() {
const wxOption = {
// ...
};
loadWeChatJs()
.then(WxLogin => loadQRCode(wxOption))
.catch(error => console.log(`Error: ${error.message}`));
}
这一块我觉得是微信登陆交互中最复杂和难以理解的一段逻辑。开头有讲过,微信二维码渲染有2中方式,一种是打开新的标签页,另一种是在指定id的容器中插入iframe。
毫无疑问,第二种交互方式更友好,因为要涉及不同级层的页面通信,代码处理也更具挑战。
为了方便说明,请先看模拟的数据配置:
// redirect 地址会被后端拿到, 后端重定向到此地址, 前端会访问此页面
// redirect 地址中的参数, 是前端人员留给自己使用的; 后端会根据业务需要, 添加更多的字段, 然后一起返回前端
const querystr = '?' + stringify({
redirect: encodeURIComponent(`${window.location.origin}/account/redirect?` + stringify({
to: encodeURIComponent(window.location.origin),
origin: encodeURIComponent(window.location.origin),
state: 'login'
})),
type: 'login'
});
const wxOption = {
id: 'wechat-container',
self_redirect: true,
redirect_uri: encodeURIComponent(`//1.1.1.1/api/socials/weixin/authorizations${querystr}`) // 微信回调请求地址
};
按照上面的配置,我描述一下前端、用户端、微信服务器和后端交互的逻辑:
前端收到微信服务器传来消息,根据wxOption的redirect_uri参数,跳转到此url地址。注意:
前面流程走完了,现在的情况是页面中iframe的二维码区域,已经被替换成了/account/redirect?...的内容。
为了实现通信,需要在页面的周期中监听message事件,并在组件卸载时,卸载此事件:
componentDidMount() {
// ... ...
window.addEventListener('message', this.msgReceive, false);
}
componentWillUnmount() {
window.removeEventListener('message', this.msgReceive);
}
msgReceive(event) {
// 监测是否是安全iframe
if(!event.isTrusted) {
return;
}
console.log(event.data); // 获取iframe中传来的数据, 进一步进行逻辑处理
}
而在/account/redirect?...路由对应的组件中,我们需要解析路由中的params参数,按照业务逻辑检查后,将结果传递给前面的页面:
componentDidMount() {
// step1: 获取url中params参数
const querys = getQueryVariable(this.props.location.search);
// step2: 检查querys中的数据是否符合要求 ...
// step3: 向顶级页面传递消息
return window.parent && window.parent.postMessage('data', '*');
}
至此,微信网页认证的流程完成。
更多:关于iframe通信的更多细节,请查看MDN的文档
原文来自:https://godbmw.com/passages/2019-04-15-wechat-h5-login/
更多文章:https://github.com/dongyuanxin/blog
一个简单的HTML例子看看用户信息安全:标准的HTML语法中,支持在form表单中使用<input></input>标签来创建一个HTTP提交的属性,现代的WEB登录中,form表单会在提交请求时,会获取form中input标签存在name的属性,作为HTTP请求的body中的参数传递给后台,进行登录校验。
在我们的日常生活中,登录一个网站或 APP 时经常会选择微信、 QQ 或其他账号登录。这种情况我们就称为第三方登录。那么第三方登录的实现机制是什么呢?
本文中所说的QQ登录功能,是采用官方的OAuth2.0来实现的,这样有更多的自主权。另一种较为简单的JS-SDK开发方式,虽然非常简便,但自主性不够,所以没有采用。下文中所构造的URL,均使用了JavaScript的ES6语法。
在日常工作中,用户需要访问大量的信息资源,例如,用户首先要登录到操作系统中,然后进入各个应用系统。进入每一个系统都需要对用户的身份进行识别与验证,这样,用户需要提供多个用户帐号与口令,为了便于记忆
微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见 普通浏览器上实现微信登陆,并非开放API,需要向微信申请,仅个别开发者有此权限 H5平台的其他登陆,比如QQ登陆、微博登陆,uni-app未封装
做渗透测试有一段时间了,发现登录方面的问题特别多,想做个比较全面点的总结,我尽量写的全面点又适合新人,这篇文章可能需要点想象力,因为问题比较多我不可能去海找各种例子举出来
当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态。这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我们退出登录,或者保存的登录状态过期
利用 Express 中间件功能实现登录拦截。如果用户请求的路径需要登录后才能访问,将用户重定向到登录页面,登录成功后将用户重定向到原始请求路径。
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!