我正在尝试使用Google+ API通过网络应用程序使用javascript访问Google云端硬盘。我总是收到401 Invalid Credentials错误,即使我有一个尚未过期的有效访问令牌(在https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=MY_ACCESS_TOKEN确认),我也启用了Drive API,并且没有撤消对令牌的访问权限。此外,我已经进行了双重检查,并且访问令牌肯定是在授权标头中发送的(我通过浏览器的调试器查看了请求)。根据我的研究,这些是401 Invalid Credentials错误的主要原因。但是,我仍然得到这些错误,无法弄清楚原因。这是我的文件,我删除了client_id和api_key。
使用Javascript:
var SCOPES = ['https://www.googleapis.com/auth/plus.login','https://www.googleapis.com/auth/drive'];
var CLIENT_ID = 'MY_CLIENT_ID';
var API_KEY = 'MY_API_ID';
function load()
{
console.log("load");
gapi.client.setApiKey(API_KEY);
window.setTimeout(checkAuth,1);
}
function checkAuth() {
console.log('checkAuth');
gapi.auth.authorize({client_id: CLIENT_ID, scope: SCOPES, immediate: false}, handleAuthResult);
}
function handleAuthResult(authResult) {
gapi.client.setApiKey(API_KEY);
if (authResult && !authResult.error)
{
makeRequest();
}
else
{
alert('error');
}
}
function makeRequest()
{
gapi.client.load('drive','v2',function()
{
var request = gapi.client.request({
'path': '/drive/v2/about',
'method': 'GET',
});
debugger;
request.execute(function(response)
{
debugger;
});
});
}
我的HTML仅包含相关的javascript文件,并从myScript调用load方法。
HTML:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Bootstrap -->
<script src="../js/myScript.js"></script>
<script src="https://apis.google.com/js/client.js"></script>
<script src="https://apis.google.com/js/plusone.js?onload=load"></script>
</head>
<body>
</body>
</html>
如果有人能弄明白为什么我会收到401错误或如何进一步查找信息,那就太棒了。
编辑:我应该如何创建请求?当我使用
var request = gapi.client.request({
'path': '/drive/v2/about',
'method': 'GET',
});
我可以看到授权标头是正确的。但是,在我看过的教程中,他们使用:
var request = gapi.client.drive.about.get({});
请求在浏览器的调试器中看起来不同,并且不一定包含正确的授权标头
答案 0 :(得分:4)
我记得一些提供API密钥和访问令牌的问题导致某些API调用出现问题。由于在调用经过身份验证的方法时不需要API密钥,如果您删除gapi.client.setApiKey(API_KEY);
调用(您的代码中有两次,但这不重要),可以尝试它是否有效,看看是否这个案子?
答案 1 :(得分:0)
虽然我90%确定Scarygami建议解决你的问题 - 从checkAuth中删除setApiKey - 如果这不是问题的根源,请考虑更多的事情:
如果您在
处输入断点