访问许可证API时出现“未授权访问应用程序ID”

4 投票
1 回答
802 浏览
提问于 2025-04-18 17:18

这是当前的代码:

SCOPES = [
  'https://www.googleapis.com/auth/appsmarketplace.license'
]

def getAppService():
  CREDENTIALS_ = appengine.AppAssertionCredentials(scope=SCOPES)
  http = httplib2.Http(memcache)
  http = CREDENTIALS_.authorize(http)
  service = discovery.build(serviceName = 'appsmarket', version='v2', http=http)
  return service

def getLicenseNotifications():
  service = getAppService()
  ret = service.licenseNotification().list(applicationId='THE_PROJECT_ID_NUMBER', timestamp=0, max_results=10).execute()
  logging.debug(ret)
  return ret

但是它返回了403错误,提示“没有权限访问应用程序ID”。这段代码是从GAE项目中调用的,使用的是默认的内置服务账号,和市场应用的manifest.json文件中的api_console_project_id字段在同一个项目下,项目ID完全相同。

我搜索了这个错误信息,但找不到相关的内容。

在开发者控制台中,“Google Apps Marketplace API”确实是开启的。

如果我把'v2'换成'v2sandbox',似乎就会超时,然后报告后端错误。

有没有人能帮忙?

1 个回答

0

我找到了问题所在,GAE(谷歌应用引擎)的默认服务账号似乎不支持市场 API。如果我创建一个独立的服务账号,并使用 SignedJwtAssertionCredentials 来加载它,再使用唯一的许可范围,就可以正常工作。所以,GAE 的默认服务账号是不被市场 API 支持的。

对于已经安装的谷歌应用,它已经允许应用以域内任何用户的身份访问指定的范围。不过,我们需要在 SignedJwtAssertionCredentials 的初始化参数中添加一个 "sub=" 参数,告诉库我们想要以哪个域用户的身份进行操作。因此,只要我们知道一个域的管理员用户,就可以直接以该用户的身份访问目录 API,而不需要弹出任何认证界面给最终用户。而这同样不被默认的 GAE 服务账号支持。

撰写回答