如何在 Flutter 应用中实现 reCaptcha

     2023-02-23     210

关键词:

【中文标题】如何在 Flutter 应用中实现 reCaptcha【英文标题】:How to implement reCaptcha into a flutter app 【发布时间】:2020-06-25 18:30:40 【问题描述】:

我正在尝试在我的颤振应用程序中实现 reCaptcha 功能,但在验证码注册中,我需要提供一个我没有用于移动应用程序的域。我浏览了几本指导如何将 reCaptcha 实施到移动应用程序中的指南,但这些指南使用包名称而不是域注册了他们的 reCaptcha。在 Flutter 应用或 2020 年的任何移动应用中实施 reCaptcha 的正确方法是什么?

【问题讨论】:

【参考方案1】:

你可以使用这个插件,flutter_recaptcha。

对于域,我遇到了同样的问题。我首先发现我需要使用here 中的“我不是机器人”复选框选项,并且我必须检查github repository 才能找到此信息,“!!!记得将此域添加到reCaptcha 设置:recaptcha-flutter-plugin.firebaseapp.com,”,它解释了它。

在主页上没有看到它后,我有点迷茫,但现在它是有道理的。希望对您有所帮助。

编辑

我在试用后注意到一些东西,我想提一下。该插件不提供用于验证用户服务器端的验证码响应,因此它看起来并不是很有用。但是,它是一个简单的插件,因此可以将其用作示例。我认为,这些步骤是创建一个带有验证码的网页。与插件一样,使用 webview 打开页面,然后捕获表单的发布输出和提交表单的用户的 IP 地址 using something like this,然后 send it to flutter,然后使用该信息提交您的请求,并使用Google library 验证验证码。

说明

我刚刚完成了这个,我找到了一个很好的方法。 首先,创建一个 html 页面,如下所示:

<html>
  <head>
    <title>reCAPTCHA</title>
    <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  </head>
  <body style='background-color: aqua;'>
    <div style='height: 60px;'></div>
    <form action="?" method="POST">
      <div class="g-recaptcha" 
        data-sitekey="YOUR-SITE-KEY"
        data-callback="captchaCallback"></div>

    </form>
    <script>
      function captchaCallback(response)
        //console.log(response);
        if(typeof Captcha!=="undefined")
          Captcha.postMessage(response);
        
      
    </script>
  </body>
</html>

然后,将其托管在您的域上,例如 example.com/captcha。

然后,创建一个flutter Widget,如下所示:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class Captcha extends StatefulWidget
  Function callback;
  Captcha(this.callback);

  @override
  State<StatefulWidget> createState() 
    return CaptchaState();
  


class CaptchaState extends State<Captcha>
  WebViewController webViewController;
  @override
  initState()
    super.initState();
  


  @override
  Widget build(BuildContext context) 
    return Center(
      child: WebView(
        initialUrl: "https://example.com/captcha.html",
        javascriptMode: JavascriptMode.unrestricted,
        javascriptChannels: Set.from([
          JavascriptChannel(
            name: 'Captcha',
            onMessageReceived: (JavascriptMessage message) 
              //This is where you receive message from
              //javascript code and handle in Flutter/Dart
              //like here, the message is just being printed
              //in Run/LogCat window of android studio
              //print(message.message);
              widget.callback(message.message);
              Navigator.of(context).pop();
            )
        ]),
        onWebViewCreated: (WebViewController w) 
          webViewController = w;
        ,
      )
    );
  


确保您在https://www.google.com/recaptcha 注册了验证码(点击右上角的“管理控制台”)。

然后,您已经构建了前端。要调用验证码,只需运行:

Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context)
                      return Captcha((String code)=>print("Code returned: "+code));
                    
                  ),
                );

你可以使用任何你想要的回调,像这样:

class GenericState extends State<Generic>
void methodWithCaptcha(String captchaCode)
  // Do something with captchaCode


@override
  Widget build(BuildContext context) 
    return Center(child:FlatButton(
        child: Text("Click here!"),
        onPressed: ()
            Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context)
                      return Captcha(methodWithCaptcha);
                    
                  ),
                );
        
  

服务器端,你可以按照here的说明进行操作(我按照“直接下载”和“使用”部分进行操作)。我发现对于用法,我可以简单地使用代码:

$recaptcha = new \ReCaptcha\ReCaptcha($secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
if ($resp->isSuccess()) 
    // Verified!
 else 
    $errors = $resp->getErrorCodes();

没有必要像示例中那样使用setExpectedHostname

之后,一切正常!我认为这是目前在 Flutter 中实现 Google reCaptcha V2 的最佳方式(适用于 iOS 和 Android)。

【讨论】:

抱歉提出一个旧线程,但是否可以将此网页嵌入到应用程序中,这意味着不需要托管验证码页面?【参考方案2】:

如果你在找Flutter WEB,可以试试g_recaptcha_v3包

注意:

仅支持 reCAPTCHA V3,不支持 V2 仅适用于 Flutter Web,其他平台不支持

【讨论】:

如何在 Flutter 应用中实现支付?

】如何在Flutter应用中实现支付?【英文标题】:HowtoimplementpaymentsinaFlutterapp?【发布时间】:2019-08-0412:35:30【问题描述】:我正在使用Flutter构建我的第一个应用程序。该应用程序旨在让用户能够相互买卖产品,我想设置功能以通... 查看详情

如何在 Flutter 中实现应用栏操作文本而不是操作图标?

】如何在Flutter中实现应用栏操作文本而不是操作图标?【英文标题】:HowtoimplementappbaractiontextinsteadofactioniconinFlutter?【发布时间】:2018-12-1314:14:33【问题描述】:我正在尝试在颤振应用程序中实现appbar。我可以添加一个关闭应用... 查看详情

如何在 Flutter 中实现音频流应用和安全存储

】如何在Flutter中实现音频流应用和安全存储【英文标题】:Howtoimplementaudiostreamingappandsecurestorageinflutter【发布时间】:2019-11-0603:57:38【问题描述】:我现在要使用颤振https://play.google.com/store/apps/details?id=deezer.android.app构建像deezer... 查看详情

如何在 Flutter Dart 中实现插件架构

】如何在FlutterDart中实现插件架构【英文标题】:HowtoimplementthePluginArchitectureinFlutterDart【发布时间】:2020-02-0914:24:37【问题描述】:我想在FlutterDart中实现一个插件架构。流程如下:1.用户下载应用。2.用户从我们的网站加载插件... 查看详情

如何在flutter中实现包月? (新方法)

】如何在flutter中实现包月?(新方法)【英文标题】:Howtoimplementsubscriptionmonthlyinflutter?(Newmethods)【发布时间】:2021-08-1020:12:58【问题描述】:我正在尝试使用应用内购买包实现对我的Flutter应用的每月订阅。经过数小时的搜索,... 查看详情

如何在 Flutter Web 中实现 Stripe 支付?

】如何在FlutterWeb中实现Stripe支付?【英文标题】:HowtoimplementStripePaymentsinFlutterWeb?【发布时间】:2021-01-3122:52:29【问题描述】:我正在尝试在我的Web应用(Flutter)中实现StripePayments,但我在https://pub.dev/中找不到任何包来满足我的愿... 查看详情

如何在 Flutter 中实现“磨砂玻璃”效果?

】如何在Flutter中实现“磨砂玻璃”效果?【英文标题】:HowdoIdothe"frostedglass"effectinFlutter?【发布时间】:2017-09-1822:29:18【问题描述】:我正在编写一个Flutter应用程序,我想使用/实现iOS上常见的“磨砂玻璃”效果。我该怎... 查看详情

如何在 Flutter 中实现 App Tracking Transparency

】如何在Flutter中实现AppTrackingTransparency【英文标题】:HowtoimplementAppTrackingTransparencyinFlutter【发布时间】:2021-10-0717:25:17【问题描述】:我向苹果提交了我的应用程序,但它被拒绝了,因为我没有添加应用程序透明度。到目前为... 查看详情

如何在 Flutter 中实现类似视频流和视频滚动的 Tiktok

】如何在Flutter中实现类似视频流和视频滚动的Tiktok【英文标题】:HowtoimplementTiktoklikevideostreamingandvideoscrollinginFlutter【发布时间】:2020-04-0510:25:16【问题描述】:我正在尝试使用Flutter复制TikTok应用程序UI。谁能建议我如何在颤振... 查看详情

我们如何使用 ArCore 在 Flutter 中实现类似 snapchat 的过滤器

】我们如何使用ArCore在Flutter中实现类似snapchat的过滤器【英文标题】:HowcanweimplementsnapchatlikefiltersinflutterusingArCore【发布时间】:2020-10-2500:30:37【问题描述】:我正在尝试使用颤振构建一个增强现实应用程序,我开始知道有两个... 查看详情

如何在 Flutter 中实现 SingleLine 水平 CalendarView

】如何在Flutter中实现SingleLine水平CalendarView【英文标题】:HowtoachieveSingleLineHorizontalCalendarViewinFlutter【发布时间】:2020-02-0209:29:56【问题描述】:我是Flutter的新手。如何在颤动中实现SingleLine水平滚动CalendarView和日期选择。请找到... 查看详情

如何在 Flutter 中实现 3D Secure(通过 Visa / MasterCard SecureCode 验证)?

】如何在Flutter中实现3DSecure(通过Visa/MasterCardSecureCode验证)?【英文标题】:Howtoimplement3DSecure(VerifiedbyVisa/MasterCardSecureCode)inFlutter?【发布时间】:2019-12-2321:30:56【问题描述】:现有的3DS实施是这样的,在结帐和付款阶段,它涉... 查看详情

如何在 Flutter 中实现 CheckBox?

】如何在Flutter中实现CheckBox?【英文标题】:HowtoimplementCheckBoxinFlutter?【发布时间】:2019-03-1917:20:07【问题描述】:这里我提到了我的复选框代码。我是Flutter的新手,所以我必须实现它以实现记住我的功能。代码:Container(padding:... 查看详情

如何在 Flutter 的消息中实现用户提及?

】如何在Flutter的消息中实现用户提及?【英文标题】:HowtoimplementusermentionsinmessagesonFlutter?【发布时间】:2019-12-2105:02:35【问题描述】:我需要在消息中实现用户提及,就像在Flutter上的流行信使中一样。当我单击输入字段中的某... 查看详情

如何在 Flutter 中实现 GooglePlay TabBar?

】如何在Flutter中实现GooglePlayTabBar?【英文标题】:HowtoimplementGooglePlayTabBarinflutter?【发布时间】:2020-06-1415:26:18【问题描述】:在大家开始发布一些初学者UI教程视频的链接之前,请知道这是一个已知问题,我正在寻找解决方法... 查看详情

如何在 Flutter 中实现这种排序查询?

】如何在Flutter中实现这种排序查询?【英文标题】:HowtoachievethiskindofsortingqueryinFlutter?【发布时间】:2021-09-0112:24:53【问题描述】:IM试图通过下图实现外观,数据来自本地数据库,使用sqflite。我有db"model"类和用于int的db类,查... 查看详情

如何在flutter中实现agora视频通话邀请

】如何在flutter中实现agora视频通话邀请【英文标题】:howtoimplementagoravideocallinvitationinflutter【发布时间】:2021-10-0309:07:42【问题描述】:我是Flutter新手我想知道使用agoraSDK实现视频通话邀请的最佳方式双方。//joingchannelStringtoken=aw... 查看详情

Flutter 按住闪屏 3 秒。如何在 Flutter 中实现闪屏?

】Flutter按住闪屏3秒。如何在Flutter中实现闪屏?【英文标题】:Flutterholdsplashscreenfor3Seconds.HowtoimplementsplashscreeninFlutter?【发布时间】:2018-10-1206:36:29【问题描述】:如何在颤动中显示启动屏幕3秒,然后转到下一个我的登录屏幕。... 查看详情