Flutter集成多OAuth权限范围的Google登录时遭遇「Access blocked: Authorization error, Error: Invalid_scope」授权拦截错误
遇到这种Invalid_scope授权错误确实挺闹心的,我结合你的配置和代码帮你梳理下核心问题点和对应的解决办法:
一、最可能的元凶:Google Keep API的Scope限制
首先要敲黑板:Google Keep API目前是受限访问状态,普通开发者无法直接在Google Cloud Console中启用该API,也不能在OAuth请求中使用https://www.googleapis.com/auth/keep这个Scope——哪怕你在代码里加了这个Scope,Google的授权服务器也会直接判定为无效Scope,这大概率是你报错的核心原因。
你提到“Enabled Google Keep API (if available)”,但实际上这个API不对普通开放,只有获得Google官方邀请的开发者才能使用。所以第一步建议先移除代码中Keep相关的Scope,测试是否能正常完成授权。
二、排查OAuth同意屏幕的Scope配置
即使你在代码里声明了Scope,也必须在Google Cloud Console的OAuth同意屏幕中显式添加这些Scope,否则Google会拒绝授权:
- 进入Google Cloud Console → 你的项目 → API和服务 → OAuth同意屏幕
- 点击编辑应用,进入“范围”步骤
- 点击添加或移除范围,确保以下Scope都已添加:
.../auth/userinfo.email.../auth/userinfo.profileopenid.../auth/calendar
- 保存并发布同意屏幕(测试环境下发布到测试用户即可)
三、代码中Scope的写法优化
你的代码里混合使用了简写Scope(email、profile)和完整路径Scope,虽然google_sign_in包会自动将简写映射为完整路径,但为了避免潜在的冲突或识别问题,建议统一使用完整路径的Scope写法:
import 'package:google_sign_in/google_sign_in.dart'; class GoogleSignInService { static final GoogleSignIn _googleSignIn = GoogleSignIn( scopes: [ 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile', 'openid', 'https://www.googleapis.com/auth/calendar', // 暂时注释掉Keep的Scope,先验证其他功能 // 'https://www.googleapis.com/auth/keep', ], ); static Future<GoogleSignInAccount?> signIn() async { try { final GoogleSignInAccount? account = await _googleSignIn.signIn(); return account; } catch (error) { print('Google Sign-In Error: $error'); return null; } } }
四、其他排查点
- 重复/冗余Scope检查:你的OAuth请求参数里同时出现了简写和完整路径的Scope(比如
email和userinfo.email),虽然不会直接报错,但建议保持代码和请求参数的一致性。 - API启用状态确认:再次确认Google Calendar API确实已启用(进入API库搜索Calendar API,查看是否显示“已启用”)。
- 应用缓存清理:卸载并重装你的测试应用,清除旧的OAuth授权缓存,避免残留配置干扰。
- 测试用户验证:确保你用来测试的邮箱已添加到OAuth同意屏幕的测试用户列表中,未添加的邮箱会触发授权拦截。
验证步骤
- 先移除Keep相关的Scope,运行代码测试授权是否正常。
- 如果授权成功,说明问题确实出在Keep的Scope上,你可以考虑放弃集成Keep功能,或者通过Google的官方渠道申请Keep API的访问权限。
- 如果移除Keep后仍然报错,再检查Calendar的Scope是否已正确添加到OAuth同意屏幕,以及SHA-1指纹、包名是否完全匹配。
内容来源于stack exchange
相关产品推荐
相关产品推荐

