Python访问需要Google登录认证的REST API教程

11次阅读

Python访问需要Google登录认证的REST API教程

本教程旨在解决python程序访问需要google登录认证的rest api时遇到的“未授权”问题。我们将探讨两种主要方法:一是通过模拟浏览器行为进行网页抓取,适用于获取网页数据;二是通过oauth2协议进行api认证,适用于访问特定的api端点。文章将详细介绍每种方法的原理、适用场景及实现要点,并提供相应的指导,帮助开发者选择并实现合适的认证方案。

当尝试使用python的requests库直接访问一个需要google登录认证的REST API时,通常会遇到“未授权”的响应。这是因为浏览器在访问此类资源时,会首先重定向到Google的认证页面(如https://accounts.google.com/v3/signin/identifier/…),用户完成认证后,浏览器才会带着认证凭据被重定向回目标网站。Python的requests库默认不会自动处理这种复杂的第三方认证流程。根据您的具体需求(是获取网页数据还是访问API),有不同的解决方案。

一、通过模拟浏览器行为进行网页抓取(适用于获取网页数据)

如果您希望从一个需要Google登录的网站上抓取数据,而不是直接调用其API,那么模拟浏览器行为可能是一个选择。这种方法通常涉及以下步骤:

  1. 使用requests.session维护会话状态:requests.Session对象能够跨请求保持cookie,这对于模拟登录后的会话至关重要。

    import requests  session = requests.Session()
  2. 处理Google登录重定向: 当您访问目标URL时,requests会自动跟随HTTP重定向。第一次请求会重定向到Google的登录页面。您需要解析这个登录页面的html,找到表单元素(如用户名、密码输入框),然后构造一个POST请求,提交您的Google账户凭据。

  3. 解析HTML并提交凭据: 使用像beautifulsoup这样的库来解析HTML内容,提取表单字段的名称和值,然后模拟提交登录表单。这个过程可能很复杂,因为Google的登录流程可能包含多个步骤(输入邮箱、输入密码、二次验证等),并且其页面结构可能会变化。

    from bs4 import BeautifulSoup  # 示例:获取Google登录页面(这只是一个概念性示例,实际Google登录流程更复杂) login_page_response = session.get("https://accounts.google.com/v3/signin/identifier/...") soup = BeautifulSoup(login_page_response.text, 'html.parser')  # 假设找到用户名输入框并提交 # identifier_input = soup.find('input', {'name': 'identifier'}) # if identifier_input: #     payload = {'identifier': 'your_google_email@gmail.com', 'continue': '...', 'flowName': '...'} #     post_response = session.post(login_action_url, data=payload) #     # 接着处理密码输入,可能还有二次验证等
  4. 访问目标网站: 一旦成功通过Google认证并被重定向回目标网站,您的session对象将持有有效的认证cookie。此时,您可以使用这个session对象来访问目标网站的受保护页面。

    # 假设登录成功后,session中包含有效cookie target_response = session.get(your_target_url) print(target_response.text)

注意事项:

立即学习Python免费学习笔记(深入)”;

  • 这种方法高度依赖于目标网站和Google登录页面的HTML结构。任何ui或流程的微小变化都可能导致您的脚本失效。
  • 模拟完整的Google登录流程(特别是涉及到javaScript动态加载、验证码、二次验证等)非常复杂,通常不推荐用于自动化API访问。
  • 如果目标网站提供了官方API,通常应该优先考虑使用API认证方式。

二、通过OAuth2协议进行API认证(推荐用于访问API)

如果您需要访问的是网站的特定API端点,并且该网站支持Google OAuth2认证,那么OAuth2是更安全、更稳定且推荐的方法。OAuth2是一种授权框架,允许第三方应用程序代表用户访问受保护的资源,而无需获取用户的密码。

Google本身提供了强大的OAuth2服务,许多网站也利用Google OAuth2作为其用户认证和授权机制。其核心思想是,您的Python程序将通过Google获得一个临时的“访问令牌”(access Token),然后使用这个令牌去请求目标网站的API。

Python访问需要Google登录认证的REST API教程

Imagen – Google Research

Google Brain team推出的图像生成模型。

Python访问需要Google登录认证的REST API教程16

查看详情 Python访问需要Google登录认证的REST API教程

OAuth2的基本流程如下:

  1. 注册应用程序并获取凭据: 在Google Cloud console中创建一个项目,并配置OAuth同意屏幕。然后,创建一个“OAuth客户端ID”(通常选择“桌面应用”或“Web应用”),您将获得Client ID和Client Secret。这些是您的应用程序在Google OAuth系统中的唯一标识。

  2. 定义授权范围(Scopes): 确定您的应用程序需要访问哪些用户数据或服务。例如,如果您需要访问用户的基本资料,可能需要profile和email范围。目标网站可能也会要求特定的范围。

  3. 获取授权码(Authorization Code): 用户需要通过浏览器访问Google的授权URL,同意您的应用程序访问其Google账户。一旦用户授权,Google会将一个Authorization Code重定向回您的应用程序(通常是您在Google Cloud Console中配置的回调URL)。

    • 对于Web应用: 用户在浏览器中完成授权后,Google会将授权码发送到您的Web服务器。
    • 对于桌面或命令行应用: 您可能需要启动一个本地Web服务器来捕获回调,或者让用户手动复制授权码。
  4. 交换授权码为访问令牌和刷新令牌: 您的Python程序使用Client ID、Client Secret和获得的Authorization Code向Google的令牌端点发送POST请求,以换取Access Token(访问令牌)和可选的Refresh Token(刷新令牌)。

    • Access Token是短期有效的,用于访问受保护资源。
    • Refresh Token是长期有效的,当Access Token过期时,可以使用它来获取新的Access Token,而无需用户再次授权。
  5. 使用访问令牌调用API: 将Access Token放在HTTP请求的Authorization头部(通常是Bearer类型)中,发送给目标网站的API端点。

    import requests  # 假设您已经获取到有效的access_token access_token = "YOUR_OBTAINED_ACCESS_TOKEN" api_url = "https://your-target-website.com/api/some-endpoint"  headers = {     "Authorization": f"Bearer {access_token}",     "Content-Type": "application/json" }  payload = {"key": "value"} # 根据API要求构造请求体  response = requests.post(api_url, headers=headers, json=payload)  if response.status_code == 200:     print("API调用成功:", response.json()) else:     print("API调用失败:", response.status_code, response.text)

Python中的OAuth2库: 为了简化OAuth2流程,可以使用专门的Python库,例如google-auth(用于Google自己的API)或requests-oauthlib(更通用的OAuth2客户端库)。

示例(使用google-auth库的简化概念): 虽然直接访问第三方网站的API可能需要该网站明确支持Google OAuth2,但以下代码展示了如何使用google-auth进行Google API的认证,原理是相通的。

# 这只是一个概念性示例,用于Google自身的API # 对于第三方网站,您需要遵循该网站的OAuth2集成指南  from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow import google.auth.transport.requests as req  # 1. 定义授权范围 (Scopes) SCOPES = ['https://www.googleapis.com/auth/userinfo.profile']  # 2. 设置您的客户端凭据文件路径 (从Google Cloud Console下载的json文件) CLIENT_SECRET_FILE = 'client_secret.json'  creds = None # 尝试从文件中加载现有凭据 # 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(req.Request()) # 使用刷新令牌获取新访问令牌     else:         # 启动OAuth2流程,通常会打开一个浏览器窗口让用户授权         flow = InstalledAppFlow.from_client_secrets_file(             CLIENT_SECRET_FILE, SCOPES)         creds = flow.run_local_server(port=0)     # 保存凭据以供将来使用     # with open('token.json', 'w') as token:     #     token.write(creds.to_json())  # 此时,creds对象包含了有效的access_token # 您可以使用creds.token来获取access_token,并将其用于第三方API请求 # 例如: # access_token_for_api = creds.token # headers = {"Authorization": f"Bearer {access_token_for_api}"} # response = requests.get(api_url, headers=headers)

重要提示:

  • 安全性: Client Secret非常重要,切勿将其硬编码在代码中或公开。对于生产环境,应将其存储在安全的环境变量或配置服务中。
  • 刷新令牌: 妥善存储和管理刷新令牌,它们是实现长期、无用户交互认证的关键。
  • 目标网站支持: 这种方法的前提是您要访问的REST API明确支持Google OAuth2作为其认证机制。如果目标网站只接受其自己的用户名/密码登录,并且没有提供OAuth2选项,那么您可能需要考虑模拟登录(如第一种方法),或者联系网站管理员了解其API认证方式。

总结

在Python中访问需要Google登录认证的REST API,关键在于理解目标网站的认证机制。

  • 如果您的目标是抓取需要登录的网页内容,并且目标网站没有提供API,那么模拟浏览器行为(使用requests.Session和BeautifulSoup)可能是唯一的选择,但这种方法复杂且脆弱。
  • 如果您的目标是访问特定的API端点,并且该API支持Google OAuth2认证,那么使用OAuth2协议是更专业、更安全、更稳定的方法。这需要您在Google Cloud Console中注册应用程序,并通过OAuth2流程获取并管理访问令牌。

始终建议优先采用官方或标准化的API认证方法,如OAuth2,以确保稳定性和安全性。

text=ZqhQzanResources