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

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

【问题讨论】:

    标签: flutter 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,其他平台不支持

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2014-07-10
      • 2019-05-04
      • 2021-02-16
      • 2021-05-03
      • 2019-08-04
      • 2021-10-16
      相关资源
      最近更新 更多