gpt4 book ai didi

python - 让 AppEngine AppAssertionCredentials 正常工作 (Python)?

转载 作者:行者123 更新时间:2023-11-30 23:09:27 24 4
gpt4 key购买 nike

我正在将 App Engine python 项目从旧的 Google Admin SDK API 更新到新的,但很难获取 built in services account (AppAssertionCredentials)已通过身份验证。

我已经

  • 在开发者控制台中启用了 Admin SDK API
  • 在 Google Apps 信息中心中启用了 API 访问

为了解决此问题,我从开发者控制台创建了一个服务帐户,下载了credentials.json,并在 Google Apps 信息中心(安全 > 高级设置 > 管理 API 客户端访问)中设置了以下权限(不带引号):帐号:

我当前的代码是(稍微编辑)

# ...

import json
from google.appengine.api import memcache
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client.client import SignedJwtAssertionCredentials

GAPPS_CREDENTIALS = 'credentials.json'
GAPPS_SCOPES = [
'https://www.googleapis.com/auth/admin.directory.user.readonly',
'https://www.googleapis.com/auth/admin.directory.group.readonly',
'https://www.googleapis.com/auth/admin.directory.group.member.readonly'
]
GAPPS_ADMIN = 'admin'
GAPPS_DOMAIN = 'domain.com'
GAPPS_USER = 'user'

# ...

with open(GAPPS_CREDENTIALS) as jsonfile:
jsondata = json.load(jsonfile)
credentials = SignedJwtAssertionCredentials(
jsondata['client_email'],
jsondata['private_key'],
scope=GAPPS_SCOPES,
sub=GAPPS_ADMIN+'@'+GAPPS_DOMAIN
)

http = credentials.authorize(Http(memcache))
apps = build('admin', 'directory_v1', http=http)
user = apps.users().get(userKey=GAPPS_USER +'@'+GAPPS_DOMAIN ).execute()
console.log(user['email'])

# ...

这工作得很好,但是如果可以的话,我想通过使用 AppAssertionCredentials 调用进行身份验证来消除credentials.json 文件。

但是,一旦我运行以下代码:

# ...

import json
from google.appengine.api import memcache
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client.appengine import AppAssertionCredentials

GAPPS_CREDENTIALS = 'credentials.json'
GAPPS_SCOPES = [
'https://www.googleapis.com/auth/admin.directory.user.readonly',
'https://www.googleapis.com/auth/admin.directory.group.readonly',
'https://www.googleapis.com/auth/admin.directory.group.member.readonly'
]
GAPPS_ADMIN = 'admin'
GAPPS_DOMAIN = 'domain.com'
GAPPS_USER = 'user'

# ...

credentials = AppAssertionCredentials(scope=GAPPS_SCOPES,sub=GAPPS_ADMIN+'@'+GAPPS_DOMAIN)
http = credentials.authorize(Http(memcache))
apps = build('admin', 'directory_v1', http=http)
user = apps.users().get(userKey=GAPPS_USER +'@'+GAPPS_DOMAIN ).execute()
console.log(user['email'])

# ...

我收到 403 错误:

<HttpError 403 when requesting https://www.googleapis.com/admin/directory/v1/users/user%domain.com?alt=json returned "Not Authorized to access this resource/api">

我怀疑问题可能是内置服务帐户未在 Google Apps 信息中心中进行身份验证,但我无法在开发者控制台或 App Engine 控制台中找到能够添加这些权限的帐户域。我尝试过:

  • 添加在开发者控制台 > 权限下找到的所有服务帐户,将 @developer.gserviceaccount.com 更改为 .apps.googleusercontent.com(@cloudservices.gserviceaccount.com 帐户会导致错误:此客户端名称尚未尚未在 Google 注册。)
  • 使用 {project}.appspot.com 域:Google Apps 出现错误,此客户端名称尚未向 Google 注册。

有人能透露一下吗?

谢谢

最佳答案

要回答有关在哪里可以找到 App Engine 默认服务帐户的电子邮件地址表单的问题:该表单位于新控制台中的“权限”->“服务帐户”(而不是“API 管理器”->“您创建的服务帐户的凭据”)下你自己)。

现在回答主要问题:AppAssertionCredentials 不适用于具有委派访问权限的服务帐户,因为它 does not accept a 'sub' parameter对于构造函数和 doesn't have a method for creating delegated credentials (它不像 SignedJwtAssertionCredentials 那样用作关键字参数,现在是 ServiceAccountCredentials ,并且被忽略)。不过,您应该仍然能够通过委派使用 App Engine 默认服务帐户,因为新控制台现在允许您 create JSON keys for the default service accounts .

有可能通过 AppAssertionCredentials 支持委派访问,为此,您可以在 project issue tracker 上发布功能请求。 .

关于python - 让 AppEngine AppAssertionCredentials 正常工作 (Python)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203188/

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