2017-10-03 2 views
1

Ich nutze den OAuth 2.0-Flow der Google Identity Platform, um ein Javascript/HTML-Lehrerbeobachtungsformular zu autorisieren, um in ein Google-Tabellen-Dokument zu schreiben. Alles funktioniert gut die meiste Zeit; In der letzten Nacht jedoch hat einer unserer Principals folgende Fehlermeldung angezeigt:Google OAuth 2-Zugriffstoken funktioniert einige Stunden nach der Autorisierung nicht wie erwartet

"Anfrage hatte ungültige Authentifizierungsdaten. Erwartetes OAuth 2-Zugriffstoken, Login-Cookie oder andere gültige Authentifizierungsinformationen. Siehe https://developers.google.com/identity/sign-in/web/devconsole-project."

Ich stellte fest, dass er das Beobachtungswerkzeug am Nachmittag gestartet hatte, und jetzt vielleicht fünf Stunden später versuchte, auf den Submit-Button zu klicken. Meine Vermutung war, dass der Token abgelaufen war, aber aus der Dokumentation von Google scheint es, als würde die JS-Auth-Bibliothek das Zugriffstoken bei Bedarf aktualisieren - ich glaube, es ist eigentlich nicht möglich, ein Aktualisierungstoken zu erhalten, um manuell etwas zu tun.

Ich verwende, was im Wesentlichen der Beispiel-Auth-Code ist, und die App reagiert darauf, ordnungsgemäß abgemeldet zu werden. Das heißt, wenn ich mich auf einer anderen Registerkarte abmelde, wird die Schaltfläche "Senden" deaktiviert und die Schaltfläche "Anmelden" wird erneut angezeigt. Unter der Annahme, dass der Tokenablauf abgelaufen ist, sollten Sie sich Gedanken darüber machen, wie Sie das Token korrekt ablaufen lassen und einen neuen anfordern können, idealerweise ohne Benutzerinteraktion? Oder wenn es kein Ablaufproblem ist, was könnte es sonst noch sein? Dieser Benutzer hat erfolgreich Daten in früheren Beobachtungen übermittelt. Es war nur dieses eine Mal, als er während dieser Zeit ~ 5 Stunden (möglicherweise Verlust der Internetverbindung/Schlafen seines Laptops) wartete.

Hier ist der Auth-Code:

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(); 
} 

Thank you!

Antwort

0

Ähnliche Probleme, die ich in Probleme von diesen autorisierten Javascript-Ursprüngen geführt hatte. "Geben Sie im Feld Autorisierte JavaScript-Ursprünge den Ursprung für Ihre App ein. Sie können mehrere Ursprünge eingeben, damit Ihre App auf verschiedenen Protokollen, Domains oder Subdomänen ausgeführt werden kann. Sie können keine Platzhalter verwenden. Im folgenden Beispiel die zweite URL könnte eine Produktions-URL sein. " von https://developers.google.com/identity/sign-in/web/devconsole-project.If Aufforderung zur Ansicht der Aufgabe kam von einer E-Mail, die Herkunft der E-Mail muss verifiziert werden -oder- das Gerät für mehrere Konten verwendet wird, wird das Token nicht bleiben. Wenn die API nicht ordnungsgemäß verwendet wird, wird sie für kurze Zeit funktionieren und dann fehlschlagen.

+0

Ich glaube nicht, dass dies das Problem ist, dem ich gegenüberstehe - das Tool hat eine statische Produktions-URL und es funktioniert konsistent von der gleichen URL. Ich habe jetzt festgestellt, dass die Zugriffstokens nach einer Stunde ablaufen, und während die JS-Bibliothek diese automatisch aktualisieren soll, passiert das möglicherweise nicht korrekt, wenn der Computer im Ruhezustand oder offline ist. Ich schaue auf https: // stackoverflow.com/questions/32150845/how-to-refresh-expired-google-anmelden-logins jetzt als eine Möglichkeit, eine Aktualisierung erzwingen, wenn das Token abgelaufen ist! –

0

Dies kann nützlich sein, in der authflow, Sie haben keinen Rahmen oder ID in Optionen

/** * 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; } 
0

Ich glaube How to refresh expired google sign-in logins? die Antwort hatte ich brauchte. Da alle meine API-Aufrufe gleichzeitig ablaufen, habe ich ein neues Date() hinzugefügt, wenn die Seite geladen wird, ein zweites neues Date(), wenn der Submission Flow beginnt, und wenn sie mehr als 45 Minuten (2.700.700ms) auseinander liegen, verwende ich gapi .auth2.getAuthInstance(). currentUser.get(). reloadAuthResponse(), um eine Aktualisierung des Zugriffstokens zu erzwingen, wie unter https://developers.google.com/identity/sign-in/web/reference#googleuserreloadauthresponse dokumentiert.

Hoffentlich wird Google schließlich ihre Dokumentation aktualisieren, um diesen jetzt notwendigen Schritt bei der Verwendung des Auth2-Flusses gegenüber dem älteren Auth-Fluss widerzuspiegeln.

Die Zeit wird zeigen, ob dies tatsächlich das Problem gelöst hat, aber ich bin hoffnungsvoll!

Verwandte Themen