使用oauth 2.0 google + api烦人的无效凭据

时间:2011-10-18 02:03:53

标签: php curl google-api google-plus

我正在尝试在我的网站上使用oauth 2.0 for google + api,我一直在:

{
    "error": {
        "errors": [{
            "domain": "global",
            "reason": "authError",
            "message": "Invalid Credentials",
            "locationType": "header",
            "location": "Authorization"
        }],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

问题是,我不知道为什么会这样。我有一个来自谷歌的有效访问令牌,但谷歌告诉它是无效的。我知道令牌尚未过期,因为json数据是获取访问令牌后10秒内谷歌的请求。这是我正在使用的过程:

  1. 让用户授权该请求。
  2. 从谷歌获取请求代码。
  3. 使用cUrl使用google的请求代码请求访问令牌。
  4. 将访问代码放入php会话。
  5. 重定向回主页。
  6. 主页检测到会话变量已设置且不显示登录链接。
  7. 主页上的Php使用readFile来获取谷歌的json响应。
  8. Google会返回无效凭据。
  9. 这是一个由php生成的示例uri,插入readFile:

    https://www.googleapis.com/plus/v1/people/me?prettyprint=true&access_token=ya29.AHES6ZQRGovDa5FHsojU3qCM1DEnYmJPywz1muUE4CWGH5n70OcAkw

    请帮忙吗?

8 个答案:

答案 0 :(得分:3)

你不应该共享一个未经改动的访问令牌 - 有人可以使用它来冒充你(真的是为了被授予的任何人)。

最好将Auth令牌作为标题传递,例如:

curl -H "Authorization: OAuth ya29.xyzxyz" "https://www.googleapis.com/plus/v1/people/me"

不确定这是否必要,但您的错误消息似乎表明标题中存在auth错误,因此您可能提供的授权标题与您需要的标题不匹配。

答案 1 :(得分:2)

以下是使用PHP的pecl oauth扩展名的解决方案。将按照您定义的方式对请求进行签名。在这种情况下,在导入脚本的配置文件json对象中。

        $oauth = new OAuth($this->config->consumer_key, $this->config->consumer_secret, $this->config->signature_method, $this->config->auth_type);
        $oauth->setVersion($this->config->version);
        $oauth->setToken($accessToken->oauth_token, $accessToken->oauth_token_secret);

        $params = array(
            'fields' => 'displayName,emails,id,image,name',
            'pp' => 1
        );

        $oauth->fetch('https://www.googleapis.com/plus/v1/people/me', $params, OAUTH_HTTP_METHOD_GET);

        // extract response
        $json = Zend_Json::decode($oauth->getLastResponse(), Zend_Json::TYPE_OBJECT);

答案 2 :(得分:1)

您是否尝试过其中一个Google API客户端?您可以使用启动器应用程序来推动滚动。

https://developers.google.com/+/downloads

答案 3 :(得分:0)

我以前遇到过这个问题但是有了推特。

对于OAuth,我们实际上与Twitter进行了两次通信,首先获取请求令牌,然后授权发送已签名的第一个令牌。 也许你只是克服了第一个。

答案 4 :(得分:0)

我在几个小时内收到相同的401“无效凭据”错误。我注意到我将access_token存储在VARCHAR(50)字段的数据库中。它切断了access_token的一部分。我增加了列长度。固定。

仔细检查存储access_token的数据库中的字段长度以及refresh_token!

答案 5 :(得分:0)

我认为me API已被破坏。当我尝试请求具有真实用户ID的URI时,问题就消失了。我的意思是这样的:https://www.googleapis.com/plus/v1/people/108189587050871927619?key={your_api_key}

答案 6 :(得分:0)

删除您的 token.json 文件,然后再次尝试请求。

答案 7 :(得分:-1)

我的问题是标题"授权"在GET / POST请求中:

Google文档说:授权:/ * OAuth 2.0令牌在这里* /

但正确的是:授权:OAuth / * OAuth 2.0令牌在这里* /

是的!包括" OATH"在您的令牌密钥之前!

如果您使用的是cURL(PHP),请使用:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth '.$_SESSION['access_token'], 'Content-Type: application/json'));