无法使用angularjs从谷歌获取访问令牌

时间:2014-03-26 12:53:05

标签: angularjs google-api access-token

我正在接受this guide并试图从谷歌api获得一个acc令牌。我alredy得到了一个身份验证代码。所以我正在使用angularjs将httprequest发送到谷歌服务器。问题是我总是得到不好的请求答案。这是我的代码:

        $http({
            method: 'POST',
            url: 'https://accounts.google.com/o/oauth2/token',
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            params : {
                code           : '4/heMv6ozWwCxS5RyTzCgThAgxvRyk.oske-bNEGOUTOl05ti8ZT3YnwwH8iQI',
                client_id      : GoogleAppInfo.clientId,
                 redirect_uri  : GoogleAppInfo.redirect_uri,
                client_secret  : GoogleAppInfo.client_secret,
                grant_type     : 'authorization_code'
            },
            data :'Demo' //just data to apply the heaser

        }).
        success(function(data, status, headers, config) {
            alert('secsses');
        }).
        error(function(data, status, headers, config) {
            alert('error');

        });

我用PostMan chorme addon来测试我的参数,它正在研究邮递员。 那里的错误是因为此请求的authcode已过期,但它正在工作! enter image description here

有人对这个问题很不满意吗? 非常感谢!!

1 个答案:

答案 0 :(得分:1)

我认为如果你要比较由角度生成的结果请求和邮递员发送的请求,你会发现这里的差异。 (查看提琴手以实现此目的)。

对象将您传递的对象映射为' params'被映射到查询字符串参数,但谷歌期望请求正文中的这些数据。为此,请将此设置为“数据”。参数。但是默认情况下,angular会将其作为json发送,因此我们需要在发布之前对其进行转换。这就是transformRequest函数的目的。 (有关解释,请参阅this link

请参阅下面的重写代码。

$http({
    method: 'POST',
    url: 'https://accounts.google.com/o/oauth2/token',
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: {
            code           : '4/heMv6ozWwCxS5RyTzCgThAgxvRyk.oske bNEGOUTOl05ti8ZT3YnwwH8iQI',
            client_id      : GoogleAppInfo.clientId,
            redirect_uri  : GoogleAppInfo.redirect_uri,
            client_secret  : GoogleAppInfo.client_secret,
            grant_type     : 'authorization_code'
        }
     transformRequest: function(data) {
         var buffer = [];
         for ( var name in data ) {
             if ( ! data.hasOwnProperty( name ) ) {
                 continue;
             }
             var value = data[ name ];
             buffer.push(
                        encodeURIComponent( name ) +
                        "=" +
                        encodeURIComponent( ( value == null ) ? "" : value )
             );
         }
          var source = buffer
              .join( "&" )
              .replace( /%20/g, "+" );
          return source; 
       }
    })