使用 App Check 保护自定义后端资源 (Android)
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
您可以使用 App Check 来保护应用的非 Google 自定义后端资源,例如您自己的自托管后端。为此,您需要执行以下两项操作:
- 修改您的应用客户端,以将 App Check 令牌随每个请求一起发送到后端,如本页所述。
- 按照从自定义后端验证 App Check 令牌中所述,修改后端以要求将有效的 App Check 令牌随每个请求一起发送。
准备工作
使用默认的 Play Integrity 提供方或自定义提供方将 App Check 添加到您的应用。
通过后端请求发送 App Check 令牌
为了确保您的后端请求包含有效且未过期的 App Check 令牌,请将每个请求封装在对 getAppCheckToken()
的调用中。App Check 库会在必要时刷新令牌,您可以在该方法的成功监听器中访问令牌。
获取有效的令牌后,请将其随请求一起发送到后端。具体如何实现取决于您自己,但不要将 App Check 令牌作为网址的一部分(包含在查询参数中)发送,因为这样会使其容易发生意外泄露以及被意外拦截。推荐的方法是在自定义 HTTP 标头中发送令牌。
例如,如果您使用 Retrofit:
Kotlin
class ApiWithAppCheckExample {
interface YourExampleBackendService {
@GET("yourExampleEndpoint")
fun exampleData(
@Header("X-Firebase-AppCheck") appCheckToken: String,
): Call<List<String>>
}
var yourExampleBackendService: YourExampleBackendService = Retrofit.Builder()
.baseUrl("https://yourbackend.example.com/")
.build()
.create(YourExampleBackendService::class.java)
fun callApiExample() {
Firebase.appCheck.getAppCheckToken(false).addOnSuccessListener { appCheckToken ->
val token = appCheckToken.token
val apiCall = yourExampleBackendService.exampleData(token)
// ...
}
}
}
Java
public class ApiWithAppCheckExample {
private interface YourExampleBackendService {
@GET("yourExampleEndpoint")
Call<List<String>> exampleData(
@Header("X-Firebase-AppCheck") String appCheckToken);
}
YourExampleBackendService yourExampleBackendService = new Retrofit.Builder()
.baseUrl("https://yourbackend.example.com/")
.build()
.create(YourExampleBackendService.class);
public void callApiExample() {
FirebaseAppCheck.getInstance()
.getAppCheckToken(false)
.addOnSuccessListener(new OnSuccessListener<AppCheckToken>() {
@Override
public void onSuccess(@NonNull AppCheckToken appCheckToken) {
String token = appCheckToken.getToken();
Call<List<String>> apiCall =
yourExampleBackendService.exampleData(token);
// ...
}
});
}
}
重放攻击防范(Beta 版)
若是对启用了重放攻击防范的端点发出请求,请将请求封装在对 getLimitedUseAppCheckToken()
(而非 getAppCheckToken()
)的调用中:
Kotlin
Firebase.appCheck.limitedUseAppCheckToken.addOnSuccessListener {
// ...
}
Java
FirebaseAppCheck.getInstance()
.getLimitedUseAppCheckToken().addOnSuccessListener(
new OnSuccessListener<AppCheckToken>() {
@Override
public void onSuccess(AppCheckToken appCheckToken) {
String token = appCheckToken.getToken();
// ...
}
}
);
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-23。
[null,null,["最后更新时间 (UTC):2025-08-23。"],[],[],null,["You can use App Check to protect non-Google custom backend resources for\nyour app, like your own self-hosted backend. To do so, you'll need to do both of\nthe following:\n\n- Modify your app client to send an App Check token along with each request to your backend, as described on this page.\n- Modify your backend to require a valid App Check token with every request, as described in [Verify App Check tokens from a custom backend](/docs/app-check/custom-resource-backend).\n\nBefore you begin\n\nAdd App Check to your app, using either the default\n[Play Integrity provider](/docs/app-check/android/play-integrity-provider), or a\n[custom provider](/docs/app-check/android/custom-provider).\n\nSend App Check tokens with backend requests\n\nTo ensure your backend requests include a valid, unexpired, App Check token,\nwrap each request in a call to `getAppCheckToken()`. The App Check library\nwill refresh the token if necessary, and you can access the token in the\nmethod's success listener.\n\nOnce you have a valid token, send it along with the request to your backend. The\nspecifics of how you accomplish this are up to you, but *don't send\nApp Check tokens as part of URLs*, including in query parameters, as this\nmakes them vulnerable to accidental leakage and interception. The recommended\napproach is to send the token in a custom HTTP header.\n\nFor example, if you use Retrofit: \n\nKotlin \n\n```kotlin\nclass ApiWithAppCheckExample {\n interface YourExampleBackendService {\n @GET(\"yourExampleEndpoint\")\n fun exampleData(\n @Header(\"X-Firebase-AppCheck\") appCheckToken: String,\n ): Call\u003cList\u003cString\u003e\u003e\n }\n\n var yourExampleBackendService: YourExampleBackendService = Retrofit.Builder()\n .baseUrl(\"https://yourbackend.example.com/\")\n .build()\n .create(YourExampleBackendService::class.java)\n\n fun callApiExample() {\n Firebase.appCheck.getAppCheckToken(false).addOnSuccessListener { appCheckToken -\u003e\n val token = appCheckToken.token\n val apiCall = yourExampleBackendService.exampleData(token)\n // ...\n }\n }\n}https://github.com/firebase/snippets-android/blob/391c1646eacf44d2aab3f76bcfa60dfc6c14acf1/appcheck/app/src/main/java/com/google/firebase/example/appcheck/kotlin/ApiWithAppCheckExample.kt#L11-L31\n```\n\nJava \n\n```java\npublic class ApiWithAppCheckExample {\n private interface YourExampleBackendService {\n @GET(\"yourExampleEndpoint\")\n Call\u003cList\u003cString\u003e\u003e exampleData(\n @Header(\"X-Firebase-AppCheck\") String appCheckToken);\n }\n\n YourExampleBackendService yourExampleBackendService = new Retrofit.Builder()\n .baseUrl(\"https://yourbackend.example.com/\")\n .build()\n .create(YourExampleBackendService.class);\n\n public void callApiExample() {\n FirebaseAppCheck.getInstance()\n .getAppCheckToken(false)\n .addOnSuccessListener(new OnSuccessListener\u003cAppCheckToken\u003e() {\n @Override\n public void onSuccess(@NonNull AppCheckToken appCheckToken) {\n String token = appCheckToken.getToken();\n Call\u003cList\u003cString\u003e\u003e apiCall =\n yourExampleBackendService.exampleData(token);\n // ...\n }\n });\n }\n}https://github.com/firebase/snippets-android/blob/391c1646eacf44d2aab3f76bcfa60dfc6c14acf1/appcheck/app/src/main/java/com/google/firebase/example/appcheck/ApiWithAppCheckExample.java#L18-L43\n```\n\nReplay protection (beta)\n\nWhen making a request to an endpoint for which you've enabled\n[replay protection](/docs/app-check/custom-resource-backend#replay-protection),\nwrap the request in a call to `getLimitedUseAppCheckToken()` instead of\n`getAppCheckToken()`: \n\nKotlin \n\n```kotlin\nFirebase.appCheck.limitedUseAppCheckToken.addOnSuccessListener {\n // ...\n}https://github.com/firebase/snippets-android/blob/391c1646eacf44d2aab3f76bcfa60dfc6c14acf1/appcheck/app/src/main/java/com/google/firebase/example/appcheck/kotlin/ApiWithAppCheckExample.kt#L37-L39\n```\n\nJava \n\n```java\nFirebaseAppCheck.getInstance()\n .getLimitedUseAppCheckToken().addOnSuccessListener(\n new OnSuccessListener\u003cAppCheckToken\u003e() {\n @Override\n public void onSuccess(AppCheckToken appCheckToken) {\n String token = appCheckToken.getToken();\n // ...\n }\n }\n );https://github.com/firebase/snippets-android/blob/391c1646eacf44d2aab3f76bcfa60dfc6c14acf1/appcheck/app/src/main/java/com/google/firebase/example/appcheck/ApiWithAppCheckExample.java#L49-L58\n```"]]