详解thinkphp6后台添加google登录验证

                                                                             thinkphp6后台添加google登录验证

                                                                               

基础环境系统环境:Windows10 x64PHP集成环境:phpstudyPHP依赖管理工具:Composer手册:Thinkphp6

(一)下载 GoogleAuthenticator 类

(1)代码亲测有效 (2)代码是在tp6环境下,生成的路径可根据当前Tp版本自行修改

/** * PHP Class for handling Google Authenticator 2-factor authentication. * * @author Michael Kliewe * @copyright 2012 Michael Kliewe * @license http://www.opensource.org/licenses/bsd-license.php BSD License * * @link http://www.phpgangsta.de/ */class GoogleAuthenticator{    protected $_codeLength = 6;    /**     * Create new secret.     * 16 characters, randomly chosen from the allowed base32 characters.     *     * @param int $secretLength     *     * @return string     */    public function createSecret($secretLength = 16)    {        $validChars = $this->_getBase32LookupTable();        // Valid secret lengths are 80 to 640 bits        if ($secretLength  128) {            throw new Exception('Bad secret length');        }        $secret = '';        $rnd = false;        if (function_exists('random_bytes')) {            $rnd = random_bytes($secretLength);        } elseif (function_exists('mcrypt_create_iv')) {            $rnd = mcrypt_create_iv($secretLength, MCRYPT_DEV_URANDOM);        } elseif (function_exists('openssl_random_pseudo_bytes')) {            $rnd = openssl_random_pseudo_bytes($secretLength, $cryptoStrong);            if (!$cryptoStrong) {                $rnd = false;            }        }        if ($rnd !== false) {            for ($i = 0; $i _base32Decode($secret);        // Pack time into binary string        $time = chr(0).chr(0).chr(0).chr(0).pack('N*', $timeSlice);        // Hash it with users secret key        $hm = hash_hmac('SHA1', $time, $secretkey, true);        // Use last nipple of result as index/offset        $offset = ord(substr($hm, -1)) & 0x0F;        // grab 4 bytes of the result        $hashpart = substr($hm, $offset, 4);        // Unpak binary value        $value = unpack('N', $hashpart);        $value = $value[1];        // Only 32 bits        $value = $value & 0x7FFFFFFF;        $modulo = pow(10, $this->_codeLength);        return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT);    }    /**     * Get QR-Code URL for image, from google charts.     *     * @param string $name     * @param string $secret     * @param string $title     * @param array  $params     *     * @return string     */    public function getQRCodeGoogleUrl($name, $secret, $title = null, $params = array())    {        $width = !empty($params['width']) && (int) $params['width'] > 0 ? (int) $params['width'] : 200;        $height = !empty($params['height']) && (int) $params['height'] > 0 ? (int) $params['height'] : 200;        $level = !empty($params['level']) && array_search($params['level'], array('L', 'M', 'Q', 'H')) !== false ? $params['level'] : 'M';        $urlencoded = urlencode('otpauth://totp/'.$name.'?secret='.$secret.'');        if (isset($title)) {            $urlencoded .= urlencode('&issuer='.urlencode($title));        }        return "https://api.qrserver.com/v1/create-qr-code/?data=$urlencoded&size=${width}x${height}&ecc=$level";    }    /**     * Check if the code is correct. This will accept codes starting from $discrepancy*30sec ago to $discrepancy*30sec from now.     *     * @param string   $secret     * @param string   $code     * @param int      $discrepancy      This is the allowed time drift in 30 second units (8 means 4 minutes before or after)     * @param int|null $currentTimeSlice time slice if we want use other that time()     *     * @return bool     */    public function verifyCode($secret, $code, $discrepancy = 1, $currentTimeSlice = null)    {        if ($currentTimeSlice === null) {            $currentTimeSlice = floor(time() / 30);        }        if (strlen($code) != 6) {            return false;        }        for ($i = -$discrepancy; $i getCode($secret, $currentTimeSlice + $i);            if ($this->timingSafeEquals($calculatedCode, $code)) {                return true;            }        }        return false;    }    /**     * Set the code length, should be >=6.     *     * @param int $length     *     * @return PHPGangsta_GoogleAuthenticator     */    public function setCodeLength($length)    {        $this->_codeLength = $length;        return $this;    }    /**     * Helper class to decode base32.     *     * @param $secret     *     * @return bool|string     */    protected function _base32Decode($secret)    {        if (empty($secret)) {            return '';        }        $base32chars = $this->_getBase32LookupTable();        $base32charsFlipped = array_flip($base32chars);        $paddingCharCount = substr_count($secret, $base32chars[32]);        $allowedValues = array(6, 4, 3, 1, 0);        if (!in_array($paddingCharCount, $allowedValues)) {            return false;        }        for ($i = 0; $i < 4; ++$i) {            if ($paddingCharCount == $allowedValues[$i] &&                substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) {                return false;            }        }        $secret = str_replace('=', '', $secret);        $secret = str_split($secret);        $binaryString = '';        for ($i = 0; $i < count($secret); $i = $i + 8) {            $x = '';            if (!in_array($secret[$i], $base32chars)) {                return false;            }            for ($j = 0; $j < 8; ++$j) {                $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);            }            $eightBits = str_split($x, 8);            for ($z = 0; $z < count($eightBits); ++$z) {                $binaryString .= (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';            }        }        return $binaryString;    }    /**     * Get array with all 32 characters for decoding from/encoding to base32.     *     * @return array     */    protected function _getBase32LookupTable()    {        return array(            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', //  7            'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23            'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31            '=',  // padding char        );    }    /**     * A timing safe equals comparison     * more info here: http://blog.ircmaxell.com/2014/11/its-all-about-time.html.     *     * @param string $safeString The internal (safe) value to be checked     * @param string $userString The user submitted (unsafe) value     *     * @return bool True if the two strings are identical     */    private function timingSafeEquals($safeString, $userString)    {        if (function_exists('hash_equals')) {            return hash_equals($safeString, $userString);        }        $safeLen = strlen($safeString);        $userLen = strlen($userString);        if ($userLen != $safeLen) {            return false;        }        $result = 0;        for ($i = 0; $i < $userLen; ++$i) {            $result |= (ord($safeString[$i]) ^ ord($userString[$i]));        }        // They are only identical strings if $result is exactly 0...        return $result === 0;    }}

(二)使用

(1)生成 谷歌秘钥和验证二维码
(2)将谷歌秘钥和验证二维码保存到数据库

 //谷歌验证码$google=new GoogleAuthenticator();//生成验证秘钥$secret=$google->createSecret();//生成验证二维码 $username 需要绑定的用户名$qrCodeUrl = $google->getQRCodeGoogleUrl($username, $secret);//存入数据库.....省略代码

(3)谷歌验证

$google=new GoogleAuthenticator();//$google_secret 存入的谷歌秘钥  ,$code 谷歌动态验证码$checkResult = $google->verifyCode($google_secret, $code, 4);  if (!$checkResult){      $this->error('谷歌验证码错误');  }

《相关推荐:最新的10个thinkphp视频教程》            

易森网络企业版 易森网络企业版

如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld

易森网络企业版 0 查看详情 易森网络企业版

以上就是详解thinkphp6后台添加google登录验证的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/729089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
百度网盘app怎样上传视频文件
上一篇 2025年11月25日 10:47:09
MySQL中触发器详解 触发器在自动化任务中的应用场景
下一篇 2025年11月25日 10:47:10

相关推荐

  • Linux中如何查看服务日志?journalctl与syslog使用指南

    Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南

    排查linux服务问题时,首选journalctl或syslog类系统查看日志。journalctl适用于systemd系统,可查看内核消息、服务启动输出等,支持按时间、单元、优先级过滤;syslog适用于传统系统,需服务主动发送日志,支持集中管理。掌握两者使用能有效定位问题。 在Linux系统中排…

    2026年9月23日 用户投稿
    100
  • ElevenLabs的AI混合工具怎么用?生成逼真语音的详细操作教程

    ElevenLabs的AI混合工具核心在于VoiceLab功能,结合Voice Design与Instant Voice Cloning实现声音的精细调控与克隆。通过参数调整和高质量音频输入,用户可从零设计或克隆声音,并经反复迭代优化情感表达与自然度。其优势在于对声音细节的精准控制、克隆的真实感及灵…

    2026年9月23日
    100
  • 优化 Laravel Nova 动作响应消息的持久性与交互性

    本文探讨了 Laravel Nova 动作响应消息(toast 提示)持续时间过短的问题,尤其对于耗时较长的操作,默认提示难以满足用户反馈需求。我们提出并详细介绍了如何利用 Laravel Nova 4 的通知功能,实现持久化且可交互的用户通知,从而有效解决传统 toast 消息的局限性,提升用户体…

    2026年9月23日
    100
  • PHP数组中内嵌JSON字符串值的解析与访问教程

    本教程详细介绍了如何在PHP中高效地解析和访问包含JSON格式字符串的数组元素。通过使用json_decode()函数,可以将这些JSON字符串转换为可操作的PHP数组或对象,从而轻松提取所需的shortname和fullname等字段值,并提供了遍历和直接访问的示例代码及注意事项。 在php开发中…

    2026年9月23日
    100
  • 微信小店客服怎么联系?微信小店官方平台电话

    随着移动互联网的发展,微信已经成为人们日常生活中不可或缺的工具。作为微信生态中的重要功能之一,微信小店为用户提供了便捷的购物方式。然而在实际使用过程中,难免会遇到一些问题,例如订单异常、商品咨询等,这时候就需要及时联系微信小店的客服人员进行解决。本文将为您详细介绍如何联系微信小店官方客服,并提供多种…

    2026年9月23日
    000
  • 火狐浏览器官方最新版 Firefox电脑版安装入口

    火狐浏览器官方最新版Firefox电脑版安装入口在https://www.mozilla.org/zh-CN/firefox/new/,该页面提供具备强大隐私保护、高效渲染和跨设备同步功能的最新版本下载。 火狐浏览器官方最新版 Firefox电脑版安装入口在哪里?这是不少网友都关注的,接下来由PHP…

    2026年9月23日
    200
  • VSCode搭建Flutter开发环境(移动开发,完整配置指南)

    本文详细指导如何在VSCode中搭建高效的Flutter开发环境,包括安装JDK、配置JAVA_HOME、安装Android Studio并设置ANDROID_HOME、安装VSCode及Flutter和Dart插件、配置FLUTTER_HOME环境变量,通过flutter doctor检查并解决A…

    2026年9月23日
    100
  • 如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    Optuna通过智能搜索与剪枝机制,显著提升AI大模型超参数优化效率。它以目标函数封装训练流程,利用TPE等算法智能采样,结合ASHA等剪枝策略,在分布式环境下高效搜索最优配置,同时提供可复现性与可视化分析,降低调参成本。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月23日 用户投稿
    100
  • windows8无法弹出usb设备怎么办_windows8安全移除U盘失败解决方法

    先重启Windows资源管理器,再依次排查占用进程、使用文件资源管理器弹出、确保Plug and Play服务运行、禁用USB选择性暂停、修复注册表通知项,可解决U盘无法安全移除问题。 如果您尝试从Windows 8电脑上安全移除U盘或其他USB设备,但系统提示设备正在使用中或没有任何反应,则可能是…

    2026年9月23日
    200
  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • 如何在mysql中备份二进制日志

    答案:MySQL二进制日志备份可通过mysqlbinlog工具导出、直接复制日志文件、定时归档及结合mysqldump全量备份实现,需配合FLUSH LOGS和SHOW BINARY LOGS确保一致性,并制定保留策略以支持数据恢复。 在 MySQL 中,二进制日志(Binary Log)记录了所有…

    2026年9月23日
    100
  • 苹果官网真品认证通道 iPhone序列号查验正品入口

    苹果官网真品认证通道为https://checkcoverage.apple.com/cn/zh/,用户可通过输入iPhone序列号查验设备激活状态、保修期限及技术支持覆盖情况,确保正品并降低二手交易风险。 苹果官网真品认证通道 iPhone序列号查验正品入口在哪里?这是不少网友都关注的,接下来由P…

    2026年9月23日
    200
  • Photopea中AI图片如何导出为PNG?快速保存图像的实用方法

    答案:在Photopea中导出AI生成图片为PNG,需点击“文件”→“导出为”→选择PNG,设置质量100%、勾选透明度并确认尺寸后保存;为平衡质量与文件大小,优先调整图像尺寸而非降低质量,高分辨率图片可缩放以优化;常见技巧包括使用高分辨率源图、保留图层非破坏性编辑;其他格式如JPEG适合无透明背景…

    2026年9月23日
    200
  • 如何使用Java制作简易的博客系统

    首先搭建Spring Boot后端,设计BlogPost实体类并用JPA实现数据持久化,通过BlogController处理页面请求,使用Thymeleaf模板引擎渲染index和create页面,配置H2内存数据库并启用控制台,最终实现文章的发布与展示功能。 用Java制作一个简易的博客系统,核心…

    2026年9月23日
    200
  • qq浏览器主页被篡改了如何修复_qq浏览器主页被篡改修复方法

    首先检查QQ浏览器设置中的主页地址并修正,接着查看桌面快捷方式目标路径是否被添加恶意网址并清理,然后使用腾讯电脑管家等工具扫描修复,最后可尝试重置浏览器或通过注册表编辑器锁定主页,防止再次被篡改。 QQ浏览器主页被篡改,通常是由恶意软件、插件或安全软件锁定导致的。修复的关键是检查多个可能被修改的位置…

    2026年9月23日
    100
  • 渗透测试|利用curl回传文件

    在处理低权限shell回传文件的问题时,如果无法使用scp命令且无法安装sshpass,可以考虑使用curl命令进行文件传输。以下是详细的伪原创内容: 至少我们曾经在一起过。 来自:一言 var xhr = new XMLHttpRequest();xhr.open(‘get’, ‘https://…

    2026年9月23日
    200
  • 抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法

    抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法抖音涨粉慢怎么办?快速提升粉丝量的10个有效方法

    抖音涨粉慢可通过10个方法提升,一是明确内容定位,选择垂直领域持续输出,如美妆测评、职场干货等,提高系统推荐精准度;二是做好前3秒“钩子”,用问题、数据或反差吸引用户停留;三是蹭热点话题和挑战,结合创意参与提升曝光;四是引导评论互动,增加算法权重;五是选择合适发布时间,匹配目标人群活跃时段;六是保持…

    2026年9月23日 用户投稿
    500
  • VSCode如何配置Scala开发环境 VSCode搭建Scala项目的完整教程

    首先安装jdk 11或17并正确配置java_home和path环境变量;2. 通过包管理器或官网安装sbt,用于项目构建与依赖管理;3. 在vscode中安装scala (metals)插件,以获得代码补全、错误检查等语言服务;4. 使用sbt new scala/scala-seed.g8创建项…

    2026年9月23日
    100
  • PHP面向对象高级特性_PHP高级OOP设计模式

    PHP高级OOP特性如命名空间、Traits、魔术方法等结合设计模式可提升代码质量。1. 命名空间避免类冲突,Traits实现横向复用,后期静态绑定支持运行时解析,魔术方法增强对象控制,抽象类与接口定义契约,Final防止继承修改。2. 单例确保唯一实例,工厂封装创建逻辑,依赖注入降低耦合,观察者实…

    2026年9月23日
    100
  • Airtable的AI混合工具怎么用?快速管理数据的智能化操作步骤

    Airtable的AI混合工具通过将AI能力嵌入数据管理流程,实现自动化处理、分析与内容生成。首先明确AI需求,如总结反馈或生成文案;接着选择AI字段或在自动化中添加AI动作;然后配置模型与提示词,精准设计指令以确保输出质量;指定输入输出字段后进行测试迭代,优化提示词直至满意;最后部署并持续监控。该…

    2026年9月23日
    200

发表回复

登录后才能评论
关注微信