Google OAuth细粒度权限:Identity Service替代hasPermissions方法咨询
解决方案
针对已弃用的auth.api.signin SDK
除了官方文档提到的hasPermissions(),你还可以通过GoogleSignInAccount实例的getGrantedScopes()方法直接获取用户实际授予的权限集合,再自行比对目标权限:
// 获取当前登录用户的账户信息 GoogleSignInAccount signedInAccount = GoogleSignIn.getLastSignedInAccount(context); if (signedInAccount != null) { // 获取所有已授予的权限范围 Set<String> grantedScopes = signedInAccount.getGrantedScopes(); // 检查是否包含你需要的特定权限 boolean hasTargetPermission = grantedScopes.contains("https://www.googleapis.com/auth/your-target-scope"); }
迁移到Google Identity Services(GIS)的正确做法
由于auth.api.signin已被弃用,官方推荐使用GIS处理授权场景,这里提供两种替代权限检查的方案:
- 解析访问令牌的权限:获取用户的访问令牌后,可通过Google的tokeninfo端点解析令牌包含的权限(注意该端点有调用频次限制,适合非高频检查场景)。示例逻辑:
// 假设已获取到accessToken OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://oauth2.googleapis.com/tokeninfo?access_token=" + accessToken) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { String responseBody = response.body().string(); // 解析JSON获取scope字段,拆分后得到权限列表 JSONObject json = new JSONObject(responseBody); String scopeStr = json.getString("scope"); Set<String> grantedScopes = new HashSet<>(Arrays.asList(scopeStr.split(" "))); // 检查目标权限是否存在 } - 本地存储已授予权限:在用户首次授权成功后,将返回的权限范围存储到本地(如SharedPreferences),后续检查时直接读取本地数据。若后续用户在Google账号设置中撤销了权限,下次请求令牌时会收到权限错误,此时再重新发起授权流程即可。
内容的提问来源于stack exchange,提问作者ndreisg
相关产品推荐
相关产品推荐

