没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient
Posted
技术标签:
【中文标题】没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient【英文标题】:Google Cloud Endpoints + GoogleApiClient in Android without GET_ACCOUNTS permission 【发布时间】:2016-07-15 04:12:22 【问题描述】:有没有什么方法可以在 android 应用程序中使用 GoogleApiClient 验证 Google Endpoints 而无需强制获得 GET_ACCOUNTS 权限?
具有新运行时权限的 Android 23+ 将要求用户提供不需要的 READ_CONTACTS 权限。奇怪的是,所有带有 Google Endpoints 的 Android 应用现在都需要 READ_CONTACTS 权限。
我能找到的最接近的 *** 问题是 this,但它声称它可能只能在非常有限的时间内工作。这个 Google post 提供了一些使用令牌的指导,但不适用于端点。
【问题讨论】:
如果您查看 Google 文档,唯一的方法是使用 ACCOUNTS 权限。在支持对需要身份验证的端点的请求时,您的 Android 客户端需要获取用户凭据并将其传递给服务对象。检查此page 了解更多信息。此外,在您的游戏可以对 Google Play 游戏服务进行任何调用之前,它必须首先通过使用 GoogleApiClient 对象并使用 Google Play 游戏服务对用户进行身份验证来建立与 Google Play 服务器的异步连接。 @aez - 你能参考它说你需要 GET_ACCOUNTS 的地方吗? READ_CONTACTS 仅在您正在读取联系人或获取当前用户的联系信息时才需要。 @KENdi - 是的,需要 GET_ACCOUNTS 权限是问题所在。 Android Marshmallow 及更高版本 (23+) 将 GET_ACCOUNTS 与 READ_CONTACTS(@Clayton 参见 this)权限分组,然后在运行时需要用户对 READ_CONTACTS 的权限。这对我来说意味着任何使用 Google Endpoints 的 Marshmallow 或更高版本的 Android 应用都需要在运行时获得 READ_CONTACTS 权限。 当您说“Google Endpoints”时,您是什么意思?例如,您可以在没有此权限的情况下调用游戏服务 API(无需其他权限)。 我认为正确的名称是“Google Cloud Endpoints”,描述为here。如果您使用经过身份验证的 Google Cloud Endpoints,则必须使用 GET_ACCOUNTS。所以,是的,我可以使用游戏服务 API,但如果我使用经过身份验证的 Google Cloud Endpoints 后端,我就会遇到权限问题。 【参考方案1】:我终于找到了解决方案。我更新了答案on the question you mentioned。
为避免 1 小时令牌限制,请使用 GoogleSignInApi.silentSignIn() 在每次之前获得一个新令牌 打电话给你的端点。例如,如果您不在 UI 中 线程:
GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail()
.requestIdToken(CLIENT_ID)
.build();
GoogleSignInClient client = GoogleSignIn.getClient(context, options);
GoogleSignInAccount user = Tasks.await(getGoogleSignInClient(context).silentSignIn());
// Use the new user token as before
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
.setJsonFactory(JacksonFactory.getDefaultInstance())
.build();
credential.setAccessToken(user.getIdToken());
【讨论】:
以上是关于没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.SecurityException:调用者 uid XXXXX 缺少任何 android.permission.GET_ACCOUNTS