如何在Python Flask API中通过Google授权码读取受限Google Sheet
用Flask后端基于Google登录授权码读取受限Google Sheet数据
步骤1:用授权码换取访问令牌与刷新令牌
拿到前端传来的auth_code后,先向Google OAuth2服务器请求换取短期有效的访问令牌,以及用于续期的刷新令牌。在Flask中可通过requests库实现:
import requests def exchange_code_for_tokens(auth_code): token_url = "https://oauth2.googleapis.com/token" payload = { "client_id": "你的Google客户端ID", "client_secret": "你的Google客户端密钥", "code": auth_code, "grant_type": "authorization_code", "redirect_uri": "你的前端授权回调地址(需与Google控制台配置一致)" } response = requests.post(token_url, data=payload) return response.json()
步骤2:调用Google Sheets API读取数据
拿到access_token后,即可请求Sheets API读取指定表格数据。注意:前端发起登录请求时,必须带上https://www.googleapis.com/auth/spreadsheets.readonly权限范围,否则无法访问受限表格。
def read_google_sheet(access_token, spreadsheet_id, sheet_range): sheets_api_url = f"https://sheets.googleapis.com/v4/spreadsheets/{spreadsheet_id}/values/{sheet_range}" headers = {"Authorization": f"Bearer {access_token}"} response = requests.get(sheets_api_url, headers=headers) # 处理令牌过期情况 if response.status_code == 401: new_token = refresh_access_token(token_data["refresh_token"]) headers["Authorization"] = f"Bearer {new_token['access_token']}" response = requests.get(sheets_api_url, headers=headers) return response.json() def refresh_access_token(refresh_token): token_url = "https://oauth2.googleapis.com/token" payload = { "client_id": "你的Google客户端ID", "client_secret": "你的Google客户端密钥", "refresh_token": refresh_token, "grant_type": "refresh_token" } response = requests.post(token_url, data=payload) return response.json()
步骤3:Flask路由整合示例
将上述逻辑整合到Flask接口中:
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/read-sheet', methods=['POST']) def read_sheet(): auth_code = request.json.get('auth_code') if not auth_code: return jsonify({"error": "缺少授权码"}), 400 # 换取令牌 token_data = exchange_code_for_tokens(auth_code) if "error" in token_data: return jsonify(token_data), 400 # 读取指定范围数据,示例:spreadsheetId为表格ID,range格式如'Sheet1!A1:D10' sheet_data = read_google_sheet( token_data["access_token"], "你的Google Sheet ID", "Sheet1!A1:D10" ) return jsonify(sheet_data) if __name__ == '__main__': app.run(debug=True)
关键注意事项
- 需在Google Cloud控制台启用Google Sheets API,并正确配置OAuth2 Web客户端(回调地址需与代码中一致)。
- 刷新令牌需妥善存储(如数据库),避免重复要求用户授权。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

