OAuth 2.0 授权完整实战指南)
后端【免费下载链接】google-api-python-client The official Python client library for Googles discovery based APIs.项目地址https://gitcode.com/gh_mirrors/go/google-api-python-client点击查看免费下载本篇指南聚焦 Google APIs Client Library for Pythongoogle-api-python-client中**安装型应用Installed Applications**的 OAuth 2.0 授权流程从在 API Console 创建凭据、理解三种回调 URI 的差异到使用InstalledAppFlow驱动授权、获取凭据并调用 Google API 的完整链路。读完本文你将能基于client_secrets.json快速搭建一套可运行的本地授权程序如桌面工具、CLI 脚本并能理解build()、run_console()、run_local_server()等核心 API 的底层行为。适用场景哪些应用该用安装型应用授权安装型应用指分发到单个设备计算机、手机、平板上的应用程序其共同假设是应用无法保守密钥cannot keep secrets因为客户端 ID 与密钥会被嵌入应用源码并随应用分发。这类应用可能在用户在场时访问 Google API也可能在后台运行。本流程适用于满足以下条件的应用运行平台不是 Android 或 iOS设备具备系统浏览器和丰富的输入能力例如带有完整键盘的设备。如果目标是 Android / iOS官方推荐直接使用 Google Sign-In 来统一处理认证与授权如果目标设备没有系统浏览器或输入能力有限如游戏主机、摄像机、打印机则应改用 OAuth 2.0 for Devices 设备流程。流程总览与 Web 服务器应用的三点关键差异安装型应用的 OAuth 2.0 流程与 Web 服务器应用基本相同在 API Console 为项目创建应用凭据application credentials应用需要访问用户数据时将用户引导至 Google 的 OAuth 2.0 服务器OAuth 2.0 服务器完成用户认证并取得用户对所需 scope 的同意consent服务器将**一次性授权码single-use authorization code**通过浏览器标题栏或发往本地主机的 HTTP 请求查询串返回给应用应用用授权码换取访问令牌access token随后即可调用 Google API。但与 Web 服务器应用流程相比存在三点本质差异差异点说明redirect_uri 不同创建客户端 ID 时选择 Installed application 类型系统生成的redirect_uri取值与 Web 应用不同见下文三种取值。凭据内嵌源码从 API Console 获得的 client ID 与 client secret 直接嵌入应用源码此时 client secret显然不被当作机密对待。授权码返回方式不同授权码可以通过浏览器标题栏返回也可以通过发往本地主机 HTTP 请求的查询串返回。从源码结构看这条安装型流程正是 docs/oauth.md 中InstalledAppFlow一节所述场景的展开——它服务于本地开发与桌面安装应用是google_auth_oauthlib提供的三种 Flow 形态之一。第一步创建应用凭据所有使用 OAuth 2.0 的应用都必须具备用于向授权服务器标识自身身份的凭据。拥有凭据的应用才能访问项目中已启用的 API。创建步骤如下在 API Console 打开Credentials凭据页面若尚未创建 OAuth 2.0 凭据在OAuth标题下点击Create new Client ID选择Installed application类型然后在对应表格中查看应用生成的 client ID 与 client secret下载client_secrets.json文件并将其安全存放在只有应用本身能访问的位置。重要安全提示切勿将client_secrets.json存放在可公开访问的位置。如果要在 GitHub 等平台共享应用源码请把client_secrets.json放在源码树之外避免无意间泄露客户端凭据。client_secrets.json文件格式详解client_secrets.json是google-api-python-client生态统一使用的凭据文件格式详见 docs/client-secrets.md用于存放client_id、client_secret及其余 OAuth 2.0 参数。安装型应用的典型文件如下{ installed: { client_id: 837647042410-75ifg...usercontent.com, client_secret: asdlkfjaskd, redirect_uris: [http://localhost, urn:ietf:wg:oauth:2.0:oob], auth_uri: https://accounts.google.com/o/oauth2/auth, token_uri: https://accounts.google.com/o/oauth2/token } }该格式按客户端 ID 类型区分两种顶层键webWeb 应用installed安装型应用本文主题。web/installed子对象包含以下必填成员字段类型含义client_idstring客户端 IDclient_secretstring客户端密钥redirect_urislist[string]合法重定向端点 URI 列表须与 API Console 中该客户端 ID 录入的列表一致auth_uristring授权服务器端点 URItoken_uristring令牌服务器端点 URI可选参数包括client_email与该客户端关联的服务账号邮箱、auth_provider_x509_cert_url用于校验认证方 JWT 签名的公钥 x509 证书 URL、client_x509_cert_url用于校验客户端签发 JWT 的公钥证书 URL。该统一文件格式的意义在于服务商提供可下载的client_secrets.json客户端库直接消费该文件从而免去手工从注册页复制粘贴 client id/secret、手动配置所有端点与 Redirect Endpoint 的繁琐与出错风险。第二步配置客户端对象使用上一步创建的凭据在应用中配置一个客户端对象Flow指定应用所需的scopes以及负责接收 OAuth 2.0 服务器响应的redirect URI。三种 redirect URI 的选择与取舍创建安装型客户端 ID 时API Console 会生成两个redirect_uri参数urn:ietf:wg:oauth:2.0:oob与http://localhost。应用选用哪个值决定了授权码如何返回。http://localhost推荐平台允许时该值告知 Google 授权服务器将授权码作为查询串参数返回给客户端上的本地 Web 服务器。你可以自行指定端口号而无需修改 API Console 配置。要接收授权码应用必须在本地 Web 服务器上监听——许多平台支持但并非所有平台都支持若平台支持这是获取授权码的推荐机制。注意某些情况下虽然监听可行但其他软件如 Windows 防火墙会在不做大量客户端配置的前提下阻止消息送达。urn:ietf:wg:oauth:2.0:oob无监听能力时该值告知 Google 授权服务器将授权码返回在浏览器标题栏中页面文本提示用户复制授权码并粘贴回应用。适用于无法在不做大量配置的情况下监听 HTTP 端口的客户端如 Windows 应用。使用该值时应用可以检测页面加载完成并读取 HTML 页面标题来获取授权码如希望用户永远看不到含授权码的页面则由应用负责关闭浏览器窗口关闭机制因平台而异。若平台既不允许检测页面加载、也不允许读取页面标题可让用户按授权服务器生成确认页上的提示把授权码手动粘贴回应用。urn:ietf:wg:oauth:2.0:oob:auto无自关闭能力时与urn:ietf:wg:oauth:2.0:oob完全一致唯一区别是授权服务器生成的确认页不会提示用户复制授权码而只是要求用户关闭窗口。适用于应用通过读取 HTML 页面标题例如检查桌面窗口标题获取授权码、但无法自行关闭页面的场景。创建客户端对象从client_secrets.json创建客户端对象使用InstalledAppFlow.from_client_secrets_file()。例如请求用户 Google Drive 的只读访问from google_auth_oauthlib.flow import InstalledAppFlow flow InstalledAppFlow.from_client_secrets_file( client_secret.json, scopes[https://www.googleapis.com/auth/drive.metadata.readonly])应用随后用该客户端对象执行各类 OAuth 2.0 操作例如生成授权请求 URI、把访问令牌应用到 HTTP 请求上。手动驱动 Flow 的底层方法除了一键式run_console/run_local_serverFlow对象也支持拆解成手动步骤参见 docs/oauth.md 的 Flow 一节该节同时指出Flow对象是临时的产出凭据后即可丢弃但也可被 pickle 持久化生成授权 URI——调用authorization_url()后把用户重定向到该 URI。若用户此前已授权授权服务器会立即重定向回redirect_uri若未授权则会要求用户授权。授权成功时重定向携带code查询参数形如http://example.com/auth_return/?codekACAH-1Ng1MImB...AA7acjdY9pTD9M用户拒绝时携带error参数形如http://example.com/auth_return/?erroraccess_deniedauth_uri flow.authorization_url() # 在你的平台上将用户重定向到 auth_uri用授权码换取令牌——调用fetch_token()后凭据将存于flow.credentialscode input(Enter the authorization code: ) flow.fetch_token(codecode)第三步把用户引导至 Google 的 OAuth 2.0 服务器InstalledAppFlow提供两个一键式函数来驱动授权run_console()指示用户在自己的浏览器中打开授权 URL。用户完成授权后授权服务器展示一个含授权码的网页用户将其粘贴回应用授权库自动完成授权码换访问令牌。credentials flow.run_console()run_local_server()尝试在用户浏览器中自动打开授权 URL同时启动本地 Web 服务器监听授权响应。用户完成授权流后授权服务器把浏览器重定向到本地服务器本地服务器从浏览器取得授权码后自行关闭然后换取访问令牌。credentials flow.run_local_server(hostlocalhost, port8080, authorization_prompt_messagePlease visit this URL: {url}, success_messageThe auth flow is complete; you may close this window., open_browserTrue)两种方式下Google 的 OAuth 2.0 服务器都会完成用户认证并就应用请求的 scopes 取得用户同意。第四步使用凭据调用 Google API拿到credentials后用build()构建服务对象即可发起调用。build()是googleapiclient.discovery模块的核心入口见 googleapiclient/discovery.py 的函数签名其参数包括服务名serviceName、版本version以及可选的http、credentials、client_options、cache_discovery、num_retries、static_discovery等。当传入credentials时库内部通过 googleapiclient/_auth.py 的authorized_http()构造一个带授权的 HTTP 客户端google-auth凭据对应google_auth_httplib2.AuthorizedHttpoauth2client凭据则调用credentials.authorize()再基于 Discovery 文档构造资源对象。调用步骤用build函数以 API 名称、版本及授权凭据构建服务对象。例如调用 Drive API v3from googleapiclient.discovery import build drive_service build(drive, v3, credentialscredentials)使用服务对象提供的接口发起请求详见 docs/start.md 的 Building and calling a service 一节集合方法返回HttpRequest对象需调用execute()真正执行。例如列出已认证用户的 Drive 文件files drive_service.files().list().execute()build()默认开启发现文档缓存cache_discoveryTrue且static_discoveryTrue时优先使用随库分发的服务定义若更看重获取最新服务定义而非稳定性可设static_discoveryFalse从网络拉取。另外httplib2默认保持长连接建议用with build(...) as service:上下文管理器或调用service.close()避免遗留未关闭的 socket。关于凭据对象本身Flow产出的credentials是 google.oauth2.credentials.Credentials但安装型桌面场景通常显式传入Flow产出的用户凭据。完整可运行示例读取用户最近修改的 5 个 Drive 文件以下示例请求访问用户 Google Drive 文件用户授权后代码检索并打印用户最近修改的 5 个 Drive 文件的 JSON 列表。import os import pprint import google.oauth2.credentials from googleapiclient.discovery import build from googleapiclient.errors import HttpError from google_auth_oauthlib.flow import InstalledAppFlow pp pprint.PrettyPrinter(indent2) # CLIENT_SECRETS_FILE 指定包含本应用 OAuth 2.0 信息的文件 # 其中包含 client_id 与 client_secret。 CLIENT_SECRETS_FILE client_secret.json # 该访问 scope 授予对已认证用户 Drive 账户的只读访问权限。 SCOPES [https://www.googleapis.com/auth/drive.metadata.readonly] API_SERVICE_NAME drive API_VERSION v3 def get_authenticated_service(): flow InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES) credentials flow.run_console() return build(API_SERVICE_NAME, API_VERSION, credentials credentials) def list_drive_files(service, **kwargs): results service.files().list( **kwargs ).execute() pp.pprint(results) if __name__ __main__: # 本地运行时禁用 OAuthlib 的 HTTPS 校验。在生产环境运行 # *切勿* 保留此选项开启。 os.environ[OAUTHLIB_INSECURE_TRANSPORT] 1 service get_authenticated_service() list_drive_files(service, orderBymodifiedByMeTime desc, pageSize5)几个值得注意的实战细节OAUTHLIB_INSECURE_TRANSPORT环境变量仅在本地开发时设置为1用于绕过本机回环地址的 HTTPS 校验生产环境必须移除否则会带来安全风险。run_console()与run_local_server()的取舍CLI / 无 GUI 环境适合run_console()用户手动复制授权码桌面 GUI 环境优先run_local_server()自动开浏览器 本地监听。scope 最小化原则示例只申请drive.metadata.readonly只读元数据不要一次申请远超需求的高权限 scope。依赖与安装本流程依赖两个google-auth家族库配合google-api-python-client使用官方推荐oauth2client已弃用详见 docs/oauth.md 的 oauth2client deprecation 一节google-auth提供Credentials等核心认证对象google-auth-oauthlib提供InstalledAppFlow、Flow等授权流实现。google-auth-oauthlib目前尚未内置凭据存储能力如需跨进程持久化令牌可自行序列化Credentials或等待库后续补充。若项目中使用旧式oauth2client惯用法如flow_from_clientsecrets、tools.run_flowgoogleapiclient.sample_tools模块仍保留基于oauth2client的init()便捷封装见 googleapiclient/sample_tools.py它统一完成client_secrets.json定位、Flow构建、Storage读写name.dat、凭据授权与build()服务构造但新项目建议直接采用本文的google_auth_oauthlib路线。小结安装型应用的 OAuth 2.0 授权可以归纳为一条清晰的链路创建 Installed 类型凭据 → 下载client_secrets.json→ 用InstalledAppFlow.from_client_secrets_file()构建 Flow → 用run_console()/run_local_server()完成用户授权拿到Credentials→ 用build(api, version, credentials...)构建服务对象并execute()调用。其中 redirect URI 的选择http://localhost、oob、oob:auto决定了授权码的回收方式直接影响不同平台上的用户体验与可行性而client_secrets.json的存放安全、scope 的最小化申请、本地开发与生产环境的OAUTHLIB_INSECURE_TRANSPORT区别处理则是保证该流程既好用又安全的关键实践。赞分享后端【免费下载链接】google-api-python-client The official Python client library for Googles discovery based APIs.项目地址https://gitcode.com/gh_mirrors/go/google-api-python-client点击查看免费下载相关推荐终极指南如何使用Google API Ruby客户端库实现OAuth 2.0安装应用授权终极指南如何使用Google API Ruby客户端库实现OAuth 2.0安装应用授权 Google API Ruby客户端库为本地安装应用提供了完整的OA开发工具Google API Ruby客户端库中的OAuth 2.0网页应用授权指南Google API Ruby客户端库中的OAuth 2.0网页应用授权指南 引言 在现代Web开发中安全地访问用户数据是至关重要的。Google API R开发工具Google API PHP 客户端 OAuth 2.0 Web 服务器授权完整指南Google API PHP 客户端 OAuth 2.0 Web 服务器授权完整指南 本文基于本仓库 docs/oauth web.md https://lin后端上一篇Data-Science-For-Beginners 实战作业用 NYC 出租车数据集评估冬夏小费差异问题是否可答下一篇Synology_HDD_db完全指南解锁群晖NAS硬盘兼容性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考