Google Javascript API(漏洞)-.load问题



我正在尝试使用Google plus API(通过Google-API-javascript)实现,如这样(省略完整代码):

var clientId = '7454475891XxxxxxXom4c6n.apps.googleusercontent.com'; //fake client
var apiKey = '-uTH_p6NokbrXXXXXXXXXXXXX'; //Fake Key
var scopes = 'https://www.googleapis.com/auth/plus.me';
function handleClientLoad() {
gapi.client.setApiKey(apiKey);
window.setTimeout(checkAuth,1);
}
function checkAuth() {
gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult);
}

function handleAuthResult(authResult) {        
if (authResult && !authResult.error) {          
makeApiCall();
} else {
//handle user-approval
}
}
// Load the API and make an API call.  Display the results on the screen.
function makeApiCall() {
gapi.client.load('plus', 'v1', function() {
var o = gapi.client.plus;
alert(o);
});
}

代码在gap.client.load(包括允许访问的用户)之前运行良好-调用此回调,但alert(o)将返回undefined。

在检查HTTP请求时,我看到.load向发出请求

https://content.googleapis.com/discovery/v1/apis/plus/v1/rpc?fields=methods%2F*%2Fid&pp=0&key=-uTH_p6NokbrXXXXXXXX

这将返回HTTP 400并显示以下消息:

{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}

我的问题是——我需要改变什么才能让它发挥作用?有什么秘密设置需要我启用吗?Google+在API列表下的谷歌开发者控制台中启用。

谢谢你的帮助,Alon

问题:.load向谷歌发现服务发出加载.JS的请求。如果收到的请求包含api密钥,该服务将出错。(我不知道为什么库会这样工作,它看起来像一个bug?)

修复:

gapi.client.setApiKey(""); //NEW
gapi.client.load('plus', 'v1', function()
//re-add the key later if you need it

来自Discovery Service文档:向Discovery Service API发出的请求不应包含API密钥。如果您确实提供了密钥,则请求将失败。

奇怪…:P

一个小更新&更多的是一种解释。当前的"发现服务"页面现在更加具体了。它们表示,如果应用程序具有Oauth2令牌,则不需要API密钥值但是,我还发现,如果我有一个经过身份验证的用户,并且因此存在Oauth2令牌(access_token),则发现服务将失败,并在OP中记录错误。这似乎与文档相矛盾。

您可以在开发者工具控制台中看到令牌,其中包含:

console.log(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse());

将其嵌入HTML中的<script>...</script>或以其他方式调用的.js文件中。必须在gapi.load(...)之后。如果在调用gapi.load(...)之前执行,它将停止脚本。

要获得当前用户,必须在之后,当然,用户已通过身份验证。但是,如果用户没有经过身份验证,它确实会返回一个对象。如果你在Chrome中,你可以在开发者工具控制台窗口中展开对象,以获得auth响应中所有内容的良好轮廓格式。

请注意,在成功进行身份验证之前,currentUser是未定义的。由于此操作"静默失败",您应该使用条件语句来验证登录状态或真实代码中是否存在当前用户。

为了完整起见,我的应用程序中的对象实例化过程是这样的,在高层:

1.)gapi.load(...)-在这个gap.client之后,gap.auth2和其他对象都可用。

2.)gapi.client.setApiKey("")将被调用以"清除"api密钥,如果它之前是为了某些其他目的而设置的。

3.)gapi.auth2.init(...)-在此之后,身份验证实例可通过gapi.auth2.getAuthInstance获得。

4.)然后使用auth实例的.signIn()方法开始登录。auth实例将用类似auth_instance = gapi.auth2.getAuthInstance();的东西实例化。如果这样做,那么登录将是auth_instance.signIn()

(…)-表示需要几个参数

我还发现Google tictactoe的例子很有用,是进一步工作的简单基础。

我希望这对某人有帮助!

您需要调用方法

function handleAuthClick(event) {
gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false} handleAuthResult);
return false;
}
function makeApiCall() {
gapi.client.load('plus', 'v1', function () {
var request = gapi.client.plus.people.get({
'userId': 'me'
});
request.execute(function (resp) {
'method ajax with you application'
});
});
}

你可以在这里看到的作用

最新更新