使用Python的google-auth-oauthlib库实现Google OAuth时,如何仅获取登录用户的邮箱地址?
使用Python的google-auth-oauthlib库实现Google OAuth时,如何仅获取登录用户的邮箱地址?
嗨,我之前也碰到过一模一样的困惑,其实完全不需要加那些多余的API权限(比如gmail-readonly),用google-auth-oauthlib本身就能轻松拿到用户邮箱,核心是设置正确的OAuth授权范围,再利用库内置的方法解析用户信息就行,我给你一步步梳理:
第一步:配置正确的OAuth Scope
你只需要在初始化OAuth流程时,指定两个必要的Scope,完全不需要额外权限:
openid:开启OpenID Connect模式,这是获取用户身份信息的基础https://www.googleapis.com/auth/userinfo.email:专门用于获取用户邮箱的权限
第二步:通过已授权凭证获取邮箱
当用户完成授权回调后,拿到credentials对象,有两种简单的方式提取邮箱:
方法1:直接解析ID Token(推荐,无需额外请求)
Google OAuth返回的credentials里包含id_token(一个JWT令牌),里面已经封装了用户邮箱信息,用库自带的方法就能解析:
from google_auth_oauthlib.flow import Flow from google.oauth2 import id_token from google.auth.transport.requests import Request # 初始化Flow时指定正确的Scope flow = Flow.from_client_secrets_file( "你的client_secret.json路径", scopes=["openid", "https://www.googleapis.com/auth/userinfo.email"], redirect_uri="你的回调地址" ) # 处理授权回调的示例逻辑 def handle_oauth_callback(request): # 获取授权令牌 flow.fetch_token(authorization_response=request.url) credentials = flow.credentials # 验证并解析ID Token try: id_info = id_token.verify_oauth2_token( credentials.id_token, Request(), credentials.client_id # 你的OAuth客户端ID ) # 提取用户邮箱 user_email = id_info.get("email") print(f"登录用户邮箱:{user_email}") # 这里可以添加你的业务逻辑 except ValueError: print("ID Token验证失败,请检查授权流程")
方法2:调用用户信息端点(可选)
如果更习惯API请求的方式,也可以用credentials里的访问令牌调用Google用户信息端点,这个请求不需要额外权限,只要有上面的Scope就能访问:
import requests # 在拿到credentials之后执行 headers = {"Authorization": f"Bearer {credentials.token}"} response = requests.get("https://www.googleapis.com/oauth2/v1/userinfo", headers=headers) user_info = response.json() user_email = user_info.get("email")
最后要注意的细节
- 确保在Google Cloud Console的OAuth同意屏幕中,已经添加了上述两个Scope,否则用户授权时会提示权限不足
- 如果你的应用面向外部用户,需要把应用发布到「生产」状态,否则只有测试用户列表里的账号能正常授权
这样就完全不需要依赖额外的API权限,只用google-auth-oauthlib就能拿到用户邮箱啦!
备注:内容来源于stack exchange,提问作者enoeht
相关产品推荐
相关产品推荐

