如何获取Google Cloud Console中符合要求的'authorized_user'类型JSON凭据文件以解决Flask应用Gmail API认证报错问题
我明白你现在的困扰——Google Cloud Console里生成的凭据文件总是不对,导致DefaultCredentialsError提示类型为None,其实这个问题很常见,因为你需要的authorized_user类型凭据,不是直接从控制台下载就能得到的,得走OAuth 2.0的用户授权流程才能生成。下面一步步给你说怎么做:
一、先确认基础配置没问题
首先确保你已经在Google Cloud Console里完成了这两步:
- 你的项目已经启用了Gmail API(如果还没启用,去「API和服务」→「库」里搜索Gmail API并启用)
- 已经创建了OAuth 2.0客户端ID(如果还没创建,继续往下看)
二、创建正确的OAuth 2.0客户端ID
- 进入Google Cloud Console的「API和服务」→「凭据」页面
- 点击顶部的「创建凭据」,选择「OAuth客户端ID」
- 应用类型选择桌面应用(别选Web应用!桌面应用类型的客户端ID更适合本地/服务器端的Flask应用获取用户授权凭据)
- 给这个客户端ID起个好记的名字,比如「Flask Gmail重置密码应用」,然后点击「创建」
- 弹出的窗口里会显示客户端ID和客户端密钥,点击「下载JSON」,这个文件是
client_secret_xxx.json,先保存好——注意,这个文件还不是我们最终需要的authorized_user类型凭据,只是用来获取授权的入口文件。
三、运行授权脚本生成authorized_user凭据
你需要先运行一个简单的脚本,通过OAuth流程获取用户授权,生成带有type: authorized_user的凭据文件:
from google_auth_oauthlib.flow import InstalledAppFlow from google.oauth2.credentials import Credentials from google.auth.transport.requests import Request import os # 定义Gmail发邮件需要的权限范围,重置密码只需要发送权限就够了 SCOPES = ['https://www.googleapis.com/auth/gmail.send'] def generate_authorized_creds(): # 替换成你刚才下载的client_secret文件路径 client_secret_path = "path/to/your/client_secret_xxx.json" creds = None # token.json就是最终要生成的authorized_user类型凭据文件 if os.path.exists('token.json'): creds = Credentials.from_authorized_user_file('token.json', SCOPES) # 如果凭据无效、过期,或者不存在,就走授权流程 if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: # 初始化授权流 flow = InstalledAppFlow.from_client_secrets_file( client_secret_path, SCOPES) # 本地运行会弹出浏览器,让你用目标Google账号登录授权 creds = flow.run_local_server(port=0) # 把授权后的凭据保存到token.json with open('token.json', 'w') as token_file: token_file.write(creds.to_json()) return creds if __name__ == '__main__': generate_authorized_creds()
运行这个脚本后,会自动弹出浏览器,你用要发送邮件的Google账号登录,授权这个应用访问你的Gmail发送权限,之后脚本会在当前目录生成token.json——打开这个文件,你就能看到"type": "authorized_user"字段了,这就是你需要的凭据文件!
四、替换Flask应用中的凭据路径
最后把你Flask配置里的Config.Config.PATH改成这个token.json的路径,再运行你的代码,DefaultCredentialsError就应该消失了。
为什么之前的文件不行?因为你之前下载的可能是OAuth客户端ID的client_secret文件,或者服务账号文件,这些都不是authorized_user类型——authorized_user凭据是经过用户授权后生成的,包含访问令牌、刷新令牌等信息,必须通过OAuth授权流程才能得到,直接从控制台下载是拿不到的。
备注:内容来源于stack exchange,提问作者Mark Kariuki




