我正在尝试通过Google的服务帐户身份验证来验证我的服务器应用,但由于某种原因,它只是没有推动。
在API console中,我已经创建了项目,启用了我需要的服务(Admin SDK),并创建了服务帐户和Web应用程序API访问。
当我使用Web应用程序访问凭据时,我能够验证和检索用户记录。但是使用服务帐户身份验证会继续向我提供登录所需的消息。
"error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login Required", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Login Required" }
我忘了添加,我正在使用PHP客户端库进行测试。
public function init() {
$client = new Google_Client();
if (isset($_SESSION['access_token'])) {
$client->setAccessToken($_SESSION['access_token']);
}
$key = file_get_contents(App::SERVICE_KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
App::SERVICE_ACCOUNT_NAME,
App::SERVICE_API_SCOPES,
$key)
);
$client->setClientId(App::SERVICE_CLIENT_ID);
debug($client, 'CLIENT');
if ($client->getAccessToken()) {
$this->access_token = $_SESSION['access_token'] = $client->getAccessToken();
debug($_SESSION['access_token'], 'TOKEN');
} else {
debug('NO TOKEN');
}
$this->client = $client;
}
如您所见,代码与Google示例基本相同。我错过了一个额外的步骤吗?
最后一件事,当我使用Web应用程序进行身份验证然后访问我的服务帐户脚本时,服务帐户脚本可以获取Web应用程序脚本的会话并推送用户记录检索。这是否意味着Admin SDK API明确需要通过Web应用程序身份验证进行用户交互?
答案 0 :(得分:0)
而不是服务帐户,我选择使用已安装的应用程序API访问。
这个红宝石宝石实际上帮我解决了这个问题 - https://github.com/evendis/gmail_cli
我在控制台上玩它,只是按照自述文件中的授权步骤,发现安装的应用程序在执行服务器管理应用程序时更简单。
作为一个新手,我想我错过了刷新令牌在整个过程中扮演的重要角色。通过已安装的应用程序方法帮我解决了这个问题。
我的配置文件现在包含客户端ID,客户端密钥,api范围,重定向uri,授权代码和刷新令牌;我的初始化代码现在看起来像:
public function init() {
$client = new Google_Client();
$client->setClientId(App::CLIENT_ID);
$client->setClientSecret(App::CLIENT_SECRET);
$client->setScopes(App::API_SCOPES);
$client->setRedirectUri(App::REDIRECT_URI);
if (!$client->getAccessToken()) {
$client->refreshToken(App::REFRESH_TOKEN);
}
$this->access_token = $client->getAccessToken();
$this->client = $client;
}