如何将 reCaptcha 实现到 flutter 应用中

问题描述 投票:0回答:4

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

flutter recaptcha
4个回答
13
投票

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

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

在主页上没有看到它之后我迷路了一点,但现在它是有道理的。希望它有所帮助。

编辑

我在尝试后注意到了一些事情,我想提一下。该插件不提供用于验证用户服务器端的验证码响应,因此它看起来并不是很有用。但是,它是一个简单的插件,因此可以将其用作示例。我认为,这些步骤将是创建一个带有验证码的网页。与插件一样,使用 webview 打开页面,然后捕获表单的 post 输出和用户提交表单的 ip 地址,使用类似这样的东西,然后发送它到 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)。


1
投票

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

注:

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

1
投票

我改进了@JVE999 方法并创建了一个新包: flutter_firebase_recaptcha

该软件包使用

InAppWebView
进行recapcha HTML 渲染,因此您不再需要单独的网页了。

我的小部件支持“可见”和“不可见”recapcha。 Invisible recapcha 允许您在不向用户显示任何内容的情况下尝试获取 recapcha 令牌。


0
投票

你可以使用 flutter_gcapthca_v3。它适用于当前的 google recaptcha v3,并支持 Android/IOS 平台。

© www.soinside.com 2019 - 2024. All rights reserved.