如何在不保持在浏览器中登录 Google 的情况下向 Google 授权

问题描述

我正在用 Python 制作一个桌面应用程序,它可以从 Gmail 发送邮件。问题在于,在通过浏览器收到同意(OAuth 2)后,软件收到同意的用户继续在 Gmail 中登录浏览器。有没有办法无需在浏览器中登录 Gmail 即可完成授权流程?

解决方法

您所指的是 Oauth2。 Oauth2 使用户能够授予像您这样的应用程序访问其私人数据的权限。私有数据是某人拥有的数据。我的 Gmail 数据是我的,除非我授予您访问权限,否则您的应用程序无法使用它。

有没有办法不用在浏览器中登录 Gmail 就完成授权过程?

让我们澄清一下您提到的授权中的一些混淆,即用户授权您的应用程序访问他们的数据是正确的。但是您还提到登录与授权无关。登录用户是身份验证,而不是 Oauth2 的一部分。它是另一个叫做 openid connect 的东西的一部分。

至于如何在不使用浏览器的情况下请求用户授权。一旦用户同意您的应用程序访问我的数据一次,那么您的应用程序就应该拥有所谓的刷新令牌,此刷新令牌可以在以后用于您的应用程序请求新的访问令牌。授予您访问可能数据的权限,而无需再次使用浏览器访问我的数据。因此,您可以将此刷新令牌存储在后端的某个位置,并使用它来继续访问用户数据,而无需再次使用浏览器。

在已安装的应用程序中存储用户凭据

由于您没有在问题中包含任何代码,因此很难确切知道您在做什么,而且您的问题有点不清楚。

在下面的示例中,请注意用户凭据如何存储在 gmail.dat 中,在已安装的应用程序中使用此代码将导致它在用户下次运行应用程序时加载刷新令牌,这意味着同意屏幕不应该显示,因为凭据已为该用户存储。

def initialize_gmail():
  """Initializes the gmail service object.

  Returns:
    analytics an authorized gmail service object.
  """
  # Parse command-line arguments.
  parser = argparse.ArgumentParser(
      formatter_class=argparse.RawDescriptionHelpFormatter,parents=[tools.argparser])
  flags = parser.parse_args([])

  # Set up a Flow object to be used if we need to authenticate.
  flow = client.flow_from_clientsecrets(
      CLIENT_SECRETS_PATH,scope=SCOPES,message=tools.message_if_missing(CLIENT_SECRETS_PATH))

  # Prepare credentials,and authorize HTTP object with them.
  # If the credentials don't exist or are invalid run through the native client
  # flow. The Storage object will ensure that if successful the good
  # credentials will get written back to a file.
  storage = file.Storage('gmail.dat')
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = tools.run_flow(flow,storage,flags)
  http = credentials.authorize(http=httplib2.Http())

  # Build the service object.
  service = build('gmail ','v1',http=http)

  return service