当前位置: 首页 > 知识库问答 >
问题:

失败使用谷歌Oauth2服务帐户时的先决条件

张腾
2023-03-14

有三种类型的google apiclient_id:
1. Web应用程序
2.服务帐户
3.已安装的应用程序

我用了3。基于 oauth2 客户端成功安装应用程序,但在 2 上失败。服务帐户。我想使用 oauth2.0 凭据访问我自己的 gmail 收件箱

import imaplib
import json
import urllib2
from oauth2client.client import SignedJwtAssertionCredentials
from httplib2 import Http
from apiclient.discovery import build
import os

reldir = os.path.dirname(os.path.relpath(__file__))
CLIENT_SECRET_FILE = os.path.join(reldir, 'gmail_service.json')
OAUTH_SCOPE = "https://mail.google.com"
GMAIL_ADDRESS = 'my_gmail_address@gmail.com'

def jwt_oauth2():
    '''
    https://developers.google.com/identity/protocols/OAuth2ServiceAccount
    '''
    with open(CLIENT_SECRET_FILE) as f:
        data = json.loads(f.read())
    private_key = data['private_key']
    client_email = data['client_email']
    credentials = SignedJwtAssertionCredentials(
        client_email,   private_key, scope=OAUTH_SCOPE)

    http_auth = credentials.authorize(Http())
    try:
        gmail_service = build('gmail', 'v1', http=http_auth)
        threads = gmail_service.users().messages().list(userId='me').execute()
    except Exception as e:
        return e

我得到了一个与问题相同的例外。我在尝试将sub=GMAIL_ADDRESS添加到凭据时遇到另一个异常:
AccessTokenRefreshError:unauthorized_client:请求中的未授权客户端或作用域。

我正在尝试解决问题,使用< code >凭据而不使用< code>sub:

>>> credentials = SignedJwtAssertionCredentials(
    client_email,   private_key, scope=OAUTH_SCOPE)
>>> http = credentials.authorize(Http())
>>> credentials.access_token
>>> credentials.refresh(http)
>>> credentials.access_token
u'ya29.pAGJjddCXjwsiHFN6hKU1yAkdWN7xMJbks5O76Pmrpe1hW1BbgwfZifjp81aDE55ALMVgjv-yBYiyQ'
>>> gmail_service = build('gmail', 'v1', http=http)
>>> request = gmail_service.users().messages().list(userId='me')
>>> response = request.execute()
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "failedPrecondition",
    "message": "Bad Request"
   }
  ],
  "code": 400,
  "message": "Bad Request"
 }
}

尝试将凭据sub一起使用:

>>> credentials = SignedJwtAssertionCredentials(
    client_email,   private_key, scope=OAUTH_SCOPE, sub=GMAIL_ADDRESS)
>>> http = credentials.authorize(Http())
>>> credentials.access_token
>>> credentials.refresh(http)
AccessTokenRefreshError: unauthorized_client: Unauthorized client or scope in request.

我发现了一个类似的问题 谷歌OAuth2服务帐户 HTTP / REST身份验证,但我对节点.js了解不多。任何帮助将不胜感激。

共有1个答案

于鹏
2023-03-14

您应该使用指定要模拟的帐户的子字段。

比方说,使用您的服务帐户,您想要获得用户user@domain.com的详细信息,子字段应该填充为:

sub: user@domain.com

您还应确保已将服务帐户访问权限授予域中的用户。参考-https://developers.google.com/drive/web/delegation

 类似资料:
  • 我想访问一些谷歌api服务: < li>GDrive API < li >联系API < li >人员API 我正在使用oauth2模拟服务帐户流(您知道的:Google Oauth v2-服务帐户描述)。为了实现不健全化,您需要在Google应用程序控制台中应用“授权域范围权限”,下载相应的pk12文件,并在Google控制台项目中激活api。 目前我总是得到: 这是我的代码: 我还在stack

  • 我正面临着以下问题:我已经创建了一个谷歌服务帐户,现在我正在尝试使用c#对谷歌API和YouTube数据API进行授权API调用。以下是我的示例代码: 代码生成成功,但当我启动程序时,我收到以下错误消息: 系统.IO.File未发现异常:“无法加载文件或程序集”弹跳卡思加密,版本=1.7.4137.9688,区域性=非特定,公钥令牌=a4292a325f69b123“或其依赖项之一。系统找不到指定

  • 我正在使用一个服务帐户访问我们的域名用户的谷歌驱动器,这工作像一个魅力!然而,我现在正在尝试使用相同的服务帐户获得用户的activity在谷歌驱动器。 我已授予服务帐户API访问https://www.googleapis.com/auth/activity和https://www.googleapis.com/auth/drive的权限 并启用API! 然而我总是得到错误403,禁止! 可能需要

  • 我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效

  • 我想使用谷歌驱动器作为一个网站的准CMS工作,我正在使内容所有者可以编辑他们的内容使用谷歌驱动器。我希望使用一个可以访问Google Drive的特定用户帐户(在写这篇文章时,服务帐户不能直接访问Google Drive),并且能够与内容所有者共享文档。 在阅读了API和教程之后,我在委托中找到了答案:https://developers.google.com/drive/development

  • 当使用OAuth2登录我们的应用时,常规的Google(即。gmail)帐户会出现一次同意屏幕,然后不再提示。当我使用我们基于Google Apps的Google帐户登录时,每次我都会看到同一个屏幕提示“您的域管理员已经批准访问X”。此外——同意屏幕上有我的谷歌头像的巨幅(512x512)图像。 关于为什么这些是不同的,有什么见解吗? 我正在请求以下范围 [“配置文件”、“电子邮件”、] ,并且已