前言
在网站上提交某些表格或任何其他类型的信息时,您可能已经注意到在提交详细信息之前必须填写一些验证码。该验证码可能是带有一些数字的图像形式,您只需在提供给您的 EditText 中输入这些数字。另一个验证码可以是图像,您必须识别该图像中存在的某些对象(如汽车、道路等)。
但是你有没有想过为什么这些验证码会被集成或放到网站上?原因很简单。为了验证用户的真实性,这些验证码用于确定用户是否是人。如今,许多智能机器人可以在表格中填写信息,为了避免此类情况,我们在我们的网站或应用程序中使用验证码。
在这篇文章中,我们将学习如何在我们的 Android 应用程序中使用 Google 的 reCAPTCHA 来实现 CAPTCHA。那么,让我们开始吧。
SafetyNet reCAPTCHA API
SafetyNet 提供了一组服务和 API,可用于保护您的移动应用程序免受虚假用户、设备篡改、错误 URL 等安全威胁。其中一项服务包括对reCAPTCHA的支持,可保护您的用户免受恶意流量的侵害.
以下是 Android 网站上的 reCAPTCHA 介绍:
reCAPTCHA 是一项免费服务,它使用高级风险分析引擎来保护您的应用免受垃圾邮件和其他滥用行为的影响。如果该服务怀疑与您的应用程序交互的用户可能是机器人而不是人类,它会提供一个验证码,人类必须先解决该验证码,然后您的应用程序才能继续执行。
但要使用你的minSdkVersion
应该是 14 或更高。
Working
Google 的 reCAPTCHA 的工作包括某些网络调用,即从您的 Android 应用程序调用 SafetyNet 服务器,然后从 SafetyNet 服务器调用您的 Android 应用程序,最后从您的 Android 应用程序调用您的服务器。因此,以下是在您的 Android 应用程序中使用 Google 的 reCAPTCHA 所涉及的步骤:
- 首先,您必须从reCAPTCHA 网站获取Site Key和Secret Key。站点密钥将在您的 Android 应用程序中使用,并且密钥应放置在您的服务器中。
- 通过使用站点密钥,将生成 reCAPTCHA,如果需要,用户必须完成 reCAPTCHA 质询。
- 生成 reCAPTCHA 后,应用程序将与验证码服务器通信,并使用您的站点密钥返回用户响应令牌。
- 现在,您的 Android 应用程序会将令牌发送到您的服务器,服务器将再次将令牌发送到 reCAPTCHA 服务器,但使用密钥。reCAPTCHA 服务器会将成功状态发送到您的服务器,然后服务器将成功状态发送到您的 Android 应用程序。
从下图中可以看到整个摘要:

生成 reCAPTCHA 站点密钥和密钥
至此,我们已经看到了 Google 的 reCAPTCHA 在 Android 应用中的流程。我们的下一步是将这个 reCAPTCHA 集成到我们的应用程序中。因此,首先我们需要从 reCAPTCHA 网站生成一个站点密钥和一个秘密密钥。请按照以下步骤操作:
- 访问reCAPTCHA 网站。
- 输入标签以识别您的密钥。您可以在此处输入任何名称。
- 输入标签后,选择要在应用中添加的 reCAPTCHA 类型。我将使用 reCAPTCHA v2,之后使用 reCAPTCHA Android。
- 输入您的 Android 项目的包名称。
- 最后,选择接受 reCAPTCHA条款和条件并向所有者发送警报。
- 点击提交
以下是 reCAPTCHA 网站的屏幕:

提交表单后,您将获得一个 Site Key 和一个 Secret Key。复制密钥并存储在某个地方,我们将在我们的应用程序中使用这些密钥。
为 reCAPTCHA 设置 Android 项目
在 Android Studio 中创建一个新项目。在这里,我将使用 BasicActivity 模板。
创建好Android项目之后,我们下一步就是在build.gradle文件中添加reCAPTCHA的依赖。因此,在您的项目中添加以下行:
//dependency for the reCAPTCHA (safetynet)
implementation 'com.google.android.gms:play-services-safetynet:17.0.0'
//dependency for fast networking for networking
implementation 'com.amitshekhar.android:android-networking:1.0.2'
添加依赖后,我们的下一个工作是为我们的应用程序添加互联网权限。在清单标签下的AndroidManifest.xml文件中添加以下行:
<uses-permission android:name="android.permission.INTERNET"/>
并在您的应用程序中添加快速网络库,在您的应用程序类中编写以下代码,
AndroidNetworking.initialize(applicationContext);
一次,我们完成了权限和依赖项部分,下一步是为项目创建 UI。在这里,我们只有一个按钮可以在单击时调用 reCAPTCHA 事件。因此,activity_main.xml文件的代码将是:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="reCAPTCHA example"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"
android:id="@+id/textView"
android:textSize="32sp"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click for CAPTCHA"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
现在,我们已经创建了应用程序的 UI 部分。让我们在我们的文件中编写 reCAPTCHA 的代码MainActivity.kt
。
在MainActivity.kt
文件中,我们在单击按钮时调用 SafetyNet,在从 reCAPTCHA 服务器接收到令牌后,我们将使用handleVerify()
函数将令牌发送到我们的服务器(通过我们的服务器将验证码发送到 reCAPTCHA 服务器来验证验证码连同密钥),然后将成功消息发送回移动应用程序。该MainActivity.kt
文件的代码将是:
class MainActivity : AppCompatActivity(), View.OnClickListener {
companion object {
const val TAG = "MainActivity"
const val SITE_KEY = "YOUR_SITE_KEY"
}
private lateinit var btnverifyCaptcha: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnverifyCaptcha = findViewById(R.id.button)
btnverifyCaptcha.setOnClickListener(this)
}
override fun onClick(view: View) {
SafetyNet.getClient(this).verifyWithRecaptcha(SITE_KEY)
.addOnSuccessListener(this) { response ->
if (!response.tokenResult.isEmpty()) {
handleVerify(response.tokenResult)
}
}
.addOnFailureListener(this) { e ->
if (e is ApiException) {
Log.d(TAG,("Error message: " + CommonStatusCodes.getStatusCodeString(e.statusCode)))
} else {
Log.d(TAG, "Unknown type of error: " + e.message)
}
}
}
protected fun handleVerify(responseToken: String) {
//it is google recaptcha siteverify server
//you can place your server url
val url = "https://www.google.com/recaptcha/api/siteverify"
AndroidNetworking.get(url)
.addHeaders("token", responseToken)
.setTag("MY_NETWORK_CALL")
.setPriority(Priority.LOW)
.build()
.getAsJSONArray(object : JSONArrayRequestListener() {
fun onResponse(response: JSONArray) {
// do anything with response
}
fun onError(error: ANError) {
// handle error
}
})
}
}
最后,运行您的应用程序并单击“Click for CAPTCHA”按钮。
reCAPTCHA 的常见 API 错误
以下是 reCAPTCHA 中可能出现的错误列表:
- RECAPTCHA_INVALID_SITEKEY:如果您没有正确注册 API 密钥。您的站点密钥无效。
- RECAPTCHA_INVALID_KEYTYPE:密钥类型无效。创建新的 reCAPTCHA 密钥。
- RECAPTCHA_INVALID_PACKAGENAME:生成API时输入的包名与调用app的包名不同。添加正确的包名称。
- NETWORK_ERROR:如果没有互联网连接,则会遇到此错误。
- UNSUPPORTED_SDK_VERSION:您可能正在使用 API 级别 13 或更低级别。将您的 MinSdkVersion 更改为 14 或更高版本。
结论
在这篇文章中,我们学习了如何在我们的 Android 应用程序中使用 Google 的 reCAPTCHA。为了在我们的应用程序中使用 reCAPTCHA,我们需要获取一个站点密钥和一个秘密密钥,然后,我们从 reCAPTCHA 服务器请求验证码。一旦我们得到 reCAPTCHA 并且用户输入了验证码,我们将输入的值发送到 reCPATCA 服务器并获取验证码令牌。这个令牌被发送到我们的服务器,我们的服务器与密钥一起再次将令牌发送到 reCAPTCHA 服务器。之后,我们会收到一些成功消息,并将该消息传送到我们的 Android 应用程序。
作者:Sumit Mishra
链接:Integrating Android Google’s reCAPTCHA in Android App
网友评论