gpt4 book ai didi

python-3.x - 使用 Python 在桌面应用程序中安全分发 OAuth 2.0 client_secret

转载 作者:行者123 更新时间:2023-12-03 15:47:37 25 4
gpt4 key购买 nike

我正在寻找一些关于如何在 Python 中设计和创建我自己的桌面应用程序(或 installed app)的最佳实践示例代码,需要向 Google 提供 OAuth 2.0 授权流程,并发现此存储库由 Google 提供:https://github.com/googlesamples/oauth-apps-for-windows (用 C# 编码,但无论如何设计应该是相同的)。
在深入研究代码时,我惊讶地发现 client_secret直接清晰地嵌入到源代码中(看这里:https://github.com/googlesamples/oauth-apps-for-windows/blob/e79f1575b5858c5f617d29f2435a93996e4248c5/OAuthConsoleApp/OAuthConsoleApp/Program.cs#L47)。
我在 Google Developers documentation about "Installed applications" 上找到了这个:

When you create a client ID through the Google API Console, specify that this is an Installed application, then select Android, Chrome, iOS, or "Other" as the application type. The process results in a client ID and, in some cases, a client secret, which you embed in the source code of your application. (In this context, the client secret is obviously not treated as a secret.)


另外,我不知道为什么 Android 或 iOS 应用程序不包含此 client_secret在从控制台生成的 OAuth 客户端 ID 中,其他 native 应用程序(桌面)应该。
而且我还在许多网站上发现客户的 secret 应该保密……正如其名称所暗示的那样。
我已经阅读了 native 应用程序的不同 RFC(我相信最可靠的来源)并发现这很有用:
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-native-apps-12#appendix-A :
  1. Not assume native app clients can keep a secret. If secrets are distributed to multiple installs of the same native app, they should not be treated as confidential. See Section 8.5.

但我想确保我理解正确。
那么,在从 Google API 控制台为“其他”应用程序类型生成 OAuth 客户端 ID 后,是否可以将客户端密码直接嵌入到我的应用程序中?这样做真的没有安全问题吗?这篇 SO 帖子: What the attacker could do if he obtains application's client_secret?谈论安全问题,所以我有点迷茫。
使用 google-auth-oauthlib为了避免从头开始实现 OAuth 协议(protocol),我可以安全地分发以下代码吗( **** 值显然不会被混淆):
from google_auth_oauthlib import flow

# generated from Google API Console ("other" application)
client_config = {
"installed": {
"client_id": "****.apps.googleusercontent.com",
"client_secret": "****", # is it safe?
"project_id": "****",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"redirect_uris": [
"urn:ietf:wg:oauth:2.0:oob"
]
}
}

scopes = ['https://www.googleapis.com/auth/books'] # example
appflow = flow.InstalledAppFlow.from_client_config(client_config, scopes=scopes)
appflow.run_console()
credentials = appflow.credentials

# some code requesting Google APIs for the required scopes
如果恶意用户发现 client_secret ,他能用这个做什么?

最佳答案

当公共(public)客户端(例如, native 和单页应用程序)请求访问 token 时,会引发一些额外的安全问题,而这些问题仅靠授权代码流程无法缓解。这是因为:

原生应用
无法安全地存储客户端密码。反编译应用程序将显示客户端 key ,该 key 绑定(bind)到应用程序并且对所有用户和设备都是相同的。
可能会使用自定义 URL 方案来捕获重定向(例如,MyApp://),这可能允许恶意应用程序从您的授权服务器接收授权代码。

单页应用
无法安全地存储客户端 key ,因为它们的整个源对浏览器都是可用的。

为了缓解这种情况,OAuth 2.0 提供了一个授权代码流版本,它使用代码交换证明 key (PKCE)(在 OAuth 2.0 RFC 7636 中定义)。

PKCE-enhanced Authorization Code Flow 引入了一个由调用应用程序创建的可以被授权服务器验证的 secret ;这个 secret 被称为代码验证器。此外,调用应用程序创建称为代码质询的代码验证器的转换值,并通过 HTTPS 发送此值以检索授权代码。这样,恶意攻击者只能截获授权码,而没有验证码他们无法将其换成 token 。

进一步阅读:https://auth0.com/docs/flows/concepts/auth-code-pkce

关于python-3.x - 使用 Python 在桌面应用程序中安全分发 OAuth 2.0 client_secret,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com