【发布时间】:2018-03-14 23:05:24
【问题描述】:
我正在使用 Google Identity Platform 的 OAuth 2.0 流程授权 javascript/HTML 教师观察表写入 Google 表格文档。大多数时候一切都运行良好;然而,昨晚我们的一位校长遇到了以下错误:
“请求具有无效的身份验证凭据。需要 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅 https://developers.google.com/identity/sign-in/web/devconsole-project。”
我确定他在下午启动了观察工具,现在大概五个小时后正在尝试点击提交按钮。我的预感是令牌已过期,但从 Google 的文档看来,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();
}
谢谢!
【问题讨论】:
标签: oauth oauth-2.0 google-oauth