限制Android应用程序访问谷歌云端点

限制Android应用程序访问谷歌云端点,android,android-studio,google-cloud-endpoints,Android,Android Studio,Google Cloud Endpoints,我正在使用Android Studio为Android应用程序生成Google云端点。我已经部署了端点,它们工作正常 我想要实现的是只允许我的应用程序访问端点。所有文档都讨论了如何为用户启用身份验证,但我只需要限制仅从我的应用程序访问端点。我不想使用用户凭据,因为api不使用用户凭据 我尝试的是在谷歌控制台中为我的应用程序创建一个客户端ID,并添加到APi注释中 @Api(name = "messageEndpoint", clientIds = {Ids.WEB_CLIENT_ID, Ids.

我正在使用Android Studio为Android应用程序生成Google云端点。我已经部署了端点,它们工作正常

我想要实现的是只允许我的应用程序访问端点。所有文档都讨论了如何为用户启用身份验证,但我只需要限制仅从我的应用程序访问端点。我不想使用用户凭据,因为api不使用用户凭据

我尝试的是在谷歌控制台中为我的应用程序创建一个客户端ID,并添加到APi注释中

@Api(name = "messageEndpoint", clientIds = {Ids.WEB_CLIENT_ID, Ids.ANDROID_CLIENT_ID, Ids.API_EXPLORER}, audiences = {Ids.ANDROID_AUDIENCE}}
对于每个API方法,我都添加了一个用户参数,并检查用户是否为null。我的理解是,如果从某个客户端ID调用API,则用户不应为null。但用户总是空的

我错过什么了吗

在我的Android应用程序中,我有

GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(DelegateActivity.this, "server:client_id:" + Ids.ANDROID_AUDIENCE);
MessageEndpoint.Builder endpointBuilder = new MessageEndpoint.Builder(
                        AndroidHttp.newCompatibleTransport(), new JacksonFactory(),
                        credential);
我得到的例外是:

java.lang.NullPointerException: [qi] accountName cannot be null.
                        E   at android.os.Parcel.readException(Parcel.java:1431)
                        E   at android.os.Parcel.readException(Parcel.java:1379)
                        E   at com.google.android.gms.internal.a$a$a.a(Unknown Source)
                        E   at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
                        E   at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
                        E   at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:277)
                        E   at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:301)
                        E   at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:854)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
                        E   at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

我的理解是,在您描述的情况下,用户将为空:验证应用程序而不是用户

如果应用程序身份验证失败,那么您的端点甚至不会被调用


我假设字符串“[qi]accountName不能为null。”来自您的应用程序?

因此,在我的应用程序中,我不应该使用GoogleAccountCredential并依赖API知道调用来自正确的应用程序?但我也可以直接从web访问API。这是因为我在我的端点中声明了一个web客户端id吗?我认为,既然您的端点确实被调用了,那么无论您在客户端中做什么都可以正常工作。只需停止检查服务器上的空用户。您也可以创建一个没有凭据的Endpoint.Builder,只需将
null
作为参数传递即可。它是否工作取决于您的endpoints应用程序。如果您创建的Endpoint.Builder没有凭据,则必须删除API中有关用户是否为null的任何检查。这样做的结果是您的API不再安全。您是否碰巧找到了解决方案?