Php 使用oauth 2.0 google+;应用程序编程接口

Php 使用oauth 2.0 google+;应用程序编程接口,php,curl,google-api,google-plus,Php,Curl,Google Api,Google Plus,我正在尝试在我的网站上使用oauth 2.0作为google+api,我一直得到: { "error": { "errors": [{ "domain": "global", "reason": "authError", "message": "Invalid Credentials", "locationType": "header", "locati

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

{
    "error": {
        "errors": [{
            "domain": "global",
            "reason": "authError",
            "message": "Invalid Credentials",
            "locationType": "header",
            "location": "Authorization"
        }],
        "code": 401,
        "message": "Invalid Credentials"
    }
}
问题是,我不知道为什么会这样。我有一个来自谷歌的有效访问令牌,但谷歌告诉be它是无效的。我知道令牌没有过期,因为json数据是在获取访问令牌后10秒内从google发出的请求。以下是我正在使用的流程:

  • 让用户授权请求
  • 从google获取请求代码
  • 使用
    cUrl
    从google请求带有请求代码的访问令牌
  • 将访问代码放入php会话中
  • 重定向回主页面
  • 主页面检测会话变量已设置且不显示登录链接
  • 主页上的Php使用
    readFile
    从google获取json响应
  • 谷歌返回无效的凭证
  • 以下是php生成的插入readFile的uri示例:


    请帮忙?

    我以前遇到过这个问题,但我在推特上遇到过

    对于OAuth,实际上我们和twitter通信两次,第一次是获取请求令牌,第二次是授权发送已经签名的第一个令牌。
    也许你只克服了第一个问题。

    你试过谷歌API客户端吗?有一些入门级的应用程序,你可以用来让球滚动


    您不应该共享未经更改的访问令牌-有人可以使用该令牌来模拟您(实际上是为授予该令牌的人)

    最好将Auth令牌作为头传递,如:

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

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

    下面是一个使用PHP扩展的解决方案。将按照您定义的方式对请求进行签名。在本例中,在导入脚本的配置文件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);
    

    几个小时以来,我一直收到相同的401“无效凭据”错误。然后我注意到我在数据库中的VARCHAR(50)字段中存储了我的access_令牌。它切断了访问令牌的一部分。我增加了列的长度。固定的


    仔细检查数据库中存储access\u令牌和refresh\u令牌的字段长度

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

    我的问题是GET/POST请求的标题“Authorization”:

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

    但正确的是:Authorization:OAuth/*OAuth 2.0令牌*/

    对!!在您的令牌密钥前包含“誓言”

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


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

    可能需要发布更多代码以获得有用的反馈。如果您100%确定您的令牌是有效的,我将首先关注您提交凭据的代码部分。也许您的令牌与它的输入方式不完全相同,并且您正在使自己无效…?当最佳解决方案是下载提供商创建的客户端时,存在一个严重的问题。我之所以这样说,是因为在许多情况下,在构建更大、更动态的应用程序时,集成上述客户机并不是一种选择。如果能找到一个真正触及问题核心的解决方案,让人们了解实际发生的情况,并能在未来更好、更有效地处理问题,那将是一件好事。谢谢。非常有帮助-我没有意识到你也必须在头中包含“OAuth”值。
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth '.$_SESSION['access_token'], 'Content-Type: application/json'));