微信二維碼登錄原理
在電腦上使用微信時,你可能已經(jīng)發(fā)現(xiàn)微信不提供傳統(tǒng)的賬號密碼登陸,取而代之的是通過掃描二維碼進行登陸。今天就要研究下次登陸方式微信時如何實現(xiàn)的?
1、每次用戶打開PC端登陸請求,系統(tǒng)返回一個***的uid,并將uid的信息繪制成二維碼返回給用戶。這里的uid一定是***的,否則就會造成你登陸了其他用戶的賬號或者其他用戶登陸你的賬號。
2、當(dāng)用戶使用登陸后的微信掃描該二維碼的時候,會將這個uid和手機上的微信賬號及密碼產(chǎn)生的token進行綁定,并上傳到服務(wù)器。
3、WEB通過JS不斷的向后端發(fā)起請求,查詢有沒有關(guān)于uid的登陸記錄(uid和token是否存在于服務(wù)器上)。實現(xiàn)代碼可以從微信頁面獲?。?/p>
- 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);
- });
- }
- }
- });
- }
網(wǎng)頁客戶端每500毫秒就向服務(wù)器發(fā)起ssl請求,請求當(dāng)前二維碼的登陸信息,如果返回結(jié)果201,則說明已經(jīng)獲取掃描二維碼終端相同的賬號登陸授權(quán),當(dāng)返回其他結(jié)果時,將在500毫秒之后重新發(fā)起請求。
類似微信登陸場景應(yīng)用場景還是很多,比如通過二維碼進行設(shè)備間的授權(quán)。比如使用手機遙控 裝有android系統(tǒng)的電視盒等。