扫码登陆 之我见

    • 摘要
    • 原理
      • 打开网页
      • 扫码阶段
        • 验证阶段
    • 准备
      • 搭建环境

        • 服务器环境
        • 第三方依赖
    • 后端
      • 数据库
      • 生成二维码
      • 处理确认登陆请求
    • 前端
    • 效果
      • 首页
      • 扫码
    • 拓展
      • 轮询
      • 超时
      • 扫描后失效
    • 总结

摘要

前几天买阿里云服务器的时候,被扫码登陆给吸引到了。然后就一直在琢磨自己的实现方式。也许是巧合吧,昨晚竟然在梦中找到了一个自认为还不错的实现思路。但是已经凌晨了,为了防止忘记,赶紧写了个小纸条放在床边。于是今天上午就着手编码做了个雏形。

作此文,以记之。

原理

感觉还是应该先进行声明一下。

纯属个人拙见,如果有些许不当,还望海涵。

按照我扫码登陆的亲身经历,可以分为下面几个阶段。

打开网页

拿阿里云来说,打开首页点击登录按钮之后,就会跳转到下面的这个网页,让我们使用阿里云手机客户端 扫码。

扫码阶段

其实我们可能会很疑惑,为什么一扫码, 人家就能知道咱扫过了呢?而且就这么真的登陆成功了?

其实如果让我自己来做的话,关键就在于这个阿里云手机客户端。众所周知,二维码只是个用于传递数据的工具,它本身并不能帮助我们确认是否被扫码,被谁扫了。

但是关键就在于这个数据。其实这个数据至关重要,因为借助此数据,手机客户端才能“定位”(这个词不是特别贴切,看完后面的相信就可以明白了。)

验证阶段

然后手机客户端,将客户端上已经登录的您的账号,加上这个数据

  • 如果在时效内确认,则会登陆成功。

  • 如果时效内未进行验证,则二维码失效。

如此将需要的数据进行打包,然后向服务器发送一个请求,然后服务器通过这个数据 定位到数据库中相关的登录表上,然后添加登陆的用户的用户名,确认登陆。然后登陆标记记为已登录, 状态。

好了,大致的整个流程就是这样了,是不是很容易也可以理解呢。

准备

“工欲善其事,必先利其器”,所以咱们还是先着手搭建一个好用的环境吧。

搭建环境

可能每个人使用的软件版本会有所不同,但是基本上都是可以正常工作的,如果您正确安装了的话。 下面罗列一下我自己的环境。

服务器环境

  • PHP5.2.8
  • Apache2.2
  • MySQL5.7

第三方依赖

另外,本次试验要完成的是扫码登陆,所以必不可少的要生成二维码。在PHP中生成二维码的方式有很多,比较常用的是:

然后为了更加方便的进行HTML元素的操作,就把JQuery也拿过来好了。

不过这不是必须需要的,如果不想用,可以用原生的JavaScript来实现。

我用的是

jquery-2.2.4.min.js

后端

我感觉上面原理熟悉了之后,后台设计就应该很简单了。先来看看目录结构吧(比较散乱,吸取教训哈)。

数据库

因为这次试验主要是为了实现扫码登陆,所以就直接设计一个登录表好了,虽然实际中肯定不是这样的。也比这要复杂的多。

id就作为上面讲述的那个特殊的数据

而创建时间createtime 则是为了时效。而存在。

其余字段不再过多解释。

生成二维码

借助PHP的QRCode库,其实是很方便的。

<?php
    error_reporting(E_ALL);
    ini_set(‘error_reporting‘, ‘1‘);
session_start();
include "./phpqrcode/phpqrcode.php";

$value = uniqid();
$errorCorrectionLevel = "L";
$matrixPointSize = "4";

// session storage
$_SESSION[‘uuid‘] = $value;
// 向数据库中插入生成的数据
    $link = mysql_connect(‘localhost‘, ‘root‘, ‘root‘) or die(mysql_error());
    mysql_query(‘set names utf8‘);
    mysql_select_db(‘test‘);

    $createtime = date("Y-m-d H:i:s");
    $account = ‘guest‘;
    $isscanned = 0;
    $issuccess = mysql_query("insert into qrcode values(‘$value‘, ‘$account‘, ‘$createtime‘, $isscanned)") or die(mysql_error());

    //var_dump($issuccess);

    if($issuccess==1){
        QRcode::png($value, false, $errorCorrectionLevel, $matrixPointSize);
    }else{
        echo "insert into db failed!";
    }

?>

虽然代码中向数据库中插入了游客账号,但是这并不影响接下来客户端发送请求后对登陆用户及信息的更改。

然后需要注意的是记得在代码的开始处开启session,不然有可能会出错。

处理确认登陆请求

处理登陆请求其实也算是重中之重了。所以handler.php的责任义不容辞。

<?php
    session_start();
    header("Content-Type: text/json;charset=UTF-8");

    $uuid = $_REQUEST[‘uuid‘];
//  echo $uuid;

    // 获取到数据库中与此uuid一致的那一行的用户信息
    $link = mysql_connect(‘localhost‘, ‘root‘, ‘root‘) or die(mysql_error());
    mysql_query(‘set names utf8‘);
    mysql_select_db(‘test‘);

    $resultset = mysql_query("select * from qrcode where id= ‘$uuid‘") or die(mysql_error());
    while(($row=mysql_fetch_array($resultset))) {
        $result[] = $row;
    }
    mysql_close($link);

    echo json_encode($result);

?>

至于作用嘛,就是网页前台那块用于更改登陆者信息。使用ajax轮询的方式对登录表进行查询,从而来实时的更新状态信息。

前端

好了,后台已经搭建好了,这个时候就可以好好的写写前端的代码了。我本人不太懂设计这块,所以就简单的写了下,聊表心意算了。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
        <title>二维码扫描登陆</title>
        <style>
            .container {
                width: 600px;
                height: 480px;
                position: absolute;

                background: gray;
                left: 50%;
                margin-left: -300px;
            }

            .header {
                width: 100%;
                height: 64px;
                position: relative;

                background: black;
            }

            .main {
                width: 80%;
                height: 340px;
                position: relative;

                left: 50%;
                margin-left: -30%;
                top: 12%;               

                background: url(921555.png) no-repeat;
                background-size: contain;
            }   

            ul {
                margin: 0px;
                padding: 0px;
                width: auto;
                list-style: none;

                position: relative;
            }
            ul >li {
                float: right;
                position: relative;
            }

            /*    设计显示二维码的空间*/
           .qrcontainer{
                width: 300px;
                height: 300px;
                top: 64px;

                position: relative;
                background: green;
           }
           .qrcontainer > img {
            width: 100%;
            height: 100%;
           }

        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">

                <ul>
                    <font color="white" size="6" style="margin-top: 6px;">二维码扫描登陆测试</font>
                    <li><font color="white" size="6"><a href="#">登陆</a>/&nbsp;<a href="#">注册</a></font></li>
                </ul>
            </div>
            <div class="main">
                <img id="photo" src="" />
            </div>
        </div>

        <div class="qrcontainer">
            <img id="qrcode" src=‘./qrcode.php‘/>
        </div>

        <input type="hidden" name="uuid" value="<?php session_start(); echo $_SESSION[‘uuid‘];?>"/>

    </body>
    <script src="jquery-2.2.4.min.js"></script>
    <script>
        $(document).ready(function(){
            var uuid = document.getElementsByName(‘uuid‘)[0].value;
            // 想法是通过ajax轮询,请求服务器上的登录状态信息
            $.ajax({
                url: ‘./handler.php‘,
                type: ‘POST‘,
                async: true,
                data: {
                    ‘uuid‘: uuid
                },

                timeout: 5000,
                dataType: ‘json‘,

                success: function(result){
                    document.getElementById("photo").src = ‘photo.jpeg‘;
                    $(".qrcontainer").css(‘display‘, ‘none‘);
                    console.log(result);
                },
                error: function(){
                    console.log(‘额,AJAX请求出错了!‘);
                }

            });

        });
    </script>

</html>

效果

观看完人家阿里云的,再来看咱自己的。额,瞬间感觉档次下降了好多啊。

首页

先来看看首页效果图

扫码

扫码这块,我没有另外写一个app。其实原理了解了就行了。 App的作用就是将扫描到的二维码的UUID值,加上用户的用户名等信息传给服务器。

这个时候服务器就可以根据UUID查找到刚才插入到数据库上的信息,然后进行信息的更新操作即可。操作比较简单,这里就不再进行演示了。

前台通过ajax请求就可以获取到:是谁登陆了?这些信息。

这里通过添加一张图片来验证确实通过了验证请求。

查看一下后台发送过来的数据,也可以进一步进行验证的啦。

拓展

基本上效果已经实现的差不多了。但是做的仍然不够好。我觉得可以从下面几个角度进行加强。

轮询

上面的代码没有进行轮询处理。其实完全可以设置一个Inerval来进行的。这样才能更加逼真的体现实时性的特点。

超时

想必您也已经看到了数据库中设计好的createtime字段。之所以设置这样的一个字段,就是为了让二维码在一定是的时段内有效。这样可以进一步加强登录操作的安全性。

至于优化部分,使用JavaScript很容易啦。不过多叙述。

扫描后失效

这一点可以通过isscanned字段进行控制。当然了,离不开ajax的配合。通过对此字段的“监控”。就可以很容易的实现这一个效果。

总结

回顾一下本次实验。主要是实现了一个非权威的扫码登陆功能,(雏形一个)。

然后根据代码本身,找到了几个可以进行优化和拓展的方向。想来进一步的话,做成一个更加完善的扫码登陆,也会水到渠成的。

时间: 2024-10-08 01:17:15

扫码登陆 之我见的相关文章

网页版微信和微信公共号扫码登陆原理分析

看到知乎上有关于微信扫码登陆原理的讨论.现将自己的分析结果写出来,供大家参考,不正确的地方望指正. 用户打开网页版微信: https://wx.qq.com/,微信为用户生成了一张包含uuid的二维码,然后前台向后台发送轮询请求,查询此uuid是否已被绑定上登录签名.但如果uuid尚未绑定登录签名,后台不回立即返回结果,而是会阻塞30秒左右,在30秒内仍未扫描成功,后台会返回一个结果码.结果码的值为408,代表微信客户端尚未扫描. 发送轮询请求,判断uuid是否绑定了用户的登陆签名 如果30秒内

微信扫码登陆(JAVA)

在web端用到weChat扫码登录,在手机扫码登陆成功后,跳转到相应的界面. 1.第一步请求code 调用接口:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect; 参数信息说明: 参数 是否必须 说明 appid 是 应用唯一标识 redire

spring boot项目之卖家扫码登陆获取openid(微信身份验证id)

卖家扫码登陆获取openid 注:此功能只能是微信公众帐号能够使用,个人账号无此功能. 一.打开微信开放平台(与支付阶段不同,特别注意!!!),进入网站应用的网站应用微信登陆开发指南. 二.你会发现和之前支付功能一样,基本步骤如下 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数:2. 通过code参数加上AppID和AppSecret等,通过API换取access_token:3. 通过access_token

微信扫码登录asp微信扫码登陆代码

网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录用户名,全程自动操作更方便.源码是用asp写的,mdb的数据库,微信扫描电脑网页上的二维码实现登录. 只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的.我这个asp写好的代码和微信开放平台不同,微信开放平台

python-Web-django-qq扫码登陆

1.建路由 2.写qq登录的a链接 3 在控制器的loginQq的方法:拼接url,跳转到这个url: 去:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=111111&redirect_uri=http://127.0.0.1:8000/blog/returns&state=123456 4 当用手机扫码成功后,网址自动跳回回调地址: 回:http://127.0.0.1:8000/blog

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能.近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆.百度后发现,有很多仁兄已经做过类似的功能了. 如这篇文章: 实现网站二维码扫描登录 仔细研究后,发现很多平台都提供了类似的功能,如百度.微博.OSChina等.因此考虑设计一款软件,将此项功能推广到其他平台和应用场景.毕竟可以方便像我这样的懒人.经过一番捣鼓后,初步版本已经基本完成了, 网站地址:http://it.maerdym.cn/mm_mishu/

C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登陆处理. 1.开放平台的认证 要使用网站的扫码登录处理,就需要先进行微信开放平台帐号的开发者资质认证,提交相关的资料,以及交付每年300元的认证费用. 认证后,建立相关的网站应用后,就有相关的APPID和APPSecret了,这些关键的参数就可以用来获取相关的用户信息了. 网站应用的应用详情界面如下

鼎汉微信扫码群发系统开发爆客系统开发

爆客系统软件开发,爆客裂变系统,找.小师1.8.8-3.8.0.7-6.8.0.5微/电,扫码群发系统 微信扫二维码自动群发软件 微信扫码群发软件 神奇信息二维码系统开发定制. 当您走在大街上,有人向你发放宣传单,你是接过还是一笑而过,你接过是看一眼还是走过宣传单人后直接扔掉呢?在快节奏的生活状态下,绝大部分是看都不看内容的.这种情况很普遍的. 移动互联网的时代,门店做活动还是依托纷发广告宣传单的话,那效果显然不理想的.不仅花费大把的广告费用,而且效果也甚小的. 鼎汉科技自主研发一款爆客神器,革

扫码登录原理及实现

由于扫码登录比账号密码登录更方便.快捷.灵活,在实际使用中更受到用户的欢迎. 本文主要介绍了扫码登录的原理及整体流程,包含了二维码的生成/获取.过期失效的处理.登录状态的监听. 扫码登录的原理 整体流程 为方便理解,我简单画了一个 UML 时序图,用以描述扫码登录的大致流程! 总结下核心流程: 请求业务服务器获取用以登录的二维码和 UUID. 通过 websocket 连接 socket 服务器,并定时(时间间隔依据服务器配置时间调整)发送心跳保持连接. 用户通过 APP 扫描二维码,发送请求到