Aby korzystać z usług Google w imieniu użytkownika, gdy jest on offline, musisz korzystać z hybrydowego procesu po stronie serwera, gdzie użytkownik autoryzuje aplikację po stronie klienta za pomocą klienta JavaScript API i wysyła na Twój serwer specjalny jednorazowy kod autoryzacji. Serwer wymienia ten jednorazowy kod, aby uzyskać od Google własne tokeny dostępu i odświeżenia, które pozwalają serwerowi na wywoływanie własnych interfejsów API. Takie płatności można wykonywać, gdy użytkownik jest offline. Ten jednorazowy przepływ kodu ma zalety zarówno w obrębie czystego przepływu po stronie serwera, jak i w ramach wysyłania tokenów dostępu do serwera.
Poniżej znajdziesz proces logowania, który pozwala uzyskać token dostępu aplikacji po stronie serwera.
Kody jednorazowe mają kilka zalet. Dzięki kodom Google dostarcza tokeny bezpośrednio do Twojego serwera bez żadnych pośredników. Chociaż nie zalecamy usuwania kodów, są one bardzo trudne w użyciu bez Twojego tajnego klucza klienta. Tajny klucz klienta.
Wdrażanie jednorazowego kodu
Przycisk Logowanie przez Google zawiera token dostępu i kod autoryzacji. Jest to jednorazowy kod, który Twój serwer może wymienić z serwerem Google na token dostępu.
Poniższy przykładowy kod pokazuje, jak wykonać przepływ kodu jednorazowego.
Uwierzytelnianie za pomocą jednorazowego kodu podczas logowania przez Google wymaga:
Krok 1. Utwórz identyfikator klienta i tajny klucz klienta
Aby utworzyć identyfikator klienta i tajny klucz klienta, utwórz projekt w Konsoli interfejsów API Google, skonfiguruj identyfikator klienta OAuth i zarejestruj źródła JavaScript:
Otwórz konsolę interfejsów API Google.
W menu projektu wybierz istniejący projekt lub utwórz nowy, klikając Utwórz nowy projekt.
Na pasku bocznym w sekcji „Interfejsy API i usługi” wybierz Dane logowania, a następnie kliknij Skonfiguruj ekran zgody.
Wybierz adres e-mail, określ nazwę produktu i kliknij Zapisz.
Na karcie Dane logowania wybierz listę Utwórz dane logowania i kliknij Identyfikator klienta OAuth.
W sekcji Typ aplikacji wybierz Aplikacja internetowa.
Zarejestruj w ten sposób źródła, z których Twoja aplikacja ma dostęp do interfejsów API Google. Źródło to unikalna kombinacja protokołu, nazwy hosta i portu.
W polu Autoryzowane źródła JavaScriptu wpisz źródło aplikacji. Możesz podać wiele źródeł, aby aplikacja mogła działać w różnych protokołach, domenach i subdomenach. Nie można w nich używać symboli wieloznacznych. W poniższym przykładzie drugi adres URL może być adresem produkcyjnym.
http://localhost:8080 https://myproductionurl.example.com
Pole Identyfikator autoryzowanego przekierowania nie wymaga wartości. Identyfikatory URI przekierowań nie są używane w interfejsach API JavaScript.
Naciśnij przycisk Utwórz.
Skopiuj identyfikator klienta z wyświetlonego okna Klient OAuth. Identyfikator klienta umożliwia Twojej aplikacji dostęp do włączonych interfejsów API Google.
Krok 2. Dodaj bibliotekę platformy Google do swojej strony
Dołącz te skrypty: włącz funkcję anonimową, która wstawia skrypt do interfejsu DOM tej strony internetowej index.html
.
<!-- 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 -->
Krok 3. Zainicjuj obiekt GoogleAuth
Załaduj bibliotekę auth2 i wywołaj gapi.auth2.init()
, aby zainicjować obiekt GoogleAuth
. Określ identyfikator klienta i zakresy, które mają być żądane podczas wywoływania init()
.
<!-- 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>
Krok 4. Dodaj przycisk logowania do strony
Dodaj przycisk logowania do swojej strony internetowej i dołącz moduł obsługi kliknięć, by wywołać grantOfflineAccess()
i rozpocząć przepływ jednorazowego kodu.
<!-- 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>
Krok 5. Zaloguj się na konto użytkownika
Użytkownik klika przycisk logowania i przyznaje aplikacji dostęp do wybranych przez Ciebie uprawnień. Potem funkcja wywołania zwrotnego określona w metodzie grantOfflineAccess().then()
jest przekazywana do obiektu JSON z kodem autoryzacji. Na przykład:
{"code":"4/yU4cQZTMnnMtetyFcIWNItG32eKxxxgXXX-Z4yyJJJo.4qHskT-UtugceFc0ZRONyF4z7U4UmAI"}
Krok 6. Wyślij kod autoryzacji na serwer
code
to jednorazowy kod, który Twój serwer może wymienić na własny token dostępu i token odświeżania. Token odświeżania możesz uzyskać dopiero po wyświetleniu użytkownikowi okna z prośbą o dostęp offline.
Jeśli w kroku 4 określono select-account
prompt
OfflineAccessOptions
, musisz zapisać token odświeżania, który będzie potrzebny do późniejszego użycia, ponieważ kolejne giełdy będą zwracać null
dla tokena odświeżania. Ten proces zapewnia większe bezpieczeństwo niż standardowy proces OAuth 2.0.
Tokeny dostępu są zawsze zwracane wraz z wymianą prawidłowego kodu autoryzacji.
Ten skrypt definiuje funkcję wywołania zwrotnego przycisku logowania. Po udanym logowaniu funkcja przechowuje token dostępu do użycia po stronie klienta i wysyła jednorazowy kod na Twój serwer w tej samej domenie.
<!-- 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>
Krok 7. Wymień kod autoryzacji tokena dostępu
Na serwerze zamień kod uwierzytelniania na tokeny dostępu i odświeżania. Używaj tokena dostępu do wywoływania interfejsów API Google w imieniu użytkownika i opcjonalnie przechowuj token odświeżania w celu uzyskania nowego tokena dostępu po wygaśnięciu.
Jeśli poprosisz o dostęp do profilu, otrzymasz też token tożsamości zawierający podstawowe informacje profilowe użytkownika.
Na przykład:
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']