但有时候(迄今为止只有两次超过6个月)我经历过一种奇怪的行为:
对Google API的请求会返回无效凭据(401)错误。 刷新访问令牌(使用存储的刷新令牌)无济于事。
以下是我在测试此问题时获得的一些结构化输出:
+ ------------------------------------------------------------------------- + | 1.TRYING TO REFRESH THE TOKEN. | | 2.DONE REFRESHING THE TOKEN. | + ------------------------------------------------------------------------- + | access: **************************************************** | | refresh: ********************************************* | | expires: 3600 | | created: 2013-07-23 13:12:36 | + ------------------------------------------------------------------------- +
我还尝试通过发送请求来验证“新鲜”访问令牌 https://www.googleapis.com/oauth2/v1/tokeninfo
+ ------------------------------------------------------------------------- + | 1. TRYING TO CHECK THE TOKEN . | | 2. DONE CHECKING THE TOKEN THE TOKEN. | + ------------------------------------------------------------------------- + | issued_to: ************.apps.googleusercontent.com | | audience: ************.apps.googleusercontent.com | | user_id: ************ | | expires_in: 3600 | | email: **********@gmail.com | | verified_email: 1 | | access_type: offline | | scopes:: | + ------------------------------------------------------------------------- + | https://www.googleapis.com/auth/userinfo.email | | https://www.googleapis.com/auth/userinfo.profile | | https://www.googleapis.com/auth/plus.me | | https://www.googleapis.com/auth/drive | + ------------------------------------------------------------------------- +
但是当我尝试访问驱动器Feed时,响应是:
Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials domain: global reason: authError message: Invalid Credentials locationType: header location: Authorization
我们也遇到过与日历相同的问题。 所以:
通常在撤销令牌时,尝试刷新令牌时会返回“invalid_grant”错误。
问题
答案 0 :(得分:19)
根据有关错误的Google API文档&错误代码:
https://developers.google.com/drive/handle-errors#401_invalid_credentials
401: Invalid Credentials
Invalid authorization header. The access token you're using is either expired or invalid.
error: {
errors: [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization",
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
这与您的错误版本完全匹配,因此很可能是Google认为您的请求有误。
但是,众所周知,Google API请求可以返回对实际诊断问题明显无益的错误。出于多种原因,我收到了“Invalid Credentials”错误。这几乎总是因为我做了一些我认为无关紧要的改变,但确实如此。
我的第一个想法(在黑暗中拍摄)将转到Google API控制台:
https://code.google.com/apis/console
Googles身份验证令牌验证程序(https://www.googleapis.com/oauth2/v1/tokeninfo)可以返回有效的响应,但客户端密码或客户端ID可能已更改。
响应正文中的微小变化也会导致此错误。
我不知道你是如何通过REST调用或客户端lib发出请求的,但我使用ruby lib,它允许命令行界面进行API调用。我找到了这个& OAuth2 Playground非常有助于诊断Google API调用。
仅供参考:我只收到了来自Google API的2个错误:“凭据无效”和“权限不足”。后者几乎总是与糟糕的范围有关。前者几乎就是其他一切。
我还要说,如果你在6个月内只遇到过2次错误,那么你很幸运!
答案 1 :(得分:6)
当我尝试在Google控制台中更改重定向网址然后在服务器上更新我的json凭据文件时遇到此问题。我必须在重新开始之前清除会话变量。所以在你的项目中只需执行一次:
session_start(); //starts a session
session_unset(); //flushes out all the contents previously set
请记得在干运行一次后移除session_unset()
。
答案 2 :(得分:3)
我在开发环境中。我也有这个问题。
首先我尝试刷新凭据。没有结果。然后我删除了我的应用程序(因为我仍然在开发环境,这没关系,但是如果你已经在生产中使用它,请小心这个行动),创建一个新的,在客户端更新凭证JSON。仍然没有结果。
我通过打开未登录Google帐户的新浏览器实例解决了这个问题(私密浏览,因为我使用的是Firefox),再次登录我的Google帐户,并尝试使用我的客户端(这是一个Web应用程序)。我按预期被重定向到授权屏幕,之后,它对我来说很好。
答案 3 :(得分:2)
我最近遇到了这个奇怪的错误。我的修复:在重定向到 AuthUrl 之前,我设置了取消所有会话的功能。
答案 4 :(得分:1)
清除Google Chrome中的存储空间对我有用(不知道什么'清除存储'正在清除的所有详细信息):
var Promise = require("bluebird");
var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})
var url_arr = ["https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE", "https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=AIzaSyDe3MyoHI6aSbYKdHOXloz9QepAMfes9XE"];
function* fetch(obj) {
console.log("2")
var myobj = yield request.getAsync(obj).promise();
console.log("3", myobj)
return myobj;
}
url_arr.forEach(function (obj){
console.log("1", obj)
var output = fetch(obj);
console.log("4, ", output);
});
标签Application
答案 5 :(得分:1)
我遇到了同样的错误:
The redirect URI in the request, does not match the ones authorized for the OAuth client.
但是 abhishek77in 在这里找到了这个非常简单的解决方案:
https://coderwall.com/p/fmr5ag/avoid-invalid-credentials-with-google-oauth2
解决方案是:
如果您正在使用 https://github.com/zquestz/omniauth-google-oauth2确保 按照自述文件中的说明操作。 " 您必须启用"通讯录API"和 " Google+ API"通过Google API控制台。"
在Google API控制台中启用这些功能会修复"无效凭据"我的问题。
答案 6 :(得分:0)
我删除了对特定应用的Google帐户访问权限时收到(401) Invalid Credentials
。所以我要做的就是再次请求授权URL(以https://accounts.google.com/o/oauth2/auth
开头的那个)。
答案 7 :(得分:0)
当我需要将范围从只读更改为读取和写入所有文件时,我遇到了同样的问题。因此,我将我的文档顶部的范围从只读更新为:
// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/drive'];
Google在其API指南中提供了这些注释,说明无论何时更改范围,都必须更新凭据。我相信这意味着,虽然我不确定,但必须更新令牌。旧令牌仍然由谷歌持有,它认为我只有只读访问权限,因此它会返回401错误。所以,我需要重新制作我的令牌,但谷歌从未提供新的同意屏幕,这将允许我说允许读取和写入所有文件。所以,我需要让屏幕重新出现,所以它会创建一个新的令牌来替换旧的令牌:
fs.readFile(TOKEN_PATH, function(err, token) {
if (err) {
getNewToken(oauth2Client, callback);
} else {
getNewToken(oauth2Client, callback);
// oauth2Client.credentials = JSON.parse(token);
// callback(oauth2Client);
}
});
由于我已经有一个保存的令牌,因此从未创建过新的令牌。所以,我只是注释掉旧令牌的使用,并告诉它获得一个新令牌,无论我们是否有。然后,我访问了Google中的Connected Apps并删除了旧的连接凭据。我不确定这一步是否必要,但我只是想访问我的个人帐户。然后,当我运行我的程序时,它促使我重新进行身份验证,一切正常,我没有收到身份验证错误。完成后,请务必删除已注释的行以使用已制作的令牌。我正在使用Google API quickstart.js文件来完成所有这些工作。
因此,当我更新我的范围时,旧令牌仍然使用只读范围,因此我会得到(401)无效凭据。
答案 8 :(得分:0)
我在c:\ Users \ [user] \。credentials中删除了文件json时解决了这个问题。
答案 9 :(得分:0)
userInfo: Invalid Credentials
我收到以下错误,因为我试图访问的范围数组元素即个人资料和电子邮件,这些链接是我从google + api范围页面获得的链接:某种程度上是虚假/无效的,所以我进入了我的同意屏幕,
在电子邮件配置文件openID 下,提到了 Google API的作用域下的,我将鼠标悬停在每个URL上,并用各自的URL替换了旧的URL,从而解决了我的错误
答案 10 :(得分:0)
也许这对某人有用:
使用Calendar API的JavaScript Google-API客户端时,我遇到了类似的问题。在随机时间它可以工作,但是大多数情况下我遇到相同的错误。添加范围,测试键,无济于事。几个小时后,我找到了这个解决方案,不知道为什么会起作用,但是它为我解决了这个问题:
<select id="Users" v-model="Selected">
<option>--Select--</option>
@foreach(var item in list)
{
<option id="@item.User" value="@item.Department">@item.User</option>
}
</select>
答案 11 :(得分:-1)