OAuth2 Google服务帐户invalid_grant

时间:2014-07-30 12:13:41

标签: php oauth-2.0 google-oauth

我在此处发布的密钥来自我已删除的容器,但都是Google提供给我的有效密钥。

我试图实施:https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtReference/management/uploads/uploadData

uploadData功能正常运行,Google Analytics中接受了所有内容。我的问题在于Google的OAuth2:https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization

从我收集的内容来看,对于我想要的终点,我必须使用OAuth2令牌,并且不能使用api密钥。请求不接受?key = {api},并且只接受Bearer Authorization。使用服务帐户请求,我收到的所有内容都是invalid_grant。我已经更新了我的时钟并且进行了各种错过的值匹配无济于事。请注意,使用类似的键,所有其他工作流程都可以工作,但我不希望进行用户交互,因为这是一项后台任务。

json关键数据(由Google提供): { "private_key_id": "825119b6ab0eabf2029a4e1cf562fa88090736a0", "private_key": "-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANCQ+tGWdTUOL6py\nhk/KGK/ClNFQnzRrzPvOgeHCqENqeunN5LJYBlrf0OOmRzJjV67WZc3cHKu95kYr\nI+Sz0NlsmPYiwP2eMUKL5HX2JEXx/T8Bf7SWK78G7BnPKxA1fKISSftJ1IJ9neH5\nqhe4zEIB2NUcc6h3GHqBoQx4/4/dAgMBAAECgYEAsegpe2RrQEGEmVEtjpwmaK6D\nQPUTiKS36sdhdREVdMQ8anmtrg92BEhMqBNrQekJn2LU3j/22OyYo5wi9vAHohPI\nKYODw6mUemk/ULyuMGesC7nRq9sM7YnJk3KlkYrtLVR9THwAPfZ73k4UswsGFw4e\naCX6SwtNnQTHruCvCAECQQD8ZkxRf2LdP0LZYrqcB0TD2P1rYeX+IHW5sC6mdDjQ\nv6HWXjviEBfQH6kaxpUvRaSHTk1p2a5pHOjVu9DdkGXdAkEA04qc+nXH6xkBf4yE\nLODzUuAMo/QU1C+SC9AS1WbfAuRyRCkuD0SNTbK8Ec+pkqy/Q6VuvjLvvTosB9+O\nVhIyAQJASYY3RypXj2HFRHQZLiiD5JVKRUSwbdXg1WW4QS7r+gtIxpyOzyym8y61\n4SHmBW5BHlU2AdayktYkEVbz4gcVVQJBAI9JOZEwzEyDMI+btz/K0yYUmptHTgB3\nhF45/zfLKU2FPZzLo+Y1kdzKLzeFSKAQILGKUdvFFrw+tepTU88bHgECQAlp4/sy\nJ2m+zo5HsGBRP4gSxoVqiPuysT9tywJoUeo/3f+0jkDbVylTKTHpnqNk2ijFd1YS\n5ARPrKY4iXG7UoU\u003d\n-----END PRIVATE KEY-----\n", "client_email": "42064665633-fbbnb79350js2h22e8k1s3h9t52rursu@developer.gserviceaccount.com", "client_id": "42064665633-fbbnb79350js2h22e8k1s3h9t52rursu.apps.googleusercontent.com", "type": "service_account" }

要创建{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}的其他两个关联代码是:

$header = [
    'alg' => 'RS256',
    'typ' => 'JWT'
];
$body = [
    "iss" => "42064665633-fbbnb79350js2h22e8k1s3h9t52rursu.apps.googleusercontent.com",
    "scope" => "https:\/\/www.googleapis.com\/auth\/analytics https:\/\/www.googleapis.com\/auth\/analytics.edit",
    "aud" => "https:\/\/accounts.google.com\/o\/oauth2\/token",
    "exp" => strtotime('1 hour'),
    "iat" => strtotime('now')
];
$header = base64_encode(json_encode($header));
$body = base64_encode(json_encode($body));

签名在上面的google docs链接中定义为private_key。我已经尝试了与这种身份验证方法有关的Java问题的每一段摘录,从转义斜杠(如上所示)到省略字段。

我做错了什么/遗漏导致{"error" : "invalid_grant"}

2 个答案:

答案 0 :(得分:0)

我熟悉oauth2的目标c,但这是我处理这个问题的最佳方法:

  1. invalid_grant trying to get oAuth token from google

  2. 您的内部时钟可能与Google时钟不同步,或者您的刷新令牌可能会刷新太多。

  3. 确保您的客户密钥和密钥是最新的,如果没有撤消它们并获得新密钥。

  4. 在PHP中,请确保您使用的是POST请求。

  5. 来源:https://developers.google.com/analytics/devguides/reporting/core/v2/gdataAuthentication

答案 1 :(得分:0)

虽然不是让JWT服务帐户工作的正确解决方案,但我现在正在为Web路由存储刷新令牌。一切都运行良好,这是我需要保存在config.yml文件中的大量信息,我宁愿不这样做。

https://developers.google.com/accounts/docs/OAuth2WebServer#refresh