如何实现微信和淘宝的扫码登录 ?

【app扫码登录】Java app扫码登录功能实现 【代码】Java app扫码登录功能实现。 阅读详情

作者 :imtech

来源 :my.oschina.net/u/4231722/blog/3154805

1、引言

扫码登录这个功能,最早应该是微信的PC端开始搞,虽然有点反人类的功能(不扫码也没别的方式登录),但不得不说还是很酷的。

下面这张图,不管是IM开发者还是普通用户,应该很熟悉:

于是,搞IM产品的老板和产品经理们,从此又多了一个要抛给程序员们的需求——“为什么微信有扫一扫登录,而我们的没有?”。

好吧,每次只要是微信有的功能,IM程序员们想甩锅,难度就有点大了,毕竟老板们都都会想当然认为,微信有的“我”的IM产品里也得有。

既然无法回避,那就只能老老实实搞懂技术原理,然后自已使劲撸吧。

本文将简要的介绍扫码登录功能的技术实现逻辑,并实际结合淘宝、微信的扫码登录功能,学习和研究大厂主流应用的技术实现思路。

2、基本技术原理

2.1 扫码登录功能到底是什么样的?

首先介绍下什么是扫码登录。现在大部分同学手机上都装有微信、qq和淘宝这一类的软件。而这些app都有他们相对应的网页端。为了让用户在使用他们的网页时登录更加方便和安全,使用手机扫一扫就可以登录的服务,就显得自然而然了。

几个主流大厂应用扫码登录时的界面效果如下:

有很多小伙伴可能会感到很神奇,网页上只是显示了个二维码,它怎么就知道是哪个手机扫到了二维码,并且进行登录的呢?而且,登录完成以后,还能直接把用户信息显示给用户,真的是很神奇啊。

2.2 扫码登录功能的完整技术逻辑

1)网页端与服务器的配合逻辑:

接下来就是对于这个服务的详细实现。

首先用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求。服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,同时设置一个过期时间,再过期后,用户登录二维码需要进行刷新重新获取。

同时,将这个key值和本公司的验证字符串合在一起,通过二维码生成接口,生成一个二维码的图片(二维码生成,网上有很多现成的接口和源码,这里不再介绍)。然后,将二维码图片和uuid一起返回给用户浏览器。

浏览器拿到二维码和uuid后,会每隔一秒向浏览器发送一次,登录是否成功的请求。请求中携带有uuid作为当前页面的标识符。这里有的同学就会奇怪了,服务器只存了个uuid在redis中作为key值,怎么会有用户的id信息呢?

这里确实会有用户的id信息,这个id信息是由手机服务器存入redis中的。具体请继续阅读“手机端与服务器的配合逻辑”。

2)手机端与服务器的配合逻辑:

话说,浏览器拿到二维码后,将二维码展示到网页上,并给用户一个提示:请掏出您的手机,打开扫一扫进行登录。

用户拿出手机扫描二维码,就可以得到一个验证信息和一个uuid(扫描二维码获取字符串的功能在网上同样有很多demo,这里就不详细介绍了)。

由于手机端已经进行过了登录,在访问手机端的服务器的时候,参数中都会携带一个用户的token,手机端服务器可以从中解析到用户的userId(这里从token中取值而不是手机端直接传userid是为了安全,直接传userid可能会被截获和修改,token是加密的,被修改的风险会小很多)。手机端将解析到的数据和用户token一起作为参数,向服务器发送验证登录请求(这里的服务器是手机服务器,手机端的服务器跟网页端服务器不是同一台服务器)。

服务器收到请求后,首先对比参数中的验证信息,确定是否为用户登录请求接口。如果是,返回一个确认信息给手机端。

手机端收到返回后,将登录确认框显示给用户(防止用户误操作,同时使登录更加人性化)。用户确认是进行的登录操作后,手机再次发送请求。服务器拿到uuId和userId后,将用户的userid作为value值存入redis中以uuid作为key的键值对中。

3)登录成功时的逻辑:

然后,浏览器再次发送请求的时候,浏览器端的服务器就可以得到一个用户Id,并调用登录的方法,生成一个浏览器端的token,再浏览器再次发送请求的时候,将用户信息返回给浏览器,登录成功。这里存储用户id而不是直接存储用户信息是因为,手机端的用户信息,不一定是和浏览器端的用户信息完全一致。

4)详细的技术原理总结如下图所示:

3、淘宝的扫码登录技术实现

本节我们以淘宝的扫码登录为例,来实际研究分析一下淘宝的扫码登录实现逻辑。

登录界面 https://login.taobao.com/member/login.jhtml 传回来的参数为:

然后请求(GET)报文是这样的:

https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do?lgToken=2c3b4d53ef0513787bf4ce711ea5ba53&defaulturl=&_ksTS=1540106757739_2804&callback=jsonp2805

关键的就是lgToken,是网页的唯一ID,当打开了二维码登录的时候,网页在轮询(应该是长轮询long polling)调用接口去请求服务器。扩展:彻底理解cookie,session,token

如果没有扫码,返回的为:

如果扫了的话则会返回:

{
    "code": "10001",
    "message": "mobile scan QRCode success",
    "success": true
}

长时间没有扫码的话,网页端会停止轮询,二维码失效!

当手机端确认登录后,接口返回的是:

{
"code": "10006",
"success": true,
 "url": "https://login.taobao.com/member/loginByIm.do?uid=cntaobaoxxx&token=ff82fc0d1d395a33d3b38ec5a4981336&time=1530179143250&asker=qrcodelogin&ask_version=1.0.0&defaulturl=https://www.taobao.com&webpas=0b7aed2d43f01825183e4a49c6cae47d1479929926"
}

表示登录成功,当然手机端与服务端在点击"确认登录"之间的交互可能就是这样:网页端生成的lgToken去请求服务端,服务端记住了这个lgToken并认为登录了,当网页端再次轮询请求接口时,就返回真正的登录态Token,网页端此时就可以凭着这个Token来登录了。

详细的技术逻辑如下图所示:

4、微信的扫码登录技术实现

4.1 技术原理流程图

微信的网页版访问地址是:https://wx.qq.com/,有兴趣也可以自行深入研究。

4.2 实际的技术实现逻辑

1)获取唯一的uuid, 以及包含uid信息的二维码:

// 获取uuid
getUUID: function() {
    vare = t.defer();
    returnwindow.QRLogin = {},
    $.ajax({
        url: i.API_jsLogin,
        dataType: "script"
    }).done(function() {
        200 == window.QRLogin.code ? e.resolve(window.QRLogin.uuid) : e.reject(window.QRLogin.code)
    }).fail(function() {
        e.reject()
    }),
    e.promise
}

2)浏览器轮询服务器,获取扫码状态:

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

3)根据服务器返回的扫码状态,进行相应的操作:

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

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

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

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

具体的代码示例如下:

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

functiono(c) {
    switch(c.code) {
    case200:
        t.newLoginPage(c.redirect_uri).then(function(t) {
            varo = t.match(/<ret>(.*)<\/ret>/)
                , r = t.match(/<script>(.*)<\/script>/)
                , c = t.match(/<skey>(.*)<\/skey>/)
                , s = t.match(/<wxsid>(.*)<\/wxsid>/)
                , l = t.match(/<wxuin>(.*)<\/wxuin>/)
                , d = t.match(/<pass_ticket>(.*)<\/pass_ticket>/)
                , f = t.match(/<message>(.*)<\/message>/)
                , u = t.match(/<redirecturl>(.*)<\/redirecturl>/);
            returnu ? void (window.location.href = u[1]) : o && "0"!= o[1] ? (alert(f && f[1] || "登录失败"),
            i.report(i.AUTH_FAIL_COUNT, 1),
            void location.reload()) : (e.$emit("newLoginPage", {
                Ret: o && o[1],
                SKey: c && c[1],
                Sid: s && s[1],
                Uin: l && l[1],
                Passticket: d && d[1],
                Code: r
            }),

            void (a.getCookie("webwx_data_ticket") || n.report(n.ReportType.cookieError, {
                text: "webwx_data_ticket 票据丢失",
                cookie: document.cookie
            })))
        });
        break;

    case201:
        e.isScan = !0,
        n.report(n.ReportType.timing, {
            timing: {
                scan: Date.now()
            }
        }),
        t.checkLogin(e.uuid).then(o, function(t) {
            !t && window.checkLoginPromise && (e.isBrokenNetwork = !0)
        });
        break;

    case408:
        t.checkLogin(e.uuid).then(o, function(t) {
            !t && window.checkLoginPromise && (e.isBrokenNetwork = !0)
        });
        break;

    case400:

    case500:

    case0:
        vars = a.getCookie("refreshTimes") || 0;
        s < 5 ? (s++,
        a.setCookie("refreshTimes", s, .5),
        document.location.reload()) : e.isNeedRefresh = !0;
        break;

    case202:
        e.isScan = !1,
        e.isAssociationLogin = !1,
        a.setCookie("login_frequency", 0, 2),
        window.checkLoginPromise && (window.checkLoginPromise.abort(),
        window.checkLoginPromise = null),
        r()
    }

    e.code = c.code,
    e.userAvatar = c.userAvatar,
    a.log("get code", c.code)

}

4.3 小结

微信网页端扫码登录时,轮询的数据返回采用的是JSONP的形式,这是为了解决跨域问题。如对JSONP不了解的,可以参考:

http://www.52im.net/thread-1038-1-1.html

微信网页端扫码登录时,轮询采用了后台根据扫码情况阻塞前台请求,优化轮询及减少前端的无效轮询。这种技术,请详见:

http://www.52im.net/thread-338-1-1.html

5、本文小结

扫码登录这个功能,现在已经不只出现有IM应用里,各种带有移动端的线上网站也都有了这个功能,所以本文中介绍的技术原理并不局限于只用于实现IM应用中的扫码登录。

另外,为了方便抓取真实的数据进行分析研究,本文中的PC端案例分析是针对的是网页端,但实际上如果你的PC端是富客户端(也就是.exe、.dmg这样的安装版),原理也是一样的,而且还不需要考虑浏览器里的跨域问题等。

阅读本文时,可能涉及到传统的Web端即时通讯技术(为了扫码登录的实时性),比如长轮询等,如果您对这些技术还不太了解的话,可以系统学习一下即时通讯网整理的有关Web端即时通讯方面的资料。

(完)
推荐阅读:举世闻名的 SQL 注入是什么?这个漫画告诉你!Spring的Bean生命周期,11 张高清流程图及代码,深度解析程序员 6 个接私活的网站,你有技术就有钱!
如何在面试中介绍自己的项目经验?SpringBoot实现过滤器、拦截器与切片好文!必须点赞
springboot整合微信(公众号)实现扫码登录(两种方式,两种实现) springboot整合微信实现扫码登录,公众号推送,网站跳转 阅读详情

相关推荐

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

本次安装实验基于苹果m2芯片的mac系统,使用vmware fusion搭建三台ubuntu24分布式虚拟机,确保在三台机器上安装了Java jdk8,并配置了免密码登录,网络互通,防火墙关闭,授时服务器已经同步。访问apche官网源,下载3.3.4版本,我们用二进制通用版即可,因为hadoop运行在java环境,跨平台性使得无需编译arm架构版本。至此,Hadoop的安装完成,包括hdfs文件存储系统,mapreduce计算框架,yarn资源管理系统均能正常、稳定使用。

qq_31412425的博客 2161

扫码登录如何实现

通过已经登录过的APP应用去扫描未登录的Web端程序的二维码。通过某种机制触发登录凭证的写入,从而去实现Web端的这种登录的这样的一个过程。 首先在网页端打开登录页面,展示一个二维码。这个二维码里面有一个唯一的编号,是服务器端生成的,然后浏览器定时去轮询这个二维码的状态。接下来在APP端去扫描这个二维码。把APP端的token信息二维码ID发送到Server端。Server收到请求后去修改二维码的扫码状态,并生成一个临时的token。这个时候,网页端展示的二维码状态会提示已扫码待确认。

qq_46130027的博客 1620

LLC混合滞回控制 vs 电压模/电流模:UCC25640x仿真对比与选型指南

在开关电源设计中,LLC谐振变换器的环路补偿是核心难点。传统电压模控制(VMC)和电流模控制(CMC)在LLC拓扑上存在环路增益漂移、动态响应慢等局限。混合滞回控制通过滞回比较器直接调制开关频率,并融合输出电压与谐振腔电流信息,实现了自适应环路增益和快速瞬态响应。该技术显著提升轻载效率与动态性能,适用于高密度适配器、快充及车载充电机等场景。本文基于UCC25640x系列,通过仿真对比三种控制策略,为工程选型与调试提供实践参考。

weixin_33925615的博客 336

扫码登录的设计实现

在实际的项目开发中,扫码登录的设计和实现还需要考虑更多的安全性、用户体验和错误处理等方面的问题。同时,根据不同的应用场景和需求,可能还需要对登录流程进行一些定制化的调整和优化。但以上的基本设计原理和代码示例可以为实现扫码登录功能提供一个初步的参考框架。扫码登录是一种便捷的登录方式,用户通过使用手机扫描在其他设备(如电脑网页、平板应用等)上显示的二维码,来实现快速登录到相应的应用或系统中。它利用了二维码的快速识别和信息传递特性,以及移动设备的便捷性,无需用户手动输入账号和密码,提高了登录的效率和安全性。

m0_57836225的博客 3589

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4220

MitoZ|动物线粒体基因组组装注释软件

一、MitoZ是什么 是基于python3开发的可以自动过滤双端测序的原始数据、mt基因组组装、mt基因组注释以及mt基因组可视化的工具。 官方的说明文档地址:https://gitee.com/CHANyp/MitoZ#citation 二、MitoZ的安装 git clone https://gitee.com/CHANyp/MitoZ.git cd MitoZ/version_2.4-alpha tar -jxvf release_MitoZ_v2.4-alpha.tar.bz2 三、运行Mito

qq_50637636的博客 1万+

微信扫码登录

后台生成随机code与Channel进行关联——>然后请求微信的接口,将这个登录码code转成一个带参数的二维码链接——>返回给前端,前端就爱你个二维码链接转成二维码图片展示。**重点:**维护两个Map,两个通道,比如B发消息,就能够找到哪个Channel通道,根据这个channel接收消息,两个通道是因为多端的原因。我们推送的授权信息是一个微信授权地址,用户点击后,微信就会回调我们的系统,并且获取一个重定向的地址给用户展示。,而通过这个code又能得到用户关联的channel,我们就能关联起来了。

weixin_57128596的博客 1225

使用CAPL实现DoIP刷写

本文介绍了使用CAPL实现基于DoIP协议的ECU刷写方法,包含完整源码。

qq_56033302的博客 2762

微信和淘宝扫码登录背后的实现原理

1、引言 扫码登录这个功能,最早应该是微信的PC端开始搞,虽然有点反人类的功能(不扫码也没别的方式登录),但不得不说还是很酷的。 下面这张图,不管是IM开发者还是普通用户,应该很熟悉: 于是,搞IM产品的老板和产品经理们,从此又多了一个要抛给程序员们的需求——“为什么微信有扫一扫登录,而我们的没有?”。 好吧,每次只要是微信有的功能,IM程序员们想甩锅,难度就有点大了,毕竟老板们都都会想当然认为,...

mm445296564的博客 2573

【机械臂算法】机械臂动力学参数辨识仿真

本文以puma560m机械臂为例子进行动力学参数辨识的讲解,puma560m可以在robotic toolbox中找到,这里以它真实机械臂对他的动力学参数进行辨识。此外这里还有要说的是,机械臂参数辨识其实是一个系统工程,其中和系统的机械、电子、嵌入式都有着很深的联系,并不是仿真这么简单的。

vrijheid的博客 7838

flowable工作流看这一篇就够了(基础篇)

接下来我们构建一个非常简单的请假流程,Flowable引擎需要流程定义为BPMN 2.0格式,这是一个业界广泛接受的XML标准。在Flowable术语中,我们将其称为一个流程定义(process definition)。一个流程定义可以启动多个流程实例(process instance)。流程定义可以看做是重复执行流程的蓝图。在这个例子中,流程定义定义了请假的各个步骤,而一个流程实例对应某个雇员提出的一个请假申请。

qq_38196449的博客 2万+

微信和淘宝的扫码登录,技术上是怎么实现的?

点击“技术领导力”关注∆每天早上8:30推送作者:imtechmy.oschina.net/u/4231722/blog/31548051、引言扫码登录这个功能,最早应该是微信的P...

技术领导力 2316

双目相机标定理论与编程实现

双目相机标定是计算机视觉中的重要任务,通过确定双目相机的内参和外参,可以实现立体视觉的深度感知和三维重建。通过使用OpenCV库提供的函数,我们可以方便地进行双目相机的标定工作。双目相机标定是计算机视觉中的重要任务,用于确定双目相机的内参和外参,以实现立体视觉的深度感知和三维重建。通过上述代码,我们可以获得左右相机的内参矩阵、畸变系数、旋转矩阵和平移矩阵等参数,从而完成双目相机的标定过程。使用双目相机采集一系列左右相机的图像,确保标定板在不同位置和角度下都能被双目相机拍摄到。函数来检测标定板的角点。

ByteKnight的博客 325

淘宝和微信的扫码登录实现原理

目录 基本技术原理 扫码登录功能到底是什么样的? 扫码登录功能的完整技术逻辑 1)网页端与服务器的配合逻辑: 2)手机端与服务器的配合逻辑: 3)登录成功时的逻辑: 4)详细的技术原理总结如下图所示: 淘宝的扫码登录技术实现 微信的扫码登录技术实现 技术原理流程图 实际的技术实现逻辑 1)获取唯一的uuid, 以及包含uid信息的二维码: 2)浏览器轮询服务器,获取扫码状...

灵熙云工作室 1184

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何实现微信和淘宝的扫码登录

由于手机端已经进行过了登录,在访问手机端的服务器的时候,参数中都会携带一个用户的token,手机端服务器可以从中解析到用户的userId(这里从token中取值而不是手机端直接传userid是为了安全,直接传userid可能会被截获和修改,token是加密的,被修改的风险会小很多)。然后,浏览器再次发送请求的时候,浏览器端的服务器就可以得到一个用户Id,并调用登录的方法,生成一个浏览器端的token,再浏览器再次发送请求的时候,将用户信息返回给浏览器,登录成功。请求中携带有uuid作为当前页面的标识符。

z_ssyy的博客 1446

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java+登录window域认证网页_微信和淘宝扫码登录背后的实现原理

1、引言2、基本技术原理2.1 扫码登录功能到底是什么样的?2.2 扫码登录功能的完整技术逻辑3、淘宝的扫码登录技术实现4、微信的扫码登录技术实现4.1 技术原理流程图4.2 实际的技术实现逻辑4.3 小结5、本文小结《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品...

weixin_39870664的博客 297

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 你们心心念念的 GitHub 客户端终于来了!
下一篇: 如何模拟超过 5 万的并发用户
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值