Wenn Sie Google-Dienste im Namen eines Nutzers verwenden möchten, der offline ist, müssen Sie Einen hybriden serverseitigen Ablauf verwenden, bei dem ein Nutzer Ihre App auf dem Client autorisiert JavaScript-API-Client verwenden und eine spezielle einmalige Autorisierungscode auf Ihren Server übertragen. Dein Server tauscht diese einmalige Verwendung aus , um eigene Zugriffs- und Aktualisierungstokens von Google zu erhalten, damit der Server in der Lage sein, eigene API-Aufrufe zu starten, die offline durchgeführt werden können. Dieser einmalige Codefluss bietet Sicherheitsvorteile gegenüber einem reinen serverseitigen Prozess. und das Senden von Zugriffstokens an Ihren Server.
Anmeldevorgang zum Abrufen eines Zugriffstokens für Ihre serverseitige Instanz ist unten dargestellt.
Einmalcodes bieten mehrere Sicherheitsvorteile. Mit Codes werden Google stellt Tokens direkt und ohne Mittler für Ihren Server bereit. Wir raten von gehackten Codes ab, sind aber sehr schwer zu verwenden. ohne den Clientschlüssel. Bewahren Sie Ihren Clientschlüssel auf.
Einmalcode-Vorgang implementieren
Die Google Log-in-Schaltfläche stellt ein Zugriffstoken und ein Autorisierungscode. Der Code ist ein Einmalcode, den Ihr Server austauschen kann mit den Google-Servern um ein Zugriffstoken.
Der folgende Beispielcode zeigt, wie die mit einmaligem Code.
Für die Authentifizierung von Google Log-in mit Einmalcode sind folgende Schritte erforderlich:
Schritt 1: Client-ID und Clientschlüssel erstellen
Um eine Client-ID und einen Clientschlüssel zu erstellen, erstellen Sie ein Google API Console-Projekt, Richten Sie eine OAuth-Client-ID ein und registrieren Sie Ihre JavaScript-Quellen:
Gehen Sie zur Google API Console.
Wählen Sie aus der Projekt-Drop-down-Liste ein vorhandenes Projekt aus oder erstellen Sie ein neues. indem Sie Neues Projekt erstellen auswählen.
In der Seitenleiste unter „APIs und Dienste" auf, wählen Sie Anmeldedaten aus und klicken Sie auf Zustimmungsbildschirm konfigurieren
Wählen Sie eine E-Mail-Adresse aus, geben Sie einen Produktnamen an und klicken Sie auf Speichern.
Wählen Sie auf dem Tab Anmeldedaten das Drop-down-Menü Anmeldedaten erstellen aus. und wählen Sie OAuth-Client-ID aus.
Wählen Sie unter Anwendungstyp die Option Webanwendung aus.
Registrieren Sie die Quellen, aus denen Ihre App auf die Google APIs wie im Folgenden beschrieben. Ein Ursprung ist eine eindeutige Kombination aus Protokoll, Hostname und Port.
Geben Sie im Feld Autorisierte JavaScript-Quellen den Ursprung für für Ihre App. Du kannst mehrere Ursprünge eingeben, an denen deine App ausgeführt werden kann Protokolle, Domains oder Subdomains. Sie können keine Platzhalter verwenden. Im folgenden Beispiel könnte die zweite URL eine Produktions-URL sein.
http://localhost:8080 https://myproductionurl.example.com
Das Feld Autorisierter Weiterleitungs-URI erfordert keinen Wert. Weiterleitung URIs werden nicht mit JavaScript APIs verwendet.
Klicken Sie auf die Schaltfläche Erstellen.
Kopieren Sie im daraufhin angezeigten Dialogfeld OAuth-Client die Client-ID. Die Mit der Client-ID kann Ihre App auf aktivierte Google APIs zugreifen.
Schritt 2: Google-Plattformbibliothek in Ihre Seite einbinden
Fügen Sie die folgenden Skripts ein, die eine anonyme Funktion veranschaulichen, die
fügt ein Script in das DOM dieser index.html
-Webseite ein.
<!-- The top of file index.html -->
<html itemscope itemtype="http://schema.org/Article">
<head>
<!-- BEGIN Pre-requisites -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">
</script>
<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer>
</script>
<!-- END Pre-requisites -->
Schritt 3: GoogleAuth-Objekt initialisieren
Laden Sie die auth2-Bibliothek und rufen Sie gapi.auth2.init()
auf, um die
GoogleAuth
-Objekt. Geben Sie Ihre Client-ID und die Bereiche an, die Sie anfordern möchten
wenn du init()
aufrufst.
<!-- Continuing the <head> section -->
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'YOUR_CLIENT_ID.apps.googleusercontent.com',
// Scopes to request in addition to 'profile' and 'email'
//scope: 'additional_scope'
});
});
}
</script>
</head>
<body>
<!-- ... -->
</body>
</html>
Schritt 4: Anmeldeschaltfläche zu Ihrer Seite hinzufügen
Fügen Sie die Anmeldeschaltfläche zu Ihrer Webseite hinzu und hängen Sie einen Klick-Handler an, um den Aufruf
grantOfflineAccess()
um den Vorgang mit einmaligem Code zu starten.
<!-- Add where you want your sign-in button to render -->
<!-- Use an image that follows the branding guidelines in a real app -->
<button id="signinButton">Sign in with Google</button>
<script>
$('#signinButton').click(function() {
// signInCallback defined in step 6.
auth2.grantOfflineAccess().then(signInCallback);
});
</script>
Schritt 5: Nutzer anmelden
Der Nutzer klickt auf die Anmeldeschaltfläche und gewährt Ihrer App Zugriff auf die Berechtigungen.
die Sie angefordert haben. Dann wird die Callback-Funktion, die Sie in der
grantOfflineAccess().then()
wird ein JSON-Objekt mit einem
Autorisierungscode. Beispiel:
{"code":"4/yU4cQZTMnnMtetyFcIWNItG32eKxxxgXXX-Z4yyJJJo.4qHskT-UtugceFc0ZRONyF4z7U4UmAI"}
Schritt 6: Autorisierungscode an den Server senden
Die code
ist Ihr Einmalcode, den Ihr Server gegeneinander austauschen kann
Zugriffstoken und Aktualisierungstoken. Sie können ein Aktualisierungstoken erst nach dem
Dem Nutzer wurde ein Dialogfeld für die Autorisierung angezeigt, in dem er Offlinezugriff anfordert.
Wenn Sie die select-account
prompt
im Feld
OfflineAccessOptions
In Schritt 4 müssen Sie das Aktualisierungstoken speichern, das Sie zur späteren Verwendung abrufen.
da nachfolgende Anzeigenplattformen null
für das Aktualisierungstoken zurückgeben. Dieser Ablauf
bietet erhöhte Sicherheit gegenüber dem standardmäßigen OAuth 2.0-Vorgang.
Zugriffstokens werden immer beim Austausch einer gültigen Autorisierung zurückgegeben. Code.
Das folgende Skript definiert eine Callback-Funktion für die Anmeldeschaltfläche. Wann? eine Anmeldung erfolgreich ist, speichert die Funktion das Zugriffstoken und sendet den einmaligen Code an Ihren Server in derselben Domain.
<!-- Last part of BODY element in file index.html -->
<script>
function signInCallback(authResult) {
if (authResult['code']) {
// Hide the sign-in button now that the user is authorized, for example:
$('#signinButton').attr('style', 'display: none');
// Send the code to the server
$.ajax({
type: 'POST',
url: 'http://example.com/storeauthcode',
// Always include an `X-Requested-With` header in every AJAX request,
// to protect against CSRF attacks.
headers: {
'X-Requested-With': 'XMLHttpRequest'
},
contentType: 'application/octet-stream; charset=utf-8',
success: function(result) {
// Handle or verify the server response.
},
processData: false,
data: authResult['code']
});
} else {
// There was an error.
}
}
</script>
Schritt 7: Autorisierungscode gegen Zugriffstoken austauschen
Tauschen Sie den Autorisierungscode auf dem Server gegen Zugriffs- und Aktualisierungstoken aus. Verwenden Sie die Methode Zugriffstoken, um Google APIs im Namen des Nutzers aufzurufen und optional zu speichern Das Aktualisierungstoken, um nach Ablauf des Zugriffstokens ein neues Zugriffstoken zu erhalten.
Wenn Sie den Profilzugriff angefordert haben, erhalten Sie auch ein ID-Token, das grundlegende Profilinformationen für den Nutzer.
Beispiel:
Java
// (Receive authCode via HTTPS POST) if (request.getHeader("X-Requested-With") == null) { // Without the `X-Requested-With` header, this request could be forged. Aborts. } // Set path to the Web application client_secret_*.json file you downloaded from the // Google API Console: https://console.cloud.google.com/apis/credentials // You can also find your Web application client ID and client secret from the // console and specify them directly when you create the GoogleAuthorizationCodeTokenRequest // object. String CLIENT_SECRET_FILE = "/path/to/client_secret.json"; // Exchange auth code for access token GoogleClientSecrets clientSecrets = GoogleClientSecrets.load( JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE)); GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( new NetHttpTransport(), JacksonFactory.getDefaultInstance(), "https://oauth2.googleapis.com/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) // Specify the same redirect URI that you use with your web // app. If you don't have a web version of your app, you can // specify an empty string. .execute(); String accessToken = tokenResponse.getAccessToken(); // Use access token to call API GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); Drive drive = new Drive.Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential) .setApplicationName("Auth Code Exchange Demo") .build(); File file = drive.files().get("appfolder").execute(); // Get profile info from ID token GoogleIdToken idToken = tokenResponse.parseIdToken(); GoogleIdToken.Payload payload = idToken.getPayload(); String userId = payload.getSubject(); // Use this value as a key to identify a user. String email = payload.getEmail(); boolean emailVerified = Boolean.valueOf(payload.getEmailVerified()); String name = (String) payload.get("name"); String pictureUrl = (String) payload.get("picture"); String locale = (String) payload.get("locale"); String familyName = (String) payload.get("family_name"); String givenName = (String) payload.get("given_name");
Python
from apiclient import discovery import httplib2 from oauth2client import client # (Receive auth_code by HTTPS POST) # If this request does not have `X-Requested-With` header, this could be a CSRF if not request.headers.get('X-Requested-With'): abort(403) # Set path to the Web application client_secret_*.json file you downloaded from the # Google API Console: https://console.cloud.google.com/apis/credentials CLIENT_SECRET_FILE = '/path/to/client_secret.json' # Exchange auth code for access token, refresh token, and ID token credentials = client.credentials_from_clientsecrets_and_code( CLIENT_SECRET_FILE, ['https://www.googleapis.com/auth/drive.appdata', 'profile', 'email'], auth_code) # Call Google API http_auth = credentials.authorize(httplib2.Http()) drive_service = discovery.build('drive', 'v3', http=http_auth) appfolder = drive_service.files().get(fileId='appfolder').execute() # Get profile info from ID token userid = credentials.id_token['sub'] email = credentials.id_token['email']