授权后几小时,Google OAuth 2访问令牌无法按预期运行

时间:2017-10-03 17:05:56

标签: oauth oauth-2.0 google-oauth google-oauth2

我使用Google Identity Platform的OAuth 2.0流程授权javascript / HTML教师观察表单以写入Google表格文档。一切都运作良好;但是,昨晚我们的一位校长遇到了以下错误:

"请求具有无效的身份验证凭据。预期的OAuth 2访问令牌,登录cookie或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。"

我确定他下午已经启动了观察工具,现在可能五个小时后试图点击提交按钮。我的预感是令牌已经过期,但是从谷歌的文档中看来,JS auth库似乎是为了在必要时处理刷新访问令牌 - 我相信它实际上不可能获得刷新令牌手动做任何事情。

我使用的是基本上是示例代码的代码,应用程序响应正确签名。也就是说,如果我在另一个标签中退出,则会禁用提交按钮并再次显示登录按钮。假设令牌过期是这里的问题,任何关于识别令牌是否已过期以及如何请求新令牌的正确方法的想法,理想情况下没有用户交互?或者,如果它不是过期问题,那还有什么呢?该用户已在先前的观察中成功提交了数据;就在这一次,他等了大约5个小时(可能会丢失互联网连接/睡觉他的笔记本电脑)。

以下是授权码:

var clientId = ""; //id removed
var discoveryDocs = ["https://sheets.googleapis.com/$discovery/rest?version=v4"];
var scopes = "https://www.googleapis.com/auth/spreadsheets";
var authorizeButton = document.getElementById('authorize-button');
function handleClientLoad() {
    gapi.load('client:auth2', initClient);
}
function initClient() {
    gapi.client.init({
        discoveryDocs: discoveryDocs,
        clientId: clientId,
        scope: scopes
    }).then(function () {
        gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
        updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
        authorizeButton.onclick = handleAuthClick;
    });
}
function updateSigninStatus(isSignedIn) {
    if (isSignedIn) {
        authorizeButton.style.display = 'none';
        document.getElementById('submit').disabled = false;
        findRow(); //find the empty row once we're logged in
    } else {
        authorizeButton.style.display = 'block';
        document.getElementById('submit').disabled = true;
    }
}
function handleAuthClick(event) {
    gapi.auth2.getAuthInstance().signIn();
}

谢谢!

4 个答案:

答案 0 :(得分:0)

我遇到的类似问题导致来自授权Javascript起源的问题。 "在“授权的JavaScript来源”字段中,输入应用的来源。您可以输入多个来源,以允许您的应用在不同的协议,域或子域上运行。你不能使用通配符。在下面的示例中,第二个URL可以是生产URL。"取自https://developers.google.com/identity/sign-in/web/devconsole-project.If提示来查看来自电子邮件的任务,必须验证电子邮件来源 - 或者 - 该设备用于多个帐户,该令牌将不会停留。如果api被错误地使用,它将允许短时间的功能,然后失败。

答案 1 :(得分:0)

这可能很有用,在authflow中,您没有选项中的范围或ID

   /** * Initiate auth flow in response to user clicking authorize button. * * 
   @param {Event} event Button click event. */ function 
   handleAuthClick(event) { 
   gapi.auth.authorize( {client_id: '[@app:client_id]', scope: 
   ["googleapis.com/auth/calendar"], immediate: false}, handleAuthResult); 
   return false; }

答案 2 :(得分:0)

我相信How to refresh expired google sign-in logins?得到了我需要的答案。由于我的所有API调用都是立即发生的,所以我在页面加载时添加了一个新的Date(),在提交流程开始时添加了第二个新的Date(),如果它们相距超过45分钟(2,700,700ms),我使用了gapi .auth2.getAuthInstance()。currentUser.get()。reloadAuthResponse()强制访问令牌刷新,如https://developers.google.com/identity/sign-in/web/reference#googleuserreloadauthresponse所述。

希望Google最终会更新他们的文档,以便在使用auth2流程与旧版本的auth流程时反映现在必要的步骤。

时间将证明这是否真的解决了这个问题,但我很有希望!

答案 3 :(得分:0)

我希望它可以帮助你的朋友,错误是因为你的时间不对,你去日期和时间设置然后按现在同步。