Flask实现Google OAuth流程时fetch_token执行失败报错如何解决
问题本质
该报错由oauthlib默认的scope一致性校验规则触发:代码中声明的请求scope仅为https://www.googleapis.com/auth/drive.metadata.readonly,但谷歌授权服务器返回的授权scope包含了额外权限(包括gmail只读、用户基本信息、openid等),两者不一致时oauthlib会抛出错误阻断流程。
该现象和代码中开启的include_granted_scopes='true'参数直接相关:该参数会触发谷歌的增量授权逻辑,将该用户历史给当前应用授权过的所有scope一并返回,正好命中了oauthlib的校验规则。
解决方案
方案1:关闭scope变更校验(推荐)
适配增量授权逻辑,仅需新增一行环境变量配置即可,无需修改其他业务代码:
if __name__ == '__main__': # 本地运行时禁用OAuthlib的HTTPs校验 # 开发者操作提示:生产环境运行时*切勿*开启该选项 os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # 新增配置:关闭scope变更校验,允许返回的scope包含额外已授权权限 os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '1' waitress.serve(app, port="8080", url_scheme="https")
方案2:关闭增量授权
如果不需要获取用户历史授权的所有scope,直接修改授权URL生成参数即可,仅返回本次请求的scope:
authorization_url, state = flow.authorization_url( # 开启离线访问,无需重复征求用户权限即可刷新access token,推荐Web服务端应用使用 access_type='offline', # 将原true改为false,关闭增量授权 include_granted_scopes='false')
如果返回的额外scope不属于你预期的授权范围,可检查谷歌云控制台对应项目的OAuth客户端配置,确认是否添加了多余的强制授权scope。
内容的提问来源于stack exchange,提问作者Mohammed Suhail CS
相关产品推荐
相关产品推荐

