场景题相关

微信的扫码登录是如何实现的

扫码登录具体的每个步骤:

image

①:用户 A 访问微信网页版,微信服务器为这个会话生成一个全局唯一的 ID,上面的 URL 中 obsbQ-Dzag== 就是这个 ID,此时系统并不知道访问者是谁。

②:用户A打开自己的手机微信并扫描这个二维码,并提示用户是否确认登录。

③:手机上的微信是登录状态,用户点击确认登录后,手机上的微信客户端将微信账号和这个扫描得到的 ID 一起提交到服务器

④:服务器将这个 ID 和用户 A 的微信号绑定在一起,并通知网页版微信,这个 ID 对应的微信号为用户 A,网页版微信加载用户 A 的微信信息,至此,扫码登录全部流程完成

浏览器是如何得知用户已经扫码的呢
答:浏览器轮询服务器,获取扫码状态

// 查看扫码状态
checkLogin: function(e, a) {
    var n = t.defer()
        , a = a || 0;
    return window.code = 0,
    window.checkLoginPromise = $.ajax({
        url: i.API_login + "?loginicon=true&uuid=" + e + "&tip=" + a + "&r=" + ~new Date,
        dataType: "script",
        timeout: 35e3
    }).done(function() {
        new RegExp("/" + location.host + "/");
        if (window.redirect_uri && window.redirect_uri.indexOf("/" + location.host + "/") < 0)
            return void (location.href = window.redirect_uri);
        var e = {
            code: window.code,
            redirect_uri: window.redirect_uri,
            userAvatar: window.userAvatar
        };
        n.resolve(e)
    }).fail(function() {
        n.reject()
    }),
    n.promise
}

然后再根据服务器返回的扫码状态,进行相应的操作

*   408 扫码超时 如果手机没有扫码或没有授权登录,服务器会阻塞约25s,然后返回状态码 408 -> 前端继续轮询

    ![image](//upload-images.jianshu.io/upload_images/14742999-06d0289a4e2b2afc.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)

    ![image](//upload-images.jianshu.io/upload_images/14742999-2043a0cdc24a7676.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)

*   400 二维码失效 大约5分钟的时间内不扫码,二维码失效

    ![image](//upload-images.jianshu.io/upload_images/14742999-947e22b0abe02df6.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)

*   201 已扫码 如果手机已经扫码,服务器立即返回状态码和用户的基本信息 (window.code=201,window.code.userAvator="..."),-> 前端继续轮询

    ![image](//upload-images.jianshu.io/upload_images/14742999-44d09ab883d6e7a6.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)

*   200 已授权 如果手机点击了确认登录,服务器返回200及token -> 前端停止轮询, 获取到token,重定向到目标页

    ![image](//upload-images.jianshu.io/upload_images/14742999-f64e5128a60fa09e.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
// 根据服务器返回的扫码状态,进行相应的操作
function o(c) {
    switch (c.code) {
    case 200:
        t.newLoginPage(c.redirect_uri).then(function(t) {
            var o = t.match(/(.*)<\/ret>/)
                , r = t.match(/
                    
                    

你可能感兴趣的:(场景题相关)