You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:48:19