2019年3月

laravel-5.6 【mews/captcha】图片验证码 api接口形式获取、验证,不通过session

[mews/captcha]

扩展GitHub地址: https://github.com/mewebstudio/captcha

前期准备与说明

在laravel 中使用此扩展,正常的用法是通过session来保存与验证用户输入的验证码是否正确,但我目前的项目是前后台彻底分离的。前台使用vue框架来搭建,后台用laravel来做api后台的接口。前后台通过jwt来标识用户。所以没法使用session来使用这个扩展,百度了好久,无用,最终还是在官方论坛找到解决方案,在此贴出方案,以便后来人查阅

  1. 在laravel中引入此扩展【我的框架版本laravel5.5】

    composer require mews/captcha
    
  1. 找到config/app.php下的providers,添加如下代码

    \Mews\Captcha\CaptchaServiceProvider::class,
    
  2. 找到config/app.php下的aliases,添加如下代码

    'Captcha' => Mews\Captcha\Facades\Captcha::class,
    
  3. 发布配置文件

    php artisan vendor:publish
    

    之后便可以在 config/captcha.php下,配置验证码

   return [
    'characters' => '2346789abcdefghjmnpqrtuxyzABCDEFGHJMNPQRTUXYZ',

    'default'   => [
        'length'    => 9,
        'width'     => 120,
        'height'    => 36,
        'quality'   => 90,
        'math'      => true,
    ],

    'flat'   => [
        'length'    => 6,
        'width'     => 160,
        'height'    => 46,
        'quality'   => 90,
        'lines'     => 6,
        'bgImage'   => false,
        'bgColor'   => '#ecf2f4',
        'fontColors'=> ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f',     '#f57c00', '#795548'],
        'contrast'  => -5,
    ],

    'mini'   => [
        'length'    => 3,
        'width'     => 60,
        'height'    => 32,
    ],

    'inverse'   => [
        'length'    => 5,
        'width'     => 120,
        'height'    => 36,
        'quality'   => 90,
        'sensitive' => true,
        'angle'     => 12,
        'sharpen'   => 10,
        'blur'      => 2,
        'invert'    => true,
        'contrast'  => -5,
    ]

];

正文开始

因为正常用session的使用方案比较简单,在此不赘述。
下面放上通过api来验证的前后端的关键代码

  1. PHP返回验证码

    // 路由
    Route::get('GetCaptchaImg','UserController@GetCaptchaImg')->name("GetCaptchaImg");
    // 代码
    public function GetCaptchaImg(Request $request){
        return app('captcha')->create('inverse', true);
    }
    
    说明:这里返回的url.img是base64后的图片,可直接放入img标签中的src属性中。key值是与图片绑定的数值,之后需传给后台验证。
    
  2. PHP关键验证代码

    // 路由
    Route::post('CheckCaptcha','UserController@CheckCaptcha')->name("CheckCaptcha");
    // 代码
    public function CheckCaptcha(Request $request){
        $key = $this->FormCheck->isEmpty($request->key,'验证码key');
        if (!$key->code) {
            return result($key->msg);
        }
        $captcha = $this->FormCheck->isEmpty($request->captcha,'验证码');
        if (!$captcha->code) {
            return result($captcha->msg);
        }
    
        if (!captcha_api_check($request->captcha, $request->key)){
            return $this->Resources('验证失败', 0, []);
        }
        return $this->Resources('验证成功', 1, []);
    }
    
  3. 验证结果
    验证码2.png
    验证码.png

ZeroTier内网穿透教程

ZeroTier内网穿透教程

前言

有时候需要在外边访问家里的设备,而众所周知一般家里都没有固定 IP 的,这时候就要内网穿透了,说到穿透的时候,大家都会提到 DDNS(动态域名解析),或者使用反向代理的方式如 FRP、Ngrok。

首先说说 DDNS,这种方式使用起来很方便,只要设置好相应的服务提供商的 API,就能做到每次 IP 变化后自动解析,这样不管家里 IP 怎么变,用域名都能访问回家。这里最大的硬伤就是公网IP,有些朋友的带宽就是个大局域网,路由器只能获取到上一级内网的 IP,这时就 GG 了。

然后是 FRP、Ngrok 这样的反向代理程序,通过服务器转发数据来达到外网访问的目的,这样就需要自己有个 VPS,或者使用他人搭建的服务,据我所知的免费服务都是限速的,要是自己搭建的话,体验就要看服务器的网络质量了。

现在我们就来看看,不需要公网 IP,不依赖服务端网络性能的 ZeroTier。

简介

ZeroTier 官网上说
!!! 适用于地球的智能网络交换机 …

它是一个分布式网络虚拟机管理程序,建立在加密安全的全球对等网络之上。它提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能,而且可以跨本地和广域网并连接几乎任何类型的应用程序或设备。

好吧,有点牛逼

而说到主要功能,就是可以把多个不同网络的设备连接在一起,用来就像在一个局域网下

例如,我在路由器上装了 ZeroTier,路由器挂了一个硬盘,而现在我在外边想要访问这个硬盘,那么只需要运行电脑上的 ZeroTier,就能通过 Samba、FTP 等方式访问硬盘,而且看起来就像我就在家里一样。

基本原理介绍

说白了就是 P2P(Peer to Peer),而且组织方式很像 DNS(关于 DNS 可以看这里)

根服务器 R 记录了路径信息,设备 A 能通过ZeroTier唯一地址标识找到需要连接的设备 B

这个过程如下:

  1. A 想要将数据包发送到 B,但由于它没有直接路径,因此将其向上发送到 R。
  2. 如果 R 有直接链接到 B,它会转发数据包给 B。否则它会继续向上游发送数据包,直到达到行星根(planet)。行星根知道所有节点,所以如果 B 在线,最终数据包将到达 B。
  3. R 还向 A 发送一个名为会和的消息,包含有关它如何到达 B 的提示。同时,将会和发给 B,通知 B 它如何到达 A。
  4. A 和 B 获取它们的会合消息并尝试相互发送测试消息,可能会对 NAT 或状态防火墙进行穿透。如果这样可以建立直接链路,则不再需要中继。
  5. 如果无法建立直接路径,则通信可以继续中继(速度慢)

ZeroTier 官方搭建了一个行星根服务器叫做地球 Earth,行星根服务器唯一的且是免费的,它记录了所有的路径信息,一般情况下大家都直接用的这个。除此之外还有 12 个遍布全球的根服务器,这些是收费的服务。所以如果使用免费套餐,连接时的延迟可能会很高,另外由于 Earth 在国外,一些不确定因素可能会影响到使用。考虑到网络的不确定性,ZeroTier 能自己创建根服务器月球 Moons,这样就能在大局域网中得到更好的体验了。

安装

ZeroTier 是跨平台的,能安装在几乎任何平台

Windows、macOS、Linux、iOS、Android、QNAP、Synology、西数 MyCloud NAS,下载地址:https://www.zerotier.com/download.shtml

路由器推荐安装 Entware 后使用 opkg install zerotier 命令安装

ZeroTier使用教程

因为我们没有自己创建 Moons 服务器,现在就先使用 ZeroTier 提供的服务
注册

地址:https://my.zerotier.com/

注册之后是这样的,保持默认就好,免费套餐能连接 100 个设备,一般人够用了

创建网络

创建一个新的网络之后,我们得到一个 Network ID,这个在后面的设备连接时需要用到,点击刚刚创建的网络我们可以设置更多选项

默认的设置就可以用了,右边 IPv4 的设置就是分配设备内网 IP 网段,其他的设置可以在 Setting help 里看到说明,不了解的不建议乱设置,如果不小心把自己的网络暴露在外部,会相当危险

连接

直接在客户端输入刚才创建的 Network ID

电脑

路由器

我这里使用的是安装了 Entware 的 LEDE

`# 启动
zerotier-one -d
zerotier-cli status # 获取地址和服务状态
zerotier-cli join # Network ID # 加入、离开、列出网络
zerotier-cli leave # Network ID
zerotier-cli listnetworks

Get your ZeroTier address and check the service status

sudo zerotier-cli status

Join, leave, and list networks

sudo zerotier-cli join ################
sudo zerotier-cli leave ################
sudo zerotier-cli listnetworks

Stop and start the service with launchctl

sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist

Cleanly uninstall ZeroTier One, preserving only your secret identity

sudo "/Library/Application Support/ZeroTier/One/uninstall.sh"`

允许连接

后台设置默认是需要 Auth 才能连接的,在客户端申请加入网络后,需要在后台允许一下

测试连接

为了测试不同网络访问,我添加了一台安卓手机,在移动网络下直接使用分配给路由器的 IP,连接了 ssh 和 onmp 创建的 PHP 探针页面,而且速度还算不错,宽带是电信的,手机是联通的,下文件时能有个 800k/s,不知道瓶颈在哪

结语

目前 IPv6 还没得到普及,虽然我这里已经能有 IPv6 地址并且能 IPv6 站点了,奈何不是固定 IP,也不知道哪时才能人手一个固定 IP。就目前情况来看,使用 ZeroTier 来做内网穿透还是不错的,使用门槛较低,可用性也还行,值得一试。

介绍一款linux多线程下载工具axel(用以替代wget)

Axel 通过打开多个 HTTP/FTP 连接来将一个文件进行分段下载,从而达到加速下载的目的。对于下载大文件,该工具将特别有用。如果下载过程中下载中断可以再执行下载命令即可恢复上次的下载进度。我常用Axel替代wget(文中也给出了部分解决axel报Too many redirects的办法)

如下图:

wget的时候只有300多KB/s, axel开了个10个线程达到了2465KB/s,真是棒棒哒!

axel.jpg

下面介绍axel的安装和使用!

安装:

centos下安装:

yum install axel

axel2.jpg

没有源的,可以去网上下载axel的rpm包安装或者下载tar.gz的源文件编译安装。

Debian/Ubuntu安装Axel:

apt-get install axel

选项介绍:

-s x 最高速度x 
-n x 连接数x
-o f 保存为文件f 
-S [x] 搜索镜像 
-H x 添加头文件字符串x(指定 HTTP header) 
-U x 设置用户代理(指定 HTTP user agent) 
-N 不使用代理服务器 
-q 静默模式 (不显示每个线程下载进度)
-v 更多状态信息 
-a Alternate progress indicator 
-h 帮助 
-V 版本信息

使用举例:
如指定100个线程下载,存到 ~/:

axel -n 100 -o ~/ 'http://mirrors.zju.edu.cn/ubuntu-releases/18.04.2/ubuntu-18.04.2-desktop-amd64.iso' 

不显示每个线程的进度

axel -n 100 -o ~/ -q http://mirrors.zju.edu.cn/ubuntu-releases/18.04.2/ubuntu-18.04.2-desktop-amd64.iso