不加载credentials.json创建Google Drive API凭据对象报错咨询
报错根因
两个报错分别对应两个独立问题,没有关联:
- 权限不足(insufficient authentication scopes):你首次发起OAuth授权请求时,申请的权限范围(scopes)没有包含Google Drive接口所需的对应权限,拿到的access_token本身没有访问Drive的授权,调用接口自然被拦截。
- 未认证调用超限(dailyLimitExceededUnreg):这个报错不是真的API配额用完了,是你代码里有低级笔误:实例化的凭据变量名是
gCreds,最后传给build()方法时写成了gCred,少拼了个s,实际传给接口的凭据是无效空值,Google API会把这类没有有效凭据的请求判定为匿名未认证请求,匿名请求的免费配额很低,很容易触发超限报错。 - 额外隐患:你现在用的
oauth2client库早在2017年就已停止维护,存在兼容风险和已知bug,官方早已不推荐使用。
修复方案
按以下顺序调整即可:
- 先修正代码笔误
把最后一行调用build的代码里的变量名改对,确保传入的是你之前实例化好的凭据对象:
# 错误写法 # build('drive', 'v3', credentials = gCred) # 正确写法 build('drive', 'v3', credentials = gCreds)
- 补全授权时的权限范围
在用户首次登录触发OAuth授权的代码里,把你需要的Google Drive权限加到scopes参数中:
- 如果只需要访问应用自己创建的Drive文件,用最小权限
https://www.googleapis.com/auth/drive.file即可,是官方推荐的配置 - 如果需要读取用户所有Drive文件,加
https://www.googleapis.com/auth/drive.readonly - 如果需要全量读写用户Drive文件,加
https://www.googleapis.com/auth/drive
注意:修改scopes配置后,必须让用户重新走一次授权流程,之前存在会话里的旧access_token是授权时没带新scope生成的,没有对应权限,无法复用。
- (强烈建议)迁移到官方维护的新版认证库
先替换依赖:
pip uninstall -y oauth2client pip install google-auth google-api-python-client
用新版库初始化凭据的代码更简洁,兼容性更好:
import os from google.oauth2.credentials import Credentials from googleapiclient.discovery import build access_token = request.session['access_token'] gCreds = Credentials( token=access_token, # 这里的scopes必须和你授权时申请的scopes完全一致 scopes=["https://www.googleapis.com/auth/drive.file"], token_uri="https://oauth2.googleapis.com/token", client_id=os.getenv('GOOGLE_CLIENT_ID'), client_secret=os.getenv('GOOGLE_CLIENT_SECRET') ) drive_service = build('drive', 'v3', credentials=gCreds)
补充说明:你当前设计的24小时会话和access_token有效期对齐的逻辑是可以正常跑的,不需要refresh_token也能工作。如果后续要拉长会话有效期,必须在授权时申请offline权限、存储返回的refresh_token,不然access_token过期后所有接口都会返回401未授权。
内容的提问来源于stack exchange,提问作者pterodactella
相关产品推荐
相关产品推荐

