Android集成Google Photos Library API遇401错误,求OAuth2.0配置方案
解决Google Photos Library API 401错误与Credentials配置指南
嘿,我之前折腾Google Photos API的时候也踩过401的坑,结合你的情况给你梳理下排查步骤和配置方法,应该能帮到你:
一、先搞定Credentials.json的配置(401的核心原因之一)
你猜的没错,client_id和project_id的配置确实是关键,步骤其实很清晰:
下载正确的Credentials.json
- 登录Google API控制台找到你的项目,进入「APIs & Services」→「Credentials」页面
- 要是还没创建OAuth客户端ID,就点「创建凭据」→「OAuth客户端ID」,选「Android」类型
- 这里一定要填对应用包名和SHA-1指纹!debug和release环境的SHA-1是不一样的,开发阶段用debug的就行,填错了直接导致授权失败
- 创建完后点击「下载JSON」,这个就是
credentials.json
在Android项目中配置凭据
- 把
credentials.json放到app/src/main/res/raw目录(没有raw目录就新建一个) - 加载凭据的时候,别硬编码
client_id,最好通过资源文件解析:// 示例:在初始化GoogleSignInOptions时配置 val inputStream = resources.openRawResource(R.raw.credentials) val jsonObject = JSONObject(String(inputStream.readBytes())) val clientId = jsonObject.getString("client_id") val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(GOOGLE_PHOTOS_SCOPE) .setClientId(clientId) .build() - 也可以用Google Services插件偷懒:把
credentials.json改名为google-services.json放到app根目录,插件会自动帮你配置这些信息,不用手动解析
- 把
验证权限是否真的拿到了
你的权限请求代码看着没问题,但要确认用户真的完成了授权:- 有没有弹出授权弹窗?用户点了允许吗?
- 可以加个日志确认权限状态:
val account = GoogleSignIn.getLastSignedInAccount(this) val hasPhotoPerm = GoogleSignIn.hasPermissions(account, GOOGLE_PHOTOS_SCOPE) Log.d(TAG, "是否拥有相册读取权限:$hasPhotoPerm")
如果这里返回
false,那就是授权流程没走通,大概率是凭据配置错了
二、Google OAuth2.0 最佳实践(踩坑总结)
作为经常和Google API打交道的人,分享几个必须注意的点:
- 最小权限原则:只请求你需要的权限,比如你只读相册就用
photoslibrary.readonly,别贪多请求读写权限,用户更愿意授权,也更安全 - 别泄露凭据:绝对不要把
client_id、client_secret硬编码到代码里,也别提交到Git这类版本控制系统,用资源文件或者Google Services插件处理最稳妥 - 处理令牌过期:OAuth2的访问令牌通常1小时就过期,Google Sign-In库会自动刷新,但要记得在API请求前检查令牌有效性,或者捕获401错误后触发刷新
- 精细化错误处理:遇到401别慌,打印完整的响应头(比如
WWW-Authenticate字段),里面会告诉你是令牌过期、权限不足还是凭据错误 - 测试环境隔离:开发和生产用不同的OAuth客户端ID,避免测试操作影响真实用户
最后再检查几个容易忽略的点
- 确认API控制台里的Photos Library API真的启用了(虽然你说已经开了,但再检查一遍没坏处)
- 清除应用数据,重新走一遍授权流程,有时候旧的缓存令牌会搞事情
- 要是用的是模拟器,确认Google Play服务是最新版本,旧版本可能会有授权问题
如果按上面的步骤来还是有问题,把API请求的完整响应日志贴出来,比如响应码、响应头内容,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者karlkar
相关产品推荐
相关产品推荐

