在不打开浏览器Python的情况下打开授权URL

Posted

技术标签:

【中文标题】在不打开浏览器Python的情况下打开授权URL【英文标题】:Open the authorization URL without opening browser Python 【发布时间】:2019-06-11 07:27:36 【问题描述】:

我在 Python 中使用 google_auth_oauthlib.flow 来授权 Google Oauth 2 帐户。 我的代码如下所示:

from google_auth_oauthlib.flow import InstalledAppFlow

flow = InstalledAppFlow.from_client_secrets_file(
    "client_secret_929791903032.apps.googleusercontent.com.json",
    scopes=['profile', 'email'])

flow.run_local_server(open_browser=False)

session = flow.authorized_session()

profile_info = session.get(
    'https://www.googleapis.com/userinfo/v2/me').json()

print(profile_info)

基于run_local_server() 文档,我尝试设置open_browser=False,但随后Google 为我提供了一个URL 进行授权,它看起来像这样https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=929739191032-hpdm8djidqd8o5nqg2gk366efau34ea6q.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=profile+email&state=oHJmupijpVH2gJEPqTogVVHIEtbVXcr&access_type=offline

点击提供的链接后,我的浏览器会自动打开并显示名为 Sign in with Google 的 UI,然后我必须在浏览器上手动登录。

所以我的问题是如何在不打开浏览器的情况下打开授权 URL?我希望我的代码自动授权而无需手动操作。

【问题讨论】:

您需要提供更多信息。从 URL 看来,您正在询问用户的个人资料 + 电子邮件。您希望用户如何允许您在不登录 Google 的情况下查看他们的 Google 电子邮件? @pinoyyid 是的。这就是我想要的。不记录或自动记录 【参考方案1】:

所以我的问题是如何在不打开的情况下打开授权 URL 浏览器?我希望我的代码自动授权而不做 手动。

如果您使用的是 G Suite,您可以创建一个服务帐号并启用域范围委派来承担 G Suite 用户的身份。这仅适用于属于您的 G Suite 域的用户。

如果您不使用 G Suite,则在用户首次访问您的网站时,您无法绕过用户身份验证屏幕。一旦用户使用offline 访问权限进行身份验证,您就可以保存刷新令牌以供将来使用。

身份验证和授权在客户端(用户)和 Google 帐户之间进行。您的软件不涉及凭据部分(用户名、密码等)。用户必须向 Google 帐户授予权限,以允许您的服务访问用户的 Google 身份。

[编辑 2019 年 1 月 22 日-关于如何保存刷新令牌的问题]

以下代码授权并保存刷新令牌:

# pip install google-auth-oauthlib
from google_auth_oauthlib.flow import InstalledAppFlow

# https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html

flow = InstalledAppFlow.from_client_secrets_file(
    'client_secrets.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

cred = flow.run_local_server(
    host='localhost',
    port=8088,
    authorization_prompt_message='Please visit this URL: url',
    success_message='The auth flow is complete; you may close this window.',
    open_browser=True)

with open('refresh.token', 'w+') as f:
    f.write(cred._refresh_token)

print('Refresh Token:', cred._refresh_token)
print('Saved Refresh Token to file: refresh.token')

【讨论】:

您能告诉我如何保存您已经提到的刷新令牌吗? @AnalyticsPOPSWW - 我用代码更新了我的答案,向您展示如何保存刷新令牌。将此代码复制到一个新文件中。从 Google 修改“client_secrets.json”路径到您的客户端密码,并修改您需要的权限范围。 哦,谢谢。附加问题,获得令牌文件后如何使用它?在我的旧代码credentials = flow.run_local_server()return build(API_SERVICE_NAME, API_VERSION, credentials=credentials)。现在,在我拥有.token 文件之后。我删除了credentials = flow.run_local_server()return build(API_SERVICE_NAME, API_VERSION,credentials=read_token_in_the_file 行,对吗? 请将您的问题限制为每个 SO 问题一个主题。这个问题正在扩大。关闭此问题并打开另一个问题,以便每个人都受益。当您有新问题时,请在此处联系我。 我赞成你的回答。请回答上面的问题。或者告诉我如何在 SO 上 ping 你

以上是关于在不打开浏览器Python的情况下打开授权URL的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改当前 URL 的情况下打开新窗口?

如何在不使用 tkinter 打开控制台窗口的情况下运行 Python 脚本?

是否可以在不打开浏览器的情况下从 CLI 在 GitHub 上创建远程存储库?

无需在 Android Studio 中打开浏览器即可点击 URL

在不更改 URL 的情况下重定向到另一个网站

C# 在Winform中打开PDF