【问题标题】:Programmatically accept Google My Business invitation for service account以编程方式接受服务帐户的“Google 我的商家”邀请
【发布时间】:2019-10-14 12:09:05
【问题描述】:

我正在尝试使用服务帐户通过 Google My Business API 检索位置/评论。

到目前为止,我有:

  1. 在 Developers Console 中创建了一个项目
  2. 启用对 Google My Business API 的访问(已获 Google 批准/列入白名单)
  3. 创建了一个具有关联 OAuth 身份的服务帐户
  4. 邀请 OAuth 身份(即服务帐户)作为“Google 我的商家”位置的经理

使用可从https://developers.google.com/my-business/samples 下载的 Google 示例 .NET 客户端以编程方式列出来自 https://mybusiness.googleapis.com/v4/accounts/[ACCOUNT NAME]/invitations 的邀请时,我能够看到邀请

但是,当我尝试通过 https://mybusiness.googleapis.com/v4/accounts/[ACCOUNT NAME]/invitations/[INVITATION NAME]:accept 接受邀请时,请求失败并出现 500 服务器错误。

在创建MyBusinessService 实例时,我首先创建一个服务帐户凭据,例如:

ServiceAccountCredential credential;

using (Stream stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
   credential = (ServiceAccountCredential)GoogleCredential
                   .FromStream(stream)
                   .CreateScoped(new [] { "https://www.googleapis.com/auth/plus.business.manage" })
                   .UnderlyingCredential;
}

接下来我创建一个初始化器,如:

var initializer = new BaseClientService.Initializer()
{
   HttpClientInitializer = credential,
   ApplicationName = "My GMB API Client",
   GZipEnabled = true,
};

最后我创建了一个MyBusinessService 实例,例如:var service = new MyBusinessService(initializer);

我可以列出邀请:

service.Accounts
       .Invitations
       .List("[ACCOUNT NAME]")
       .Execute()
       .Invitations;

但是,尝试接受邀请失败:

service.Accounts
       .Invitations
       .Accept(null, "[INVITATION NAME]")
       .Execute();

第一个参数是null,因为this documentation 表示请求正文应该为空。

或者是否有其他方式可以接受邀请,以使服务帐户能够检索我们所在位置的“Google 我的商家”评论?

【问题讨论】:

  • 这方面没有进展吗? Google 正式允许通过服务帐户使用 OAuth 进行服务器到服务器通信:developers.google.com/identity/protocols/oauth2/service-account 我们需要以编程方式获取我们在 Google 上的业务的评论评级。一切正常,但我们无法接受服务帐户的邀请。

标签: google-api google-api-dotnet-client google-my-business-api


【解决方案1】:

要作为服务器到服务器身份验证的服务帐户登录,您需要为您的服务帐户启用域范围委派。 https://developers.google.com/admin-sdk/directory/v1/guides/delegation

完成此操作后,您可以通过模拟已获批准的“我的商家”经理的电子邮件地址,让您的服务帐户登录到“Google 我的商家”API。这是在 NodeJS 中,这是我使用的:

const { google } = require('googleapis'); // MAKE SURE TO USE GOOGLE API
const { default: axios } = require('axios'); //using this for api calls

const key = require('./serviceaccount.json'); // reference to your service account
const scopes = 'https://www.googleapis.com/auth/business.manage'; // can be an array of scopes

const jwt = new google.auth.JWT({
  email: key.client_email,
  key: key.private_key,
  scopes: scopes,
  subject: `impersonated@email.com`
});

async function getAxios() {

  const response = await jwt.authorize() // authorize key
  let token = response.access_token // dereference token
  console.log(response)

    await axios.get('https://mybusiness.googleapis.com/v4/accounts', {
      headers: {
        Authorization: `Bearer ${token}`
      } // make request
    })
    .then((res) => { // handle response
      console.log(res.data);
    })
    .catch((err) => { // handle error
      console.log(err.response.data);
    })
  }

await getAxios(); // call the function

【讨论】:

    【解决方案2】:

    GMB API 中的服务帐户不能替代 Google 用户帐户身份验证。您需要将 Oauth 与用户帐户(例如,可以访问 GMB 网络界面的 gmail 帐户)一起使用,以便您可以代表用户执行操作。

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多