我想访问与我的帐户及其评论相关联的位置,因为我正在使用google my business API并且我可以访问它(它可以在oAuthplayground上运行)。
现在我想访问google my business api而不登录我的帐户,因为我试图让它与服务帐户一起使用。但到目前为止还没有运气,请建议如何继续这样做。我在服务帐户中启用了G套件,并且我还尝试访问我的业务管理的服务帐户电子邮件(ID),但它仍处于邀请状态,因为没有办法实际上接受邀请。
当我尝试使用我的帐户作为主题发送请求时。
$client = new Google_Client();
$client->addScope('https://www.googleapis.com/auth/plus.business.manage');
$client->setAuthConfig(dirname(__FILE__) . '/Xyz Review API-service account.json');
$client->setSubject('xyz*****abc@gmail.com');
$business_service_class = new Google_Service_Mybusiness($client);
$result_accounts = $business_service_class->accounts->listAccounts();
echo json_encode($result_accounts);
exit;
响应: {的 “nextPageToken”:空}
如果我在主题中使用Google服务帐户ID作为电子邮件ID,那么我会得到以下回复。
$client->setSubject('xyz-review-service@xyz-review-api.iam.gserviceaccount.com');
响应: 错误500 {“error”:“unauthorized_client”,“error_description”:“请求中未经授权的客户端或范围。” }
如果我这样做完全错了,那么请建议如何继续这样做。谢谢。
答案 0 :(得分:2)
我面临使用google apis验证内部服务的问题。 基本上存在两种方法:
正如我所说,我正在使用谷歌api进行内部项目,所以第一个选项是不可能的(该服务不公开)。 转到https://console.cloud.google.com并创建一个新项目,然后转到“api manager”,然后转到“凭据”,然后创建“服务凭证”。
如果你按照所有这些步骤获得了扩展名为.p12的证书,那么访问google api是你的关键(记住你必须启用密钥才能访问你想要的特定谷歌API)。
我粘贴了从我的项目中提取的示例,我使用的是谷歌日历,但每项服务的身份验证都是相同的。
$client_email = 'xxxx@developer.gserviceaccount.com';
$private_key = file_get_contents(__DIR__ . '/../Resources/config/xxxx.p12');
$scopes = array('https://www.googleapis.com/auth/calendar');
$credentials = new \Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$this->client = new \Google_Client();
$this->client->setAssertionCredentials($credentials);
答案 1 :(得分:0)
这是我在 2021 年使用 NodeJS 所做的工作:
要作为服务器到服务器身份验证的服务帐户登录,您需要为您的服务帐户启用域范围的委派。 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