Google 致力于为黑人社区推动种族平等。查看具体举措

在 Android 上使用 App Check 保护非 Firebase 资源

您可以使用 App Check 保护应用的非 Firebase 资源,例如自托管后端。为此,您需要修改您的应用程序客户端以将 App Check 令牌与每个请求一起发送到您的后端,并将您的后端修改为每个请求都需要有效的 App Check 令牌;下面对这两项任务进行了说明。

在你开始之前

添加应用程序检查到您的应用程序,将使用默认安全网供应商,或自定义提供

使用后端请求发送 App Check 令牌

为了确保您的后端请求包含一个有效的,未过期的,应用程序检查令牌,在呼叫包装每个请求getAppCheckToken() App Check 库会在必要时刷新令牌,您可以在方法的成功侦听器中访问令牌。

获得有效令牌后,将其与请求一起发送到后端。你是如何做到这一点的细节是你的,但不发送应用程序检查令牌作为网址的一部分,包括在查询参数,因为这使得他们很容易受到意外泄漏和拦截。推荐的方法是在自定义 HTTP 标头中发送令牌。

例如,如果您使用改造:

爪哇

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 tokenResponse) {
                        String appCheckToken = tokenResponse.getToken();
                        Call<List<String>> apiCall =
                                yourExampleBackendService.exampleData(appCheckToken);
                        // ...
                    }
                });
    }
}

科特林+KTX

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() {
        FirebaseAppCheck.getInstance()
            .getAppCheckToken(false)
            .addOnSuccessListener { tokenResponse ->
                val appCheckToken = tokenResponse.token
                val apiCall = yourExampleBackendService.exampleData(appCheckToken)
                // ...
            }
    }
}

在后端验证 App Check 令牌

在你的后端代码,如果您尚未安装了Node.js的管理SDK ,这样做。然后,向您的 API 端点添加执行以下操作的逻辑:

  • 检查每个请求是否包含 App Check 令牌。

  • 验证应用程序检查令牌使用管理SDK的appCheck().verifyToken()方法。

    如果验证成功, verifyToken()返回解码的应用程序检查令牌。成功验证表明令牌源自属于您的 Firebase 项目的应用。

拒绝任何未通过检查的请求。例如,使用 Express.js 中间件:

const express = require('express');
const app = express();

const firebaseAdmin = require('firebase-admin');
const firebaseApp = firebaseAdmin.initializeApp();

const appCheckVerification = async (req, res, next) => {
    const appCheckToken = req.header('X-Firebase-AppCheck');

    if (!appCheckToken) {
        res.status(401);
        return next('Unauthorized');
    }

    try {
        const appCheckClaims = await firebaseAdmin.appCheck().verifyToken(appCheckToken);

        // If verifyToken() succeeds, continue with the next middleware
        // function in the stack.
        return next();
    } catch (err) {
        res.status(401);
        return next('Unauthorized');
    }
}

app.get('/yourApiEndpoint', [appCheckVerification], (req, res) => {
    // Handle request.
});