基于Google API InstalledAppFlow的应用分发及client secret json使用问题
问题
如果InstalledAppFlow需要client secret json文件完成oauth2授权,那么实际生产环境中使用Google API的应用是如何进行分发的?client secret json文件是否应被视作应用的一部分,作为常量包含在应用中?
上下文
我目前正在学习通过Python模块google_auth_oauthlib使用oauth2授权访问Google API的方法,发现InstalledAppFlow授权方式的oauth2授权流程本身需要client secret文件,但我从未见过任何应用在请求授权时要求用户提供client secret。
经过大量检索,我仅找到两处官方文档相关说明:首先是Google身份文档表述:
该流程会生成一个client ID,部分场景下还会生成client secret,你可以将其嵌入应用源代码中。(该场景下client secret显然无需被当作保密信息处理。)
其次是Google云文档表述:
将凭证文件保存为client_secrets.json,该文件必须随你的应用一同分发。
请问上述说明是否意味着我需要将client secret作为常量嵌入到代码本身?
解答
核心结论
- 针对InstalledAppFlow对应的桌面/移动端等已安装应用场景,client secret确实不需要保密,可以作为应用的一部分嵌入代码或随安装包分发,不需要用户自行提供
- 该规则仅适用于已安装应用场景,Web服务端、后端API等其他场景的client secret属于敏感信息,绝对不能公开或嵌入代码分发
具体说明
- 这套规则是Google针对已安装应用的特性专门设计的:已安装应用运行在用户本地设备上,本质上不可能完全隐藏嵌入的静态凭证,因此Google在设计InstalledAppFlow时就弱化了client secret的安全属性,它仅作为应用身份的初步标识,就算泄露也不会产生安全风险——最终的用户授权凭证和单个用户的Google账号绑定,仅拿到client secret无法获取其他用户的授权信息。
- 实际生产分发的两种常用实现方式:
- 直接把
client_secret.json的全部内容硬编码为代码常量,调用InstalledAppFlow.from_client_config方法直接传入配置对象即可,不需要额外打包单独的json文件 - 把
client_secret.json作为应用资源文件一起打包,安装后存放在应用私有目录,用户完全感知不到该文件的存在,自然不需要用户手动提供
- 直接把
注意事项
如果你开发的是开源的已安装应用,嵌入自己申请的client secret没有问题,可以在文档中说明二次分发的开发者需要自行到Google Cloud控制台申请属于自己的client ID和secret替换即可,避免多个分发版本共用同一套凭证触发Google的配额限制。
内容的提问来源于stack exchange,提问作者jupiterbjy
相关产品推荐
相关产品推荐

