Google自定义搜索API无效的凭据错误消息

时间:2016-02-22 23:52:25

标签: angularjs google-custom-search

我正在使用谷歌自定义搜索API来搜索angular.js项目中的图像。

这是我的代码:

 var photosPublic = $resource('https://www.googleapis.com/customsearch/v1',
      { key: '..........ZDtw95C0V98ne4S39SPFi68', cx: '..........75325342:1ttvll7gahc' },
      { searchType:'image' });
    return {
      search: function(query) {
        var q = $q.defer();
        photosPublic.get({
          q: query
        }, function(resp) {
          q.resolve(resp);
        }, function(err) {
          console.log(err);
          q.reject(err);
        })

        return q.promise;
      }
    }

如果我直接在浏览器中输入url和所有凭据,它的工作原理非常好。但当我在我的项目中包含这个时,我收到以下回复:

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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并想在这里分享我的解决方案,因为我在Google搜索中偶然发现了这里。

当您在请求库中设置一些默认授权标头,例如$resourceaxios等时,就会出现问题。

当您在发送给Google自定义搜索api的请求中提供授权标头时,Google服务器试图使用此标头对您进行授权,甚至没有尝试使用给定的key对您进行授权,并且cx

我对$ resource不太了解(也许其他人可以添加一些代码?),但是我有axios的解决方案:

import axios from 'axios'

export default {
    url: 'https://www.googleapis.com/customsearch/v1',
    http: axios.create(),
    search(text) {
        this.http.defaults.headers.common = {};
        const key = process.env.GOOGLE_SEARCH_API_KEY
        const cx = process.env.GOOGLE_SEARCH_SCOPE_ID
        return this.http.get(this.url, {
            params: {
                q: text,
                cx,
                key
            }
        })
    }
}

这将为搜索api创建一个自己的axios实例并重置标头。另外:您的全局axios实例不受影响(也许与后端通信需要您的Auth标头)。