扫码登录实现原理

本文详细介绍了扫码登录的实现原理,特别是微信扫码登录的流程。用户打开网页时,服务器生成唯一标识并存储,展示二维码。手机扫描后,服务器接收到用户信息,通过UUID关联用户,最终实现登录。涉及的技术包括二维码生成、服务器端UUID管理、微信开放平台接口等。
摘要由CSDN通过智能技术生成

    扫码登录实现原理

    来源:http://www.cnblogs.com/liyasong/

    今天说一说现在比较流行的扫码登录的实现原理。

    需求介绍

    首先,介绍下什么是扫码登录。现在,大部分同学手机上都装有qq和淘宝,天猫等这一类的软件。而开发这些app的企业,都有他们相对应的网站。为了让用户在使用他们的网站时,登录更加方便和安全。这些企业提供了, 使用手机,扫一扫,就可以登录的服务。网页登录时的效果如下:

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

    原理解释

    网页端+服务器

    接下来就是对于这个服务的详细实现。首先,大概说一下原理:用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求。服务器收到请求后,随机生成一个uuid,将这个id作为key值存入redis服务器,同时设置一个过期时间,再过期后,用户登录二维码需要进行刷新重新获取。同时,将这个key值和本公司的验证字符串合在一起,通过二维码生成接口,生成一个二维码的图片(二维码生成,网上有很多现成的接口和源码,这里不再介绍。)然后,将二维码图片和uuid一起返回给用户浏览器。

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

    这里确实会有用户的id信息,这个id信息是由手机服务器存入redis中的。具体操作如下:

    手机端+服务器

    话说,浏览器拿到二维码后,将二维码展示到网页上,并给用户一个提示:请掏出您的手机,打开扫一扫进行登录。用户拿出手机扫描二维码,就可以得到一个验证信息和一个uuid(扫描二维码获取字符串的功能在网上同样有很多demo,这里就不详细介绍了)。由于手机端已经进行过了登录,在访问手机端的服务器的时候,参数中都回携带一个用户的token,手机端服务器可以从中解析到用户的userId(这里从token中取值而不是手机端直接传userid是为了安全,直接传userid可能会被截获和修改,token是加密的,被修改的风险会小很多)。手机端将解析到的数据和用户token一起作为参数,向服务器发送验证登录请求(这里的服务器是手机服务器,手机端的服务器跟网页端服务器不是同一台服务器)。服务器收到请求后,首先对比参数中的验证信息,确定是否为用户登录请求接口。如果是,返回一个确认信息给手机端。

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

    登录成功

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

    登录原理图如下:

    扩展阅读

    SSM框架原理,作用及使用方法

    单点登录原理与简单实现

    微博爬虫“免登录”技巧详解及 Java 实现

    微信公众号:javafirst

    扫码关注免费获取更多资源 

            <div class="hide-article-box hide-article-pos text-center">
            <a class="btn-readmore" data-report-view="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xiamiflying/article/details/82719152&quot;,&quot;strategy&quot;:&quot;readmore&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_376&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xiamiflying/article/details/82719152&quot;,&quot;strategy&quot;:&quot;readmore&quot;}">
                展开阅读全文
                <svg class="icon chevrondown" aria-hidden="true">
                    <use xlink:href="#csdnc-chevrondown"></use>
                </svg>
            </a>
        </div>
            <div class="recommend-box"><div class="recommend-item-box type_blog clearfix" data-report-view="{&quot;mod&quot;:&quot;popu_387&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/gentlu/article/details/78592571&quot;,&quot;strategy&quot;:&quot;BlogCommendFromMachineLearnPai2&quot;,&quot;index&quot;:&quot;0&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_387&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/gentlu/article/details/78592571&quot;,&quot;strategy&quot;:&quot;BlogCommendFromMachineLearnPai2&quot;,&quot;index&quot;:&quot;0&quot;}">
    <div class="content" style="width: 852px;">
    	<a href="https://blog.csdn.net/gentlu/article/details/78592571" target="_blank" rel="noopener" title="java实现简单扫码登录功能(模仿微信网页版扫码)">
    	<h4 class="text-truncate oneline" style="width: 692px;">
    			java实现简单<em>扫码登录</em>功能(模仿微信网页版扫码)		</h4>
    	<div class="info-box d-flex align-content-center">
    		<p class="date-and-readNum oneline">
    			<span class="date hover-show">11-21</span>
    			<span class="read-num hover-hide">
    				阅读数 
    				3万+</span>
    			</p>
    		</div>
    	</a>
    	<p class="content" style="width: 852px;">
    		<a href="https://blog.csdn.net/gentlu/article/details/78592571" target="_blank" rel="noopener" title="java实现简单扫码登录功能(模仿微信网页版扫码)">
    			<span class="desc oneline">#java实现简单扫码登录功能jsp+spring+struts2+mybatis:-**模仿微信pc网页版扫码登录**-**使用js代码生成*qrcode*二维码减轻服务器压力**-**js循环请求...</span>
    		</a>
    		<span class="blog_title_box oneline ">
    								<span class="type-show type-show-blog type-show-after">博文</span>
    										<a target="_blank" rel="noopener" href="https://blog.csdn.net/gentlu">来自:	<span class="blog_title"> gentlu的博客</span></a>
    											</span>
    	</p>
    </div>
    </div>
    
    <div class="comment-edit-box d-flex">
    	<a id="commentsedit"></a>
    	<div class="user-img">
    		<a href="//me.csdn.net/weixin_38851693" target="_blank" rel="noopener">
    			<img class="" src="https://avatar.csdn.net/6/E/F/3_weixin_38851693.jpg">
    		</a>
    	</div>
    	<form id="commentform">
    		<input type="hidden" id="comment_replyId">
    		<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="想对作者说点什么"></textarea>
    		<div class="opt-box"> <!-- d-flex -->
    			<div id="ubbtools" class="add_code">
    				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
    			</div>
    			<input type="hidden" id="comment_replyId" name="comment_replyId">
    			<input type="hidden" id="article_id" name="article_id" value="82719152">
    			<input type="hidden" id="comment_userId" name="comment_userId" value="">
    			<input type="hidden" id="commentId" name="commentId" value="">
    			<div style="display: none;" class="csdn-tracking-statistics tracking-click" data-report-click="{&quot;mod&quot;:&quot;popu_384&quot;,&quot;dest&quot;:&quot;&quot;}"><a href="#" target="_blank" class="comment_area_btn" rel="noopener">发表评论</a></div>
    			<div class="dropdown" id="myDrap">
    				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
    				<div class="txt-selected text-truncate">添加代码片</div>
    				<svg class="icon d-block" aria-hidden="true">
    					<use xlink:href="#csdnc-triangledown"></use>
    				</svg>
    				</a>
    				<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
    					<li><a data-code="html">HTML/XML</a></li>
    					<li><a data-code="objc">objective-c</a></li>
    					<li><a data-code="ruby">Ruby</a></li>
    					<li><a data-code="php">PHP</a></li>
    					<li><a data-code="csharp">C</a></li>
    					<li><a data-code="cpp">C++</a></li>
    					<li><a data-code="javascript">JavaScript</a></li>
    					<li><a data-code="python">Python</a></li>
    					<li><a data-code="java">Java</a></li>
    					<li><a data-code="css">CSS</a></li>
    					<li><a data-code="sql">SQL</a></li>
    					<li><a data-code="plain">其它</a></li>
    				</ul>
    			</div>  
    			<div class="right-box">
    				<span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
    				<input type="button" class="btn btn-sm btn-cancel d-none" value="取消回复">
    				<input type="submit" class="btn btn-sm btn-red btn-comment" value="发表评论">
    			</div>
    		</div>
    	</form>
    </div>
    
    	<div class="comment-list-container">
    	<a id="comments"></a>
    	<div class="comment-list-box" style="display: none;">
    	</div>
    	<div id="commentPage" class="pagination-box d-none" style="display: none;"></div>
    	
    </div>
    
    <div class="recommend-item-box recommend-recommend-box"><div id="kp_box_59" data-pid="59" data-report-view="{&quot;mod&quot;:&quot;kp_popu_59-78&quot;,&quot;keyword&quot;:&quot;&quot;}" data-report-click="{&quot;mod&quot;:&quot;kp_popu_59-78&quot;,&quot;keyword&quot;:&quot;&quot;}"><script type="text/javascript">
    (function() {
        var s = "_" + Math.random().toString(36).slice(2);
        document.write('<div style="" id="' + s + '"></div>');
        (window.slotbydup = window.slotbydup || []).push({
            id: "u3491668",
            container:  s
        });
    })();
    

    java扫码登录

    08-07 阅读数 5142

    java扫码登录 博文 来自: LawsonJin's Blog

    微信扫码登录实战(附代码) - javafirst - CSDN博客

    7-9

    扫码登录实现原理解析 - Tssit的个人博客 - CSDN博客

    7-8

    <div class="recommend-item-box recommend-recommend-box"><div id="kp_box_60" data-pid="60" data-report-view="{&quot;mod&quot;:&quot;kp_popu_60-43&quot;,&quot;keyword&quot;:&quot;&quot;}" data-report-click="{&quot;mod&quot;:&quot;kp_popu_60-43&quot;,&quot;keyword&quot;:&quot;&quot;}"><div class="mediav_ad"><newsfeed class="newsfeed QIHOO__WEB__SO__1567588492849_563" id="QIHOO__WEB__SO__1567588492849_563" style="display:block;margin:0;padding:0;border:none;width:900px;height:84px;overflow-y:hidden;overflow-x:hidden;position:relative;text-align:left;"><info-div id="QIHOO__WEB__SO__1567588492849_563-info" style="zoom:1"><info-div class="QIHOO__WEB__SO__1567588492849_563 singleImage clk" data-href="https://ssxd.mediav.com/s?type=2&amp;r=20&amp;mv_ref=blog.csdn.net&amp;enup=CAAB0hYITAgAAkwIFtIA&amp;mvid=NjQwNjE3ODI3Mjg1MzA5MjAwNTAwMTk&amp;bid=13923ca3ba43db66&amp;price=AAAAAF1vgI4AAAAAAAw78QCzQezpP1CR3/nRwg==&amp;finfo=DAABCAABAAAA7AgAAgAAAOkEAAM/S2adwhHNOwAIAAIAAAADCgADaKjzHT12Er8IAAQAAAEaBgAGG4sGAAoAAAgADgAAADMKAA8AAAAAACQCwAA&amp;ugi=FcTgigEVyNtrTBUCFUAVXhUAABW6h+GeARaECBXIARaA/rW11O3IBRwWgda2grL/oue2ARUAAAA&amp;uai=FeTGlAIlAhUEFtK8n6WwgfWo0QEV8ggl3MurpwIlABUaFAAcFv+7h++J3+L0dxUAAAA&amp;ubi=FejnJBWkhJ4CFaD1xhUVwI36WBUGFRwWuonH+hQW0ry0jLrH+ajRATQCFqjgECUGFbTbnZ8FFZ4BFQAkFBbo5yQA&amp;clickid=0&amp;cpx=__OFFSET_X__&amp;cpy=__OFFSET_Y__&amp;cs=__EVENT_TIME_START__&amp;ce=__EVENT_TIME_END__&amp;ldtype=2&amp;csign2=aV75QrTCu0Z=&amp;url=http%3A%2F%2Fbaidu.code.jjyx.com%2Fhtmlcode%2F24889.html%3Fsourceid%3D%7Bsource_id%7D" data-pv="https://ssxd.mediav.com/s?type=1&amp;r=20&amp;tid=NjQwNjE3ODI3Mjg1MzA5MjAwNTAwMTk&amp;finfo=DAABCAABAAAA7AgAAgAAAOkEAAM/S2adwhHNOwAIAAIAAAADCgADaKjzHT12Er8IAAQAAAEaBgAGG4sGAAoAAAgADgAAADMKAA8AAAAAACQCwAA&amp;mv_ref=blog.csdn.net&amp;enup=CAAB0hYITAgAAkwIFtIA&amp;mvid=NjQwNjE3ODI3Mjg1MzA5MjAwNTAwMTk&amp;bid=13923ca3ba43db66&amp;ugi=FcTgigEVyNtrTBUCFUAVXhUAABW6h+GeARaECBXIARaA/rW11O3IBRwWgda2grL/oue2ARUAAAA&amp;uai=FeTGlAIlAhUEFtK8n6WwgfWo0QEV8ggl3MurpwIlABUaFAAcFv+7h++J3+L0dxUAAAA
    • 0
      点赞
    • 6
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值