Python调用GoogleOAuth2认证接口教程
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个文章开发实战,手把手教大家学习《Python实现OAuth2访问Google认证REST接口》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

本文探讨了如何通过Python访问需要Google认证的REST端点。针对不同场景,文章详细介绍了两种主要策略:利用OAuth2进行API级认证,适用于与结构化API交互;以及模拟浏览器行为进行网页抓取,适用于从网页获取数据。教程将涵盖OAuth2流程、所需库及实现代码示例,并提供相关注意事项。
在尝试通过Python的requests库访问某些REST端点时,开发者常会遇到“未授权”(unauthorized)的响应。这通常是因为目标服务需要用户通过Google账户进行身份验证,浏览器会自动将用户重定向到Google的登录页面。这种基于浏览器的交互式认证机制,不能简单地通过一次requests.post调用来模拟。解决此问题需要根据具体的使用场景选择合适的策略。
策略一:利用OAuth2进行API级认证
如果你的目标是访问一个提供了API接口的服务,并且该服务支持Google OAuth2作为认证方式,那么OAuth2是更推荐且专业的解决方案。OAuth2是一种授权框架,允许第三方应用在不获取用户密码的情况下,访问用户在另一服务提供商(如Google)上的受保护资源。
何时使用
- 你需要与服务的API进行结构化交互(例如,获取特定数据、执行操作)。
- 服务提供了明确的API文档,并支持Google OAuth2认证。
- 你希望以程序化的方式,而非模拟用户界面交互来完成认证。
Google OAuth2 核心概念
- 客户端ID和客户端密钥(Client ID & Client Secret):在Google Cloud Console中注册你的应用程序后获得,用于标识你的应用。
- 授权范围(Scopes):定义了你的应用程序可以访问的用户数据类型和操作权限(例如,https://www.googleapis.com/auth/userinfo.email 用于获取用户邮箱)。
- 授权流程(Authorization Flow):根据应用类型(如Web应用、桌面应用、服务器间通信)有不同的流程,例如:
- 授权码流(Authorization Code Flow):最常见的Web应用流程,涉及用户在浏览器中授权,然后应用获取授权码,再用授权码交换访问令牌和刷新令牌。
- 服务账号(Service Accounts):适用于服务器间通信,无需用户交互,服务账号直接代表应用访问Google API。
- 设备码流(Device Code Flow):适用于没有浏览器或输入能力受限的设备。
实施步骤与Python示例
以授权码流为例,演示如何在Python中获取访问令牌并进行认证请求。这通常涉及用户一次性在浏览器中授权,然后你的Python应用可以使用获得的刷新令牌(Refresh Token)来持续获取新的访问令牌。
在Google Cloud Console中配置项目
- 创建一个新项目或选择现有项目。
- 启用所需的Google API(例如,如果目标服务使用了Google Drive API,则需启用Drive API)。
- 在“凭据”部分,创建OAuth客户端ID,选择“Web 应用程序”类型,并配置授权的重定向URI(例如 http://localhost:8080 用于本地测试)。下载client_secret.json文件。
Python代码示例:获取并使用访问令牌
我们将使用google-auth和google-auth-oauthlib库来简化OAuth2流程。
import requests import os from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request import pickle # 定义OAuth2范围,根据你的需求调整 # 这里的范围是示例,你需要根据目标API的要求来设置 SCOPES = ['https://www.googleapis.com/auth/userinfo.email', 'openid'] # 凭据文件的路径 CLIENT_SECRET_FILE = 'client_secret.json' TOKEN_PICKLE_FILE = 'token.pickle' # 用于保存和加载凭据 def get_google_credentials(): credentials = None # 尝试从文件中加载保存的凭据 if os.path.exists(TOKEN_PICKLE_FILE): with open(TOKEN_PICKLE_FILE, 'rb') as token: credentials = pickle.load(token) # 如果没有凭据或凭据已过期,则进行认证流程 if not credentials or not credentials.valid: if credentials and credentials.expired and credentials.refresh_token: credentials.refresh(Request()) # 刷新令牌 else: flow = InstalledAppFlow.from_client_secrets_file( CLIENT_SECRET_FILE, SCOPES) # 这将打开一个浏览器窗口,要求用户登录并授权 credentials = flow.run_local_server(port=0) # 保存凭据以备将来使用 with open(TOKEN_PICKLE_FILE, 'wb') as token: pickle.dump(credentials, token) return credentials def access_authenticated_endpoint(url): credentials = get_google_credentials() if not credentials: print("无法获取Google凭据。") return # 使用获得的访问令牌进行请求 # 访问令牌通常在请求头中作为Bearer Token发送 headers = { 'Authorization': f'Bearer {credentials.token}', 'Content-Type': 'application/json' } try: response = requests.get(url, headers=headers) # 示例使用GET,根据需要调整为POST等 response.raise_for_status() # 检查HTTP错误 print(f"请求成功!状态码: {response.status_code}") print("响应内容:") print(response.json()) # 假设响应是JSON except requests.exceptions.HTTPError as e: print(f"HTTP错误: {e}") print(f"响应内容: {e.response.text}") except requests.exceptions.RequestException as e: print(f"请求发生错误: {e}") # 示例用法 if __name__ == '__main__': # 替换为你的目标API端点 # 这里的URL仅为示例,你需要替换为实际需要Google认证的API端点 target_api_url = "https://your-authenticated-api.com/data" access_authenticated_endpoint(target_api_url)
注意事项
- 安全性:client_secret.json文件包含敏感信息,绝不能暴露在客户端代码或版本控制中。在生产环境中,应使用环境变量或安全的配置管理系统来存储凭据。
- 令牌管理:访问令牌通常有有效期,过期后需要使用刷新令牌重新获取。google-auth库会自动处理刷新令牌的逻辑。
- 授权范围:请求的SCOPES应尽可能小,只包含应用所需的权限,以遵循最小权限原则。
- 错误处理:在实际应用中,需要对各种网络错误、认证失败、API限速等情况进行健壮的错误处理。
策略二:模拟浏览器行为进行网页抓取
如果目标服务没有提供API接口,或者你只是想从需要Google登录的网页中抓取数据,那么模拟浏览器行为可能是唯一的选择。这种方法比OAuth2复杂,因为它需要处理JavaScript执行、重定向、Cookie管理以及潜在的反爬机制。
何时使用
- 目标是获取网页上显示的数据,而不是与结构化API交互。
- 服务没有提供可用的API接口。
- 需要模拟用户在浏览器中完成Google登录的全过程。
挑战
- JavaScript执行:Google登录页面大量依赖JavaScript。requests库本身无法执行JavaScript。
- 重定向与Cookie:需要正确处理HTTP重定向,并维护会话Cookie,以便在认证后保持登录状态。
- CAPTCHA:Google可能会在登录过程中触发CAPTCHA验证。
- 反爬机制:网站可能会检测自动化访问并阻止。
实现方法与Python示例
对于需要执行JavaScript的复杂登录流程,selenium是一个强大的工具,它允许你控制真实的浏览器(或无头浏览器)。
安装必要的库和浏览器驱动
pip install selenium
你需要下载对应浏览器(如Chrome、Firefox)的驱动程序(如ChromeDriver、GeckoDriver),并将其路径添加到系统PATH或在代码中指定。
Python代码示例:使用Selenium模拟登录
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def simulate_google_login_and_access_site(target_url, google_email, google_password): # 配置Chrome浏览器,可以使用无头模式(不显示浏览器窗口) options = webdriver.ChromeOptions() # options.add_argument('--headless') # 启用无头模式,不显示浏览器界面 options.add_argument('--disable-gpu') # 某些Linux系统需要 options.add_argument('--no-sandbox') # 某些Docker环境需要 # 替换为你的ChromeDriver路径,如果已添加到PATH则无需指定 # driver_path = '/path/to/chromedriver' # driver = webdriver.Chrome(executable_path=driver_path, options=options) driver = webdriver.Chrome(options=options) # 如果chromedriver在PATH中 try: print("导航到目标网站...") driver.get(target_url) # 等待重定向到Google登录页面 WebDriverWait(driver, 30).until( EC.url_contains("accounts.google.com") ) print("已重定向到Google登录页面。") # 输入Google邮箱 email_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "identifierId")) ) email_input.send_keys(google_email) driver.find_element(By.ID, "identifierNext").click() # 等待密码输入框出现 password_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "Passwd")) ) password_input.send_keys(google_password) driver.find_element(By.ID, "passwordNext").click() print("Google登录信息已提交,等待重定向回目标网站...") # 等待浏览器重定向回原始网站(或其授权后的页面) # 这里需要根据实际情况判断重定向是否完成,例如等待URL不再是Google的登录URL WebDriverWait(driver, 30).until( EC.not_current_url(lambda url: "accounts.google.com" in url) ) print("已成功登录并重定向回目标网站。") # 现在你可以在已登录的会话中执行其他操作,例如抓取数据 print(f"当前页面标题: {driver.title}") print(f"当前页面URL: {driver.current_url}") # 示例:获取页面内容 # content = driver.page_source # print("页面内容截取 (前500字):") # print(content[:500]) except Exception as e: print(f"发生错误: {e}") finally: driver.quit() # 关闭浏览器 # 示例用法 if __name__ == '__main__': # 替换为你的目标URL以及Google账户信息 # 注意:直接在代码中硬编码用户名和密码是不安全的, # 在实际应用中应使用环境变量或其他安全方式获取。 TARGET_URL = "https://your-site-requiring-google-login.com" GOOGLE_EMAIL = "your_google_email@gmail.com" GOOGLE_PASSWORD = "your_google_password" simulate_google_login_and_access_site(TARGET_URL, GOOGLE_EMAIL, GOOGLE_PASSWORD)
注意事项
- 性能与资源消耗:selenium启动一个完整的浏览器实例,相比requests会消耗更多的系统资源,且速度较慢。
- 维护性:网页结构(HTML元素ID、类名等)可能随时变化,导致定位器失效,需要经常维护代码。
- 安全性:直接在代码中硬编码Google账户信息是极不安全的。应使用环境变量、安全配置管理系统或专门的秘密管理服务来存储敏感凭据。
- 反爬策略:网站可能会通过检测自动化工具、IP限制、行为模式分析等方式来阻止Selenium。可能需要结合代理IP、User-Agent轮换、模拟人类行为(如随机等待、鼠标移动)等技术。
- 二次验证:如果Google账户启用了两步验证,Selenium可能无法直接处理,需要更复杂的流程或使用应用密码。
总结与最佳实践
在Python中访问需要Google认证的REST端点,核心在于理解你的目标和目标服务的认证机制。
- 优先选择OAuth2进行API级认证:如果目标服务提供API,并且支持Google OAuth2,这是最健壮、安全且可维护的解决方案。它避免了模拟复杂的用户界面交互,专注于数据和功能的直接访问。
- 谨慎使用Selenium进行网页抓取:当没有API可用,且目标是抓取网页内容时,Selenium是强大的工具。但它带来了性能开销、维护挑战和潜在的反爬问题。应仅在必要时使用,并考虑其局限性。
无论选择哪种策略,都应遵循以下最佳实践:
- 安全管理凭据:绝不将敏感信息(如客户端密钥、用户密码)硬编码在代码中。使用环境变量、配置文件或秘密管理服务。
- 错误处理:实现全面的错误处理机制,包括网络错误、认证失败、API响应异常等。
- 遵循最小权限原则:在OAuth2中,只请求应用程序所需的最小权限范围。
- 遵守服务条款:在进行任何自动化访问前,请务必阅读并遵守目标网站或服务的用户协议和API使用条款。不当的自动化行为可能导致IP被封禁或法律问题。
通过选择正确的策略并实施最佳实践,你可以在Python中高效且安全地访问需要Google认证的REST端点。
以上就是《Python调用GoogleOAuth2认证接口教程》的详细内容,更多关于的资料请关注golang学习网公众号!
Windows10错误0x80073712解决方法
- 上一篇
- Windows10错误0x80073712解决方法
- 下一篇
- Laravel路由设置教程详解
-
- 文章 · python教程 | 25分钟前 | 数据验证 自定义函数 异常处理 条件验证 Pythoncheck函数
- Pythoncheck函数使用方法详解
- 374浏览 收藏
-
- 文章 · python教程 | 9小时前 |
- Python语言入门与基础解析
- 296浏览 收藏
-
- 文章 · python教程 | 9小时前 |
- PyMongo导入CSV:类型转换技巧详解
- 351浏览 收藏
-
- 文章 · python教程 | 9小时前 |
- Python列表优势与实用技巧
- 157浏览 收藏
-
- 文章 · python教程 | 9小时前 |
- Pandas修改首行数据技巧分享
- 485浏览 收藏
-
- 文章 · python教程 | 11小时前 |
- Python列表创建技巧全解析
- 283浏览 收藏
-
- 文章 · python教程 | 11小时前 |
- Python计算文件实际占用空间技巧
- 349浏览 收藏
-
- 文章 · python教程 | 12小时前 |
- OpenCV中OCR技术应用详解
- 204浏览 收藏
-
- 文章 · python教程 | 13小时前 |
- Pandas读取Django表格:协议关键作用
- 401浏览 收藏
-
- 文章 · python教程 | 13小时前 | 身份验证 断点续传 requests库 PythonAPI下载 urllib库
- Python调用API下载文件方法
- 227浏览 收藏
-
- 文章 · python教程 | 13小时前 |
- Windows7安装RtMidi失败解决办法
- 400浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3182次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3393次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3425次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4529次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3802次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览

