Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 其他分享 › 「其他分享」快速接入Google 验证码实现登录验证

「其他分享」快速接入Google 验证码实现登录验证

Eswlnk的头像
Eswlnk
2022-08-21 12:40:57
「其他分享」快速接入Google 验证码实现登录验证-Eswlnk Blog
智能摘要 AI
本文介绍了通过结合Google的reCaptcha V3和V2来实现用户登录验证及CSRF防护的方法。前端使用Vue框架,通过隐藏V2验证界面,优先使用V3验证,若失败则触发V2验证。后端通过解析用户提交的验证码token,分别调用VerifyGoogleV2和VerifyGoogleV3函数进行验证,并根据验证结果返回相应的登录反馈。V3验证基于分数判断,分数大于0.5即视为通过。若V3验证失败,则触发V2验证以确保安全性。最终实现了有效的验证码验证机制。

前言

为了区分访问者是否为机器人,我们常添加验证码来达到此目的。这里我们使用Google的reCaptchaV3和reCaptchaV2结合来做认证。同时也可以起到CSRF防御的功能!

「其他分享」快速接入Google 验证码实现登录验证-Eswlnk Blog
快速接入Google 验证码实现登录验证

申请令牌

谷歌云

配置前端

这里我们前端使用的是VUE

#前期我们需要把V2的验证方法给隐藏起来,使用V3来验证更方便
import reCaptcha from '../layouts/google.vue'
...
login: async function () {
      const csrf = getCookie('csrf')
      const _this = this
      if (csrf !== '') {
        if (this.username === '' || this.password === '') {
          this.isError = true
          this.errorInfo = '用户名或密码你没填呢!'
        } else {
          if (this.token === '' && this.googleV3) {
            this.isError = true
            this.errorInfo = '验证码你没有填写呢!'
            return
          }
          this.visible = true
          const v3token = await this.GetV3Token()
          console.log(v3token)
          this.$axios.post('api/login', {
            username: this.username,
            password: this.$md5(this.password),
            csrfToken: csrf,
            google: this.token,
            rememberMe: this.rememberMe,
            googleV3: v3token
          }).then(function (response) {
            if (response.data.code === 1) {
              _this.$q.notify({
                type: 'positive',
                position: 'top',
                message: response.data.info,
                icon: 'fa fa-check'
              })
              _this.Jump(1)
            } else if (response.data.code === 3) {
              _this.isError = true
              _this.googleV3 = true
              _this.errorInfo = response.data.info
              _this.passwordErr = false
            } else {
              _this.isError = true
              _this.errorInfo = response.data.info
              _this.passwordErr = true
            }
          }).catch(function (error) {
            _this.isError = true
            _this.errorInfo = error.message
            _this.passwordErr = false
          }).finally(function () {
            _this.visible = false
          })
        }
      } else {
        this.isError = true
        this.errorInfo = 'CSRF令牌获取失败, 无法登录!'
        this.passwordErr = false
      }
    },
    # 获取v3的token函数
    GetV3Token: async function () {
      let returnToken = ''
      await this.$recaptcha('login').then((token) => {
        returnToken = token
      })
      console.log('tokenV3 ' + returnToken)
      return returnToken
    }
  },
  ...

后端

app.Post("api/login", func(ctx iris.Context) {
        username := ctx.FormValue("username")
        password := ctx.FormValue("password")
        //rememberMe := ctx.FormValue("rememberMe")
        token := ctx.FormValue("google")
        tokenV3 := ctx.FormValue("googleV3")
        // "记住我"功能未实现!
        if username != "" && password != "" {
            if token == "" {
                if !methods.VerifyGoogleV3(tokenV3) {
                    _, _ = ctx.JSON(methods.ReturnPack{Code: 3, Info: "检测到你可能是机器人,请输入验证码!"})
                    return
                }
            } else {
                if !methods.VerifyGoogleV2(token) {
                    _, _ = ctx.JSON(methods.ReturnPack{Code: 0, Info: "验证码验证出现问题!"})
                    return
                }
            }
 
            user, err := methods.VerifyUsernamePassword(username, password, ctx.RemoteAddr())
 
            if err == nil {
                if user.Role == -1 {
                    _, _ = ctx.JSON(methods.ReturnPack{Code: 0, Info: "账号已被封禁, 请联系网站管理员!"})
                    return
                }
                if user.SessId != "" {
                    sysinit.Sess.DestroyByID(user.SessId)
                }
                s := sysinit.Sess.Start(ctx)
                s.Set("auth", true)
                s.Set("id", user.Id)
                s.Set("role", user.Role)
                s.Set("username", user.Username)
                _ = methods.SetSessId(user, s.ID())
                //log.Info(rememberMe)
                _, _ = ctx.JSON(methods.ReturnPack{Code: 1, Info: "登录成功,欢迎你" + user.Username + "正在为你跳转!"})
            } else {
                _, _ = ctx.JSON(methods.ReturnPack{Code: 0, Info: err.Error()})
            }
        } else {
            _, _ = ctx.JSON(methods.ReturnPack{Code: 0, Info: "你未填写用户名或密码"})
        }
    })

相关验证函数

// 验证谷歌验证码V2
func VerifyGoogleV2(token string) bool {
    res, err := requests.Get("https://recaptcha.net/recaptcha/api/siteverify", requests.Params{"secret": config.Sysconfig.RecaptchaSecretV2, "response": token})
    if err != nil {
        log.Error(err.Error())
        return false
    }
    log.Info(res.Text())
    var googleBack GoogleBack
    err = res.Json(&googleBack)
    if err != nil {
        log.Error(err.Error())
        return false
    }
    return googleBack.Success
}
 
// 验证谷歌验证码V3
func VerifyGoogleV3(token string) bool {
    res, err := requests.Get("https://recaptcha.net/recaptcha/api/siteverify", requests.Params{"secret": config.Sysconfig.RecaptchaSecretV3, "response": token})
    if err != nil {
        log.Error(err.Error())
        return false
    }
    log.Info(res.Text())
    var googleBackV3 GoogleBackV3
    err = res.Json(&googleBackV3)
    if err != nil {
        log.Error(err.Error())
        return false
    }
    if googleBackV3.Score > 0.5 {
        return true
    } else {
        return false
    }
}

结果

[+] [信息] [2021-03-05 10:38:12]: {
  "success": true,
  "challenge_ts": "2021-03-05T02:32:06Z",
  "hostname": "localhost",
  "score": 0.9,
  "action": "login"
}

此时我们就可以做到在v3验证失败的情况下调起v2来辅助验证!验证码功能成功实现.

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
GOgolangrecaptchatokenvue谷歌谷歌验证码
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「其他分享」百度搜索蜘蛛全面解析说明
上一篇
「其他分享」Laplace变换和终值定理
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「亲测有效」Google Gemini 学生优惠:解决身份验证和支付卡验证
  • 来自谷歌27岁的生日涂鸦
  • 解决国际版EdgeOne绑卡和手机验证问题
  • 小工具开发之EdgeOne免费计划兑换工具
  • 「其他分享」市面上静态页面服务商比较与推荐:选择最适合您的平台
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

实践Redis Stream与Java API互通
2022-06-14 12:32:00
每日知道:Java中void什么意思
2023-02-25 18:31:11
如何将震源球绘制在谷歌地球上
2022-06-17 17:04:00

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 1.200 秒   |  SQL查询 37 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈