下面介绍二维码扫描登录原理,
首先需要web服务端,和app客户端。
web服务端主要工作是生成二维码,检测客户端提交信息正确性,更新网页界面。
app客户端主要工作是扫描二维码,提交账户信息(此不是指提交用户名和密码),与服务端通信。
那么二维码扫描登录有什么优势呢?
1 简单快捷
只需要app客户端扫描二维码,点击确认登录就完成登录了。
2 安全
在与客户端通信过程中不提供用户名和密码信息,断绝了以往直接在PC端登录木马窃取用户账户密码的行为。
那么二维码扫描登录是怎么工作的呢?
1 web服务端需要生成了一个唯一KEY,代表此次用户的登录事件ID,跟你在京东买东西下单的单号差不多。
2 根据唯一KEY生成二维码信息,显示在网页上。
3 用户app扫描二维码,后通知服务端我已经扫描了二维码。
4 服务端接收消息后,更新网页提示说已经扫描,把唯一KEY加入将要登录列表,如果超时将会移除(相当于把单号状态改为待支付状态,超过24小时就会说下单失败)。
5 用户app端主动获取当前状态,如果唯一KEY没有超时或者没有异常,将会跳转到app端的确认登录页面。
6 用户点击确认登录后,与服务端通信,提交用户名和密码验证值(可以考虑其他方案)。
7 web服务端接收后,判断验证值是否与数据库的验证值匹配,如果匹配确认用户登录。
9 用户app端检测服务端返回值,处理当前返回状态,登录成功,失败。
扫描二维码登录原理
由于二维码的发展。现在二维码的用处是越来越大了。很多地方都可以见到二维码的影子,比如二维码支付,二维码登录,等。在此之前我们先了解下二维码以下是来自百度百科的解释 :
二维码(Two-dimensional code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中,可实现的应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共享等。如今智能手机扫一扫(简称313)功能的应用使得二维码更加普遍。
二维码可以存储信息。通过扫描可以获取二维码上面的信息,获取到之后就可以经过处理加工查询等一些操作。下面是一个二维码扫描登录的例子大致原理如图所示:
- 首先,服务器端要生成一个二维码在浏览器端输出,这就是我们在浏览器上见到的二维码。这里我们生产一个不重复的guid。为了避免登录错位。
- 此时浏览器二维码页面的脚本就会不停的发异步到服务器,返回用户是否登录成功的结果。在登录成功之前或者二维码实现之前不停的发送异步。设置一分钟二维码失效。
- 用户登录app,app此时有了用户登录过的加密信息。通过扫描二维码获取到唯一的guid,也就是授权码,将guid和用户信息一起打包发送给服务器做验证。认证结果发送给前端脚本所做的请求。
- 前端如果返回认证成功那么做登陆跳转,其他做相应的处理。
本文由免费oa系统 78oa原创,转载请注明出处
微信二维码登录原理
在电脑上使用微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆。今天就要研究下次登陆方式微信时如何实现的?
AD:
在电脑上使用微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆。今天就要研究下次登陆方式微信时如何实现的?
1、每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户。这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号。
2、当用户使用登陆后的微信扫描该二维码的时候,会将这个uid和手机上的微信账号及密码产生的token进行绑定,并上传到服务器。
3、WEB通过JS不断的向后端发起请求,查询有没有关于uid的登陆记录(uid和token是否存在于服务器上)。实现代码可以从微信页面获取:
- function _poll(_asUUID) {
- var _self = arguments.callee,
- _nTime = 0;
- _sCurUUId = _asUUID;
- _logInPage("_poll Request Start, time: " + new Date().getTime());
- _nTime = new Date().getTime();
- $.ajax({
- type: "GET",
- url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,
- dataType: "script",
- cache: false,
- timeout: _nAjaxTimeout,
- success: function(data, textStatus, jqXHR) {
- _logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");
- switch (_aoWin.code) {
- case 200:
- _sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;
- _logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");
- clearTimeout(_oResetTimeout);
- $.get(_aoWin.redirect_uri + "&fun=new", function(msg) {
- _logInPage("new func reponse, reponseMsg: " + msg);
- _reportNow("new func reponse, reponseMsg: " + msg);
- var code = msg.match(/<script>(.*)<\/script>/);
- if(code){
- eval(code[1]);
- }else{
- $("#container").show();
- $("#login_container").hide();
- }
- });
- _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");
- break;
- case 201:
- clearTimeout(_oResetTimeout);
- show_tip = 0;
- $('.errorMsg').hide();
- $('.normlDesc').hide();
- $('.successMsg').show();
- _logInPage("First Request Success");
- _reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);
- // setTimeout(function(){
- _logInPage("Second Request Start");
- _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);
- _sSecondRequestTime = new Date().getTime();
- _nAjaxTimeout = 5 * 1000;
- _self(_asUUID);
- // }, 500);
- break;
- case 408:
- setTimeout(function(){
- _self(_asUUID);
- }, 500);
- break;
- case 400:
- case 500:
- _reset();
- _afterLoadWebMMDo(function(){
- _aoWin.Log.d("500, Login Poll Svr Exception");
- });
- break;
- }
- },
- error: function(jqXHR, textStatus, errorThrown) {
- if (textStatus == 'timeout') {
- setTimeout(function(){
- _self(_asUUID);
- }, 500);
- } else {
- setTimeout(function(){
- _self(_asUUID);
- }, 5000);
- _logInPage("_poll Request Error:" + textStatus);
- _afterLoadWebMMDo(function(){
- _aoWin.Log.e("Login Poll Error:" + textStatus);
- });
- }
- }
- });
- }
网页客户端每500毫秒就向服务器发起ssl请求,请求当前二维码的登陆信息,如果返回结果201,则说明已经获取扫描二维码终端相同的账号登陆授权,当返回其他结果时,将在500毫秒之后重新发起请求。
类似微信登陆场景应用场景还是很多,比如通过二维码进行设备间的授权。比如使用手机遥控 装有android系统的电视盒等。