Sunucu tarafı uygulamalar için Google ile Oturum Açma

Bir kullanıcı çevrimdışıyken Google hizmetlerini bir kullanıcı adına kullanmak için: Kullanıcının istemcide uygulamanızı yetkilendirdiği karma bir sunucu tarafı akış kullanmak ve JavaScript API istemcisini kullanarak bir defaya mahsus özel bir yetkilendirme kodunu sunucunuza gönderin. Sunucunuz bu tek seferlik kullanım için alışveriş yapar ve sunucu için yeni jetonları yenilemesi için kullanılacak koda Kullanıcı çevrimdışıyken kendi API çağrılarını yapabilir. Bu tek seferlik kod akışının, hem sunucu tarafındaki ve sunucunuza erişim jetonları göndererek verilerinizi kontrol etmenizi sağlar.

Sunucu tarafı için erişim jetonu almaya yönelik oturum açma akışı aşağıdaki görselde yer almaktadır.

Tek kullanımlık kodların çeşitli güvenlik avantajları vardır. Kodlarla Google jetonları herhangi bir aracı olmadan doğrudan sunucunuza sağlar. Kodların sızdırılmasını önermesek de bunların kullanımı çok zordur. gizli anahtarı kullanabilirsiniz. İstemci sırlarını saklı tutun!

Tek seferlik kod akışını uygulama

Google ile Oturum Açma düğmesi hem bir erişim jetonu hem de bir yetkilendirme kodu kullanabilirsiniz. Bu kod, sunucunuzun değiştirebileceği tek seferlik bir koddur. Google sunucularıyla iletişim kurmanız gerekiyor.

Aşağıdaki örnek kod, tek seferlik kod akışı.

Google ile Oturum Açma özelliğini tek seferlik kod akışıyla doğrulamak için şunları yapmanız gerekir:

1. Adım: İstemci kimliği ve istemci gizli anahtarı oluşturun

İstemci kimliği ve istemci gizli anahtarı oluşturmak için bir Google API Konsolu projesi oluşturun. OAuth istemci kimliği oluşturun ve JavaScript kaynaklarınızı kaydedin:

  1. Google API Konsolu'na gidin.

  2. Proje açılır menüsünden mevcut bir projeyi seçin veya yeni bir proje oluşturun Yeni proje oluştur'u seçin.

  3. "API'ler ve Hizmetler"i tıklayın, Kimlik Bilgileri'ni seçin ve ardından İzin ekranını yapılandırın.

    Bir e-posta adresi seçin, bir ürün adı belirtin ve Kaydet'e basın.

  4. Credentials (Kimlik bilgileri) sekmesinde, Create credentials (Kimlik bilgileri oluştur) açılır menüsünü seçin. listesine girin ve OAuth istemci kimliği'ni seçin.

  5. Uygulama türü bölümünde Web uygulaması'nı seçin.

    Uygulamanızın şunlara erişmesine izin verilen kaynakları kaydedin: Google API'lerini kullanabilirsiniz. Kaynak, protokol ve ana makine adı ve bağlantı noktası.

    1. Yetkilendirilmiş JavaScript kaynakları alanına, en iyi şekilde yararlanabilirsiniz. Uygulamanızın çalışmasına izin vermek için birden fazla kaynak girebilirsiniz farklı protokoller, alanlar veya alt alan adları kullanır. Joker karakterler kullanamazsınız. Aşağıdaki örnekte, ikinci URL bir üretim URL'si olabilir.

      http://localhost:8080
      https://myproductionurl.example.com
      
    2. Yetkili yönlendirme URI'si alanı bir değer gerektirmez. Yönlendir URI'lar, JavaScript API'leriyle kullanılmaz.

    3. Oluştur düğmesine basın.

  6. Karşınıza çıkan OAuth istemcisi iletişim kutusunda, İstemci Kimliği'ni kopyalayın. İlgili içeriği oluşturmak için kullanılan İstemci kimliği, uygulamanızın etkin Google API'lerine erişmesini sağlar.

2. Adım: Google platform kitaplığını sayfanıza ekleyin

Aşağıdaki komut dosyalarını kullanarak aşağıdaki anonim bir işlevi gösteren bu index.html web sayfasının DOM'sine bir komut dosyası ekler.

<!-- 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 -->

3. Adım: GoogleAuth nesnesini başlatın

auth2 kitaplığını yükleyin vegapi.auth2.init() GoogleAuth nesne algılandı. İstemci kimliğinizi ve istekte bulunmak istediğiniz kapsamları belirtin init() numaralı telefonu aradığınızda.

<!-- 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>

4. Adım: Oturum açma düğmesini sayfanıza ekleyin

Web sayfanıza oturum açma düğmesini ve arama yapmak için bir tıklama işleyici ekleyin grantOfflineAccess() tek seferlik kod akışını başlatın.

<!-- 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>

5. adım: Kullanıcının oturum açın

Kullanıcı oturum açma düğmesini tıklar ve uygulamanızın izinlere erişmesine izin verir isteyebilirsiniz. Bu durumda, grantOfflineAccess().then() yöntemi, yetkilendirme kodu. Örneğin:

{"code":"4/yU4cQZTMnnMtetyFcIWNItG32eKxxxgXXX-Z4yyJJJo.4qHskT-UtugceFc0ZRONyF4z7U4UmAI"}

6. Adım: Yetkilendirme kodunu sunucuya gönderin

code, sunucunuzun kendi yerine kullanabileceği tek seferlik kodunuzdur. erişim jetonu ve yenileme jetonu. Yenileme jetonu yalnızca kullanıcıya çevrimdışı erişim isteğinde bulunan bir yetkilendirme iletişim kutusu gösteriliyor. Şurada select-account prompt belirttiyseniz: OfflineAccessOptions (4. adımda), aldığınız yenileme jetonunu daha sonra kullanmak üzere saklamanız gerekir. çünkü sonraki exchange'ler yenileme jetonu için null değerini döndürecektir. Bu akış standart OAuth 2.0 akışınıza göre daha fazla güvenlik sağlar.

Erişim jetonları her zaman geçerli bir yetkilendirme karşılığında döndürülür girin.

Aşağıdaki komut dosyası, oturum açma düğmesi için bir geri çağırma işlevi tanımlar. Zaman oturum açma başarılı olursa işlev, istemci tarafı için erişim jetonunu depolar kullanır ve tek seferlik kodu aynı alan adındaki sunucunuza gönderir.

<!-- 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>

7. Adım: Erişim jetonu için yetkilendirme kodunu değiştirin

Sunucuda, erişim ve yenileme jetonları için yetkilendirme kodunu değiştirin. Şunu kullanın: kullanıcı adına Google API'lerini çağırmak ve isteğe bağlı olarak erişim jetonunun süresi dolduğunda yeni bir erişim jetonu almak için yenileme jetonunu kullanın.

Profil erişimi isteğinde bulunduysanız temel bilgileri içeren bir kimlik jetonu da alırsınız. kullanıcının profil bilgileri.

Örneğin:

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']